CMakeLists.txt (9,276 bytes)
2018-09-29 21:30
cmake_minimum_required (VERSION 2.6)
project (libwapcaplet)
include(GNUInstallDirs)
include(FindPkgConfig)
enable_testing()
include( CTest )
#Obligitory version and copyright for pkg-config file and version info
#as well as possibly, automated installers.
set(WAPCAPLET_COMPONENT_NAME "wapcaplet")
set(WAPCAPLET_AUTHOR "John-Mark Bell <jmb@netsurf-browser.org>")
set(WAPCAPLET_COPYRIGHT "Copyright 2009-2015 John-Mark Bell <jmb@netsurf-browser.org>")
set(WAPCAPLET_DESCRIPTION "String internalisation dictionary")
set(WAPCAPLET_VERSION_MAJOR 0)
set(WAPCAPLET_VERSION_MINOR 4)
set(WAPCAPLET_VERSION_PATCH 1)
set(WAPCAPLET_SOVERSION ${WAPCAPLET_VERSION_MAJOR}.${WAPCAPLET_VERSION_MINOR}.${WAPCAPLET_VERSION_PATCH})
#Do not prefix BUILD_SHARED_LIBS and BUILD_STATIC_LIBS because those are standard cmake options
#We only put them in the menu for convenience.
option(BUILD_SHARED_LIBS "Build shared libraries" ON)
option(BUILD_STATIC_LIBS "Build static libraries" ON)
option(WAPCAPLET_WITH_PKGCONFIG_SUPPORT "Generate and install .pc files" ON)
if(CMAKE_COMPILER_IS_GNUCC)
set(WAPCAPLET_WARNFLAGS -Wall -W -Wundef -Wpointer-arith -Wcast-align
-Wwrite-strings -Wstrict-prototypes -Wmissing-prototypes
-Wmissing-declarations -Wnested-externs)
endif(CMAKE_COMPILER_IS_GNUCC)
set(WAPCAPLET_BUILD_DIR ${CMAKE_CURRENT_BINARY_DIR})
set(WAPCAPLET_ADDITIONAL_C_FILES
${CMAKE_SOURCE_DIR}/src/libwapcaplet.c)
set(WAPCAPLET_PUBLIC_HEADER_FILES
include/libwapcaplet/libwapcaplet.h)
include_directories(${CMAKE_SOURCE_DIR}/src ${CMAKE_SOURCE_DIR}/include)
# setup any additional libs required by this.
set(WAPCAPLET_ADDITIONAL_LIBS "")
set(WAPCAPLET_ADDITIONAL_DIRS "")
set(WAPCAPLET_ADDITIONAL_DEFS "")
# From: https://gitlab.kitware.com/cmake/community/wikis/contrib/macros/TestInline
# Inspired from /usr/share/autoconf/autoconf/c.m4
# I put it here to replace the GCCISM inline="__inline__"
set(TEST_C "/* Test source lifted from /usr/share/autoconf/autoconf/c.m4 */
typedef int foo_t;
static inline foo_t static_foo(){return 0;}
foo_t foo(){return 0;}
int main(int argc, char *argv[]){return 0;}")
file(WRITE ${CMAKE_CURRENT_BINARY_DIR}/test_inline.c "${TEST_C}")
FOREACH(KEYWORD "inline" "__inline__" "__inline")
IF(NOT DEFINED C_INLINE)
TRY_COMPILE(C_HAS_${KEYWORD} "${CMAKE_CURRENT_BINARY_DIR}"
"${CMAKE_CURRENT_BINARY_DIR}/test_inline.c"
COMPILE_DEFINITIONS "-Dinline=${KEYWORD}")
IF(C_HAS_${KEYWORD})
SET(C_INLINE TRUE)
ADD_DEFINITIONS("-Dinline=${KEYWORD}")
ENDIF(C_HAS_${KEYWORD})
ENDIF(NOT DEFINED C_INLINE)
ENDFOREACH(KEYWORD)
IF(NOT DEFINED C_INLINE)
ADD_DEFINITIONS("-Dinline=")
ENDIF(NOT DEFINED C_INLINE)
file(REMOVE ${CMAKE_CURRENT_BINARY_DIR}/test_inline.c)
if(BUILD_SHARED_LIBS)
if(CMAKE_RC_COMPILER)
# Make .rc file
set(WAPCAPLETRC_CONTENTS "1 VERSIONINFO
FILEVERSION ${WAPCAPLET_VERSION_MAJOR},${WAPCAPLET_VERSION_MINOR},${WAPCAPLET_VERSION_PATCH},0
PRODUCTVERSION ${WAPCAPLET_VERSION_MAJOR},${WAPCAPLET_VERSION_MINOR},${WAPCAPLET_VERSION_PATCH},0
BEGIN
BLOCK \"StringFileInfo\"
BEGIN
BLOCK \"040904E4\"
BEGIN
VALUE \"CompanyName\", \"${WAPCAPLET_AUTHOR}\"
VALUE \"FileDescription\", \"${WAPCAPLET_DESCRIPTION}\"
VALUE \"FileVersion\", \"${WAPCAPLET_VERSION_MAJOR}.${WAPCAPLET_VERSION_MINOR}.${WAPCAPLET_VERSION_PATCH}\"
VALUE \"InternalName\", \"${CMAKE_SHARED_MODULE_PREFIX}${WAPCAPLET_COMPONENT_NAME}\"
VALUE \"LegalCopyright\", \"${WAPCAPLET_COPYRIGHT}\"
VALUE \"OriginalFilename\", \"${CMAKE_SHARED_MODULE_PREFIX}${WAPCAPLET_COMPONENT_NAME}${CMAKE_SHARED_LIBRARY_SUFFIX}\"
VALUE \"ProductName\", \"${WAPCAPLET_COMPONENT_NAME}\"
VALUE \"ProductVersion\", \"${WAPCAPLET_VERSION_MAJOR}.${WAPCAPLET_VERSION_MINOR}.${WAPCAPLET_VERSION_PATCH}\"
END
END
BLOCK \"VarFileInfo\"
BEGIN
VALUE \"Translation\", 0x409, 1252
END
END")
FILE(WRITE ${WAPCAPLET_BUILD_DIR}/lib${WAPCAPLET_COMPONENT_NAME}.rc "${WAPCAPLETRC_CONTENTS}")
add_library(libwapcatlet_shared SHARED ${WAPCAPLET_PUBLIC_HEADER_FILES} ${WAPCAPLET_ADDITIONAL_C_FILES} ${WAPCAPLET_BUILD_DIR}/lib${WAPCAPLET_COMPONENT_NAME}.rc)
else()
add_library(libwapcatlet_shared SHARED ${WAPCAPLET_PUBLIC_HEADER_FILES} ${WAPCAPLET_ADDITIONAL_C_FILES} SOVERSION ${WAPCAPLET_SOVERSION})
endif()
set_target_properties(libwapcatlet_shared PROPERTIES OUTPUT_NAME ${WAPCAPLET_COMPONENT_NAME})
if(CMAKE_COMPILER_IS_GNUCC)
target_compile_options(libwapcatlet_shared PRIVATE ${WAPCAPLET_WARNFLAGS})
endif(CMAKE_COMPILER_IS_GNUCC)
if(WAPCAPLET_ADDITIONAL_LIBS)
target_link_libraries(libwapcatlet_shared PUBLIC ${WAPCAPLET_ADDITIONAL_LIBS})
endif(WAPCAPLET_ADDITIONAL_LIBS)
if(WAPCAPLET_ADDITIONAL_DIRS)
target_include_directories(libwapcatlet_shared PUBLIC ${WAPCAPLET_ADDITIONAL_DIRS})
endif(WAPCAPLET_ADDITIONAL_DIRS)
if(WAPCAPLET_ADDITIONAL_DEFS)
target_include_directories(libwapcatlet_shared PUBLIC ${WAPCAPLET_ADDITIONAL_DEFS})
endif(WAPCAPLET_ADDITIONAL_DEFS)
install(TARGETS libwapcatlet_shared
RUNTIME DESTINATION bin
LIBRARY DESTINATION lib
ARCHIVE DESTINATION lib)
endif(BUILD_SHARED_LIBS)
if(BUILD_STATIC_LIBS)
add_library(libwapcatlet_static STATIC ${WAPCAPLETPUBLIC_HEADER_FILES} ${WAPCAPLET_ADDITIONAL_C_FILES})
set_target_properties(libwapcatlet_static PROPERTIES OUTPUT_NAME ${WAPCAPLET_COMPONENT_NAME})
if(WAPCAPLET_ADDITIONAL_LIBS)
target_link_libraries(libwapcatlet_static PUBLIC ${WAPCAPLET_ADDITIONAL_LIBS})
endif(WAPCAPLET_ADDITIONAL_LIBS)
if(WAPCAPLET_ADDITIONAL_DIRS)
target_include_directories(libwapcatlet_static PUBLIC ${WAPCAPLET_ADDITIONAL_DIRS})
endif(WAPCAPLET_ADDITIONAL_DIRS)
if(WAPCAPLET_ADDITIONAL_DEFS)
target_include_directories(libwapcatlet_static PUBLIC ${WAPCAPLET_ADDITIONAL_DEFS})
endif(WAPCAPLET_ADDITIONAL_DEFS)
if(CMAKE_COMPILER_IS_GNUCC)
target_compile_options(libwapcatlet_static PRIVATE ${WAPCAPLET_WARNFLAGS})
endif(CMAKE_COMPILER_IS_GNUCC)
install(TARGETS libwapcatlet_static
RUNTIME DESTINATION bin
LIBRARY DESTINATION lib
ARCHIVE DESTINATION lib)
endif(BUILD_STATIC_LIBS)
#from: https://cmake.org/pipermail/cmake/2010-October/040246.html
#This installs the headers into our hierarchy in the include file.
foreach(WAPCAPLET_HEADER ${WAPCAPLET_PUBLIC_HEADER_FILES})
string(REGEX MATCH "(.*)[/\\]" WAPCAPLETDIR ${WAPCAPLET_HEADER})
install(FILES ${WAPCAPLET_HEADER} DESTINATION ${WAPCAPLETDIR})
endforeach(WAPCAPLET_HEADER ${WAPCAPLET_PUBLIC_HEADER_FILES})
if(WAPCAPLET_WITH_PKGCONFIG_SUPPORT)
set(WAPCAPLET_PC ${WAPCAPLET_BUILD_DIR}/lib${WAPCAPLET_COMPONENT_NAME}.pc)
# This stuff is necessary to ensure that the dependency list
# in our .pc file is in the proper format
#Make pkg-config
set(WAPCAPLET_PC_EXC "${CMAKE_INSTALL_PREFIX}")
set(WAPCAPLET_PC_INC "${CMAKE_INSTALL_FULL_INCLUDEDIR}")
set(WAPCAPLET_PC_LIB "${CMAKE_INSTALL_FULL_LIBDIR}")
if("${WAPCAPLET_PC_EXC}" STREQUAL "${CMAKE_INSTALL_PREFIX}")
set(WAPCAPLET_PC_EXC "\${prefix}")
endif()
if ("${WAPCAPLET_PC_INC}" STREQUAL "${CMAKE_INSTALL_PREFIX}/include")
set(WAPCAPLET_PC_INC "\${prefix}/include")
endif()
if ("${WAPCAPLET_PC_LIB}" STREQUAL "${CMAKE_INSTALL_PREFIX}/lib")
set(WAPCAPLET_PC_LIB "\${exec_prefix}/lib")
endif()
set(WAPCAPLET_PKGCONF_WAPCAPLETDEPS "")
foreach(WAPCAPLETLIB_DEP ${WAPCAPLETLIB_DEPEND_LIBS})
set(WAPCAPLET_PKGCONF_WAPCAPLETDEPS "${WAPCAPLET_PKGCONF_WAPCAPLETDEPS} -l${WAPCAPLETLIB_DEP}")
endforeach(WAPCAPLETLIB_DEP)
set(WAPCAPLET_PKGCONFIG_CONTENTS "prefix=${CMAKE_INSTALL_PREFIX}
exec_prefix=${WAPCAPLET_PC_EXC}
libdir=${WAPCAPLET_PC_LIB}
includedir=${WAPCAPLET_PC_INC}
Name: lib${WAPCAPLET_COMPONENT_NAME}
Description: ${WAPCAPLET_DESCRIPTION}
URL: http://www.netsurf-browser.org/projects/${WAPCAPLET_COMPONENT_NAME}/
Version: ${WAPCAPLET_SOVERSION}
Requires: libparserutils
Cflags: -I\${includedir}
Libs: -L\${libdir} -l${WAPCAPLET_COMPONENT_NAME}
Libs.private: ${WAPCAPLET_PKGCONF_WAPCAPLETDEPS}
")
file(WRITE ${WAPCAPLET_PC} ${WAPCAPLET_PKGCONFIG_CONTENTS})
install(FILES ${WAPCAPLET_PC} DESTINATION ${CMAKE_INSTALL_LIBDIR}/pkgconfig)
endif(WAPCAPLET_WITH_PKGCONFIG_SUPPORT)
#
#Test section
#
#pkg_check_modules
if (BUILD_TESTING)
if(PKG_CONFIG_FOUND)
pkg_check_modules(check check)
endif(PKG_CONFIG_FOUND)
if (check_FOUND)
if(BUILD_SHARED_LIBS)
set(WAPCAPLET_WITH_TESTCFLAGS ${check_CFLAGS})
set(WAPCAPLET_WITH_LIBRARIES ${check_LIBRARIES})
add_executable(testmain_shared ${CMAKE_SOURCE_DIR}/test/testmain.c ${CMAKE_SOURCE_DIR}/test/basictests.c)
target_link_libraries(testmain_shared libwapcatlet_shared ${check_LIBRARIES})
add_test(NAME testrunner_shared COMMAND testmain_shared)
endif(BUILD_SHARED_LIBS)
if(BUILD_STATIC_LIBS)
set(WAPCAPLET_WITH_TESTCFLAGS ${check_CFLAGS})
set(WAPCAPLET_WITH_LIBRARIES ${check_LIBRARIES})
add_executable(testmain_static ${CMAKE_SOURCE_DIR}/test/testmain.c ${CMAKE_SOURCE_DIR}/test/basictests.c)
target_link_libraries(testmain_static libwapcatlet_shared ${check_LIBRARIES})
add_test(NAME testrunner_static COMMAND testmain_shared)
endif(BUILD_STATIC_LIBS)
endif(check_FOUND)
endif(BUILD_TESTING)