diff --git a/CMakeLists.txt b/CMakeLists.txt index 23311d8c..b6885354 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -77,12 +77,6 @@ set(PROJECT_VERSION "${PROJECT_VERSION_MAJOR}.${PROJECT_VERSION_MINOR}.${PROJECT # Provides install directory variables as defined by the GNU Coding Standards. include(GNUInstallDirs) -############################################################################### -# Follow ISO C99 standard -set(CMAKE_C_STANDARD 99) -set(CMAKE_C_STANDARD_REQUIRED ON) -set(CMAKE_C_EXTENSIONS ON) # Use GNU extensions and POSIX standard - ############################################################################### # Option option(CHECK_ENABLE_TESTS @@ -108,22 +102,6 @@ if(CHECK_ENABLE_TIMEOUT_TESTS) else(CHECK_ENABLE_TIMEOUT_TESTS) add_definitions(-DTIMEOUT_TESTS_ENABLED=0) endif(CHECK_ENABLE_TIMEOUT_TESTS) -############################################################################### -# Check system and architecture -if(WIN32) - if(MSVC60) - set(WINVER 0x0400) - else() - set(WINVER 0x0600) - endif() - set(_WIN32_WINNT ${WINVER}) -endif(WIN32) - -if(MSVC) - add_definitions(-D_CRT_SECURE_NO_DEPRECATE) - add_definitions(-D_CRT_SECURE_NO_WARNINGS) - add_definitions(-D_CRT_NONSTDC_NO_WARNINGS) -endif(MSVC) ############################################################################### include(CheckCSourceCompiles) @@ -167,7 +145,9 @@ ck_check_include_file("unistd.h" HAVE_UNISTD_H) ck_check_include_file("pthread.h" HAVE_PTHREAD) # check if we have windows.h on native windows environments -ck_check_include_file("windows.h" HAVE_WINDOWS_H) +IF(WIN32) + ck_check_include_file("windows.h" HAVE_WINDOWS_H) +ENDIF() ############################################################################### # Check functions @@ -244,14 +224,22 @@ if(HAVE_REGEX_H AND HAVE_REGCOMP AND HAVE_REGEXEC) set(ENABLE_REGEX 1) endif() -if (HAVE_PTHREAD) - check_c_compiler_flag("-pthread" HAVE_PTHREADS_FLAG) - if (HAVE_PTHREADS_FLAG) - add_definitions("-pthread") - add_link_options("-pthread") - endif() -endif() +INCLUDE(FindThreads) + +SET(THREADS_PREFER_PTHREAD_FLAG ON) +MESSAGE(STATUS "Prefer -pthread: ${THREADS_PREFER_PTHREAD_FLAG}") + +FIND_PACKAGE(Threads + REQUIRED +) + +IF(Threads_FOUND AND CMAKE_USE_PTHREADS_INIT) + SET(HAVE_PTHREAD 1) +ENDIF() +MESSAGE(STATUS "Threads library found: ${Threads_FOUND}") +MESSAGE(STATUS "PThreads compatible: ${CMAKE_USE_PTHREADS_INIT}") +MESSAGE(STATUS "Win32 Threads: ${CMAKE_USE_WIN32_THREADS_INIT}") ############################################################################### # Check defines @@ -405,9 +393,9 @@ endif (HAVE_SUBUNIT) ############################################################################### # Generate "config.h" from "cmake/config.h.in" -configure_file(${CMAKE_CURRENT_SOURCE_DIR}/cmake/config.h.in - ${CMAKE_CURRENT_BINARY_DIR}/config.h) - # Param @ONLY not used on purpose! +# Param @ONLY not used on purpose! +CONFIGURE_FILE(${CMAKE_SOURCE_DIR}/cmake/config.h.in config.h) + include_directories(BEFORE ${CMAKE_CURRENT_BINARY_DIR}) add_definitions(-DHAVE_CONFIG_H) set(CONFIG_HEADER ${CMAKE_CURRENT_BINARY_DIR}/config.h) @@ -425,13 +413,16 @@ set(CONFIG_HEADER ${CMAKE_CURRENT_BINARY_DIR}/config.h) # # When converting to CMake we also want to abandon the m4 macros. # -configure_file(${CMAKE_CURRENT_SOURCE_DIR}/cmake/check_stdint.h.in - ${CMAKE_CURRENT_BINARY_DIR}/check_stdint.h @ONLY) -if(NOT THIS_IS_SUBPROJECT) - install( - FILES ${CMAKE_CURRENT_BINARY_DIR}/check_stdint.h - DESTINATION ${CMAKE_INSTALL_INCLUDEDIR}) -endif() +CONFIGURE_FILE(${CMAKE_SOURCE_DIR}/cmake/check_stdint.h.in check_stdint.h @ONLY) + +IF(NOT THIS_IS_SUBPROJECT) + INSTALL( + FILES + check_stdint.h + DESTINATION + ${CMAKE_INSTALL_INCLUDEDIR} + ) +ENDIF() ############################################################################### # Generate "check.pc", the package config (pkgconfig) file for libtool @@ -578,4 +569,3 @@ if(NOT THIS_IS_SUBPROJECT) endif() # vim: shiftwidth=2:softtabstop=2:tabstop=2:expandtab:autoindent - diff --git a/lib/CMakeLists.txt b/lib/CMakeLists.txt index 38cbc53e..d74e300f 100644 --- a/lib/CMakeLists.txt +++ b/lib/CMakeLists.txt @@ -19,61 +19,81 @@ # Boston, MA 02111-1307, USA. # - -set(SOURCES libcompat.c) - -set(SOURCES ${SOURCES} fpclassify.c) - -if (NOT HAVE_LIBRT) - set(SOURCES ${SOURCES} clock_gettime.c) - set(SOURCES ${SOURCES} timer_create.c) - set(SOURCES ${SOURCES} timer_delete.c) - set(SOURCES ${SOURCES} timer_settime.c) -endif(NOT HAVE_LIBRT) - -if(NOT HAVE_GETLINE) - set(SOURCES ${SOURCES} getline.c) -endif(NOT HAVE_GETLINE) - -if(NOT HAVE_GETTIMEOFDAY) - set(SOURCES ${SOURCES} gettimeofday.c) -endif(NOT HAVE_GETTIMEOFDAY) - -if(NOT HAVE_DECL_LOCALTIME_R) - set(SOURCES ${SOURCES} localtime_r.c) -endif(NOT HAVE_DECL_LOCALTIME_R) - -if(NOT HAVE_MALLOC) - set(SOURCES ${SOURCES} malloc.c) -endif(NOT HAVE_MALLOC) - -if(NOT HAVE_REALLOC) - set(SOURCES ${SOURCES} realloc.c) -endif(NOT HAVE_REALLOC) - -if(NOT HAVE_SNPRINTF) - set(SOURCES ${SOURCES} snprintf.c) -endif(NOT HAVE_SNPRINTF) - -if(NOT HAVE_DECL_STRDUP AND NOT HAVE__STRDUP) - set(SOURCES ${SOURCES} strdup.c) -endif(NOT HAVE_DECL_STRDUP AND NOT HAVE__STRDUP) - -if(NOT HAVE_DECL_STRSIGNAL) - set(SOURCES ${SOURCES} strsignal.c) -endif(NOT HAVE_DECL_STRSIGNAL) - -if(NOT HAVE_DECL_ALARM) - set(SOURCES ${SOURCES} alarm.c) -endif(NOT HAVE_DECL_ALARM) - -if (NOT HAVE_PTHREAD) - set(SOURCES ${SOURCES} pthread_mutex.c) -endif() - -set(HEADERS libcompat.h) - -add_library(compat STATIC ${SOURCES} ${HEADERS}) - -# vim: shiftwidth=2:softtabstop=2:tabstop=2:expandtab:autoindent - +ADD_LIBRARY(compat STATIC + libcompat.c + $<$>:clock_gettime.c timer_create.c timer_delete.c timer_settime.c> + $<$>:getline.c> + $<$>:gettimeofday.c> + $<$>:localtime_r.c> + $<$>:malloc.c> + $<$>:realloc.c> + $<$>:snprintf.c> + $<$>,$>>:strdup.c> + $<$>:strsignal.c> + $<$>:alarm.c> + $<$>:pthread_mutex.c> +) + +SET_TARGET_PROPERTIES(compat + PROPERTIES + LANGUAGE C + C_STANDARD 99 + C_STANDARD_REQUIRED ON + C_EXTENSIONS ON +) + +TARGET_COMPILE_FEATURES(compat + PUBLIC + c_function_prototypes + c_variadic_macros + c_std_99 +) + +TARGET_COMPILE_OPTIONS(compat + PUBLIC + #################################################### + # Clang Options + #################################################### + # + # Enable the standard diagnostic options if we + # detect that the current C compiler is clang. + # + $<$:-Wall -Wextra> + + #################################################### + # GCC Options + #################################################### + # + # Enable the standard diagnostic options if we + # detect that the current C compiler is GCC. + # + $<$:-Wall -Wextra> + # + # If the C compiler is GCC, we are building a Debug + # build, and the version of our compiler is at least + # 10.1.0, enable the static analyzer. + # + # This option was implemented in version 10.1.0, so + # this is the minimum version required for this + # option. + # + $<$,$,10.1.0>,$>:-fanalyzer> + + #################################################### + # MSVC Options + #################################################### + # + $<$,$>:/Od /RTC1 /GS /Gy /Zi /analyze:512 /sdl /TC /Wall> + $<$,$>:/O2 /GF /Gy /Qpar /Qfast_transcendentals /TC> +) + +TARGET_COMPILE_DEFINITIONS(compat + PUBLIC + $<$:_CRT_SECURE_NO_DEPRECATE _CRT_SECURE_NO_WARNINGS _CRT_NONSTDC_NO_WARNINGS> +) + +TARGET_INCLUDE_DIRECTORIES(compat + PUBLIC + ${CMAKE_BINARY_DIR} + ${CMAKE_CURRENT_BINARY_DIR} +) diff --git a/lib/libcompat.h b/lib/libcompat.h index b5983d70..ce49c500 100644 --- a/lib/libcompat.h +++ b/lib/libcompat.h @@ -295,9 +295,9 @@ CK_DLL_EXP int timer_delete(timer_t timerid); * snprintf (or its variants) should be replaced with * the C99 compliant version in libcompat. */ -#if HAVE_CONFIG_H +//#if HAVE_CONFIG_H #include -#endif +//#endif #if HAVE_STDARG_H #include diff --git a/src/CMakeLists.txt b/src/CMakeLists.txt index 5787b599..f3e24120 100644 --- a/src/CMakeLists.txt +++ b/src/CMakeLists.txt @@ -20,182 +20,247 @@ # Boston, MA 02111-1307, USA. # -set(SOURCES - check.c - check_error.c - check_list.c - check_log.c - check_msg.c - check_pack.c - check_print.c - check_run.c - check_str.c) - -set(HEADERS - ${CONFIG_HEADER} - ${CMAKE_CURRENT_BINARY_DIR}/check.h - check.h.in - check_error.h - check_impl.h - check_list.h - check_log.h - check_msg.h - check_pack.h - check_print.h - check_str.h) - -configure_file(check.h.in check.h @ONLY) - -# To maintain compatibility with the Autotools installation -# we specifically create both shared and static libraries -# as that is what Autotools script has been doing. -# Normally CMake would create the system's native default library type. - -add_library(check STATIC ${SOURCES} ${HEADERS}) -add_library(Check::check ALIAS check) - - -# We would like to create an OBJECT library but currently they are -# too unreliable and cumbersome, -# especially with target_link_libraries and install(EXPORT... -# https://stackoverflow.com/questions/38832528/transitive-target-include-directories-on-object-libraries -# So we instead do the work twice. -add_library(checkShared SHARED ${SOURCES} ${HEADERS}) -add_library(Check::checkShared ALIAS checkShared) - -# Add parts of libcompat as required -target_sources(check PRIVATE ${CMAKE_CURRENT_SOURCE_DIR}/../lib/fpclassify.c) -target_sources(checkShared PRIVATE ${CMAKE_CURRENT_SOURCE_DIR}/../lib/fpclassify.c) - -if (NOT HAVE_LIBRT) - target_sources(check PRIVATE ${CMAKE_CURRENT_SOURCE_DIR}/../lib/clock_gettime.c) - target_sources(check PRIVATE ${CMAKE_CURRENT_SOURCE_DIR}/../lib/timer_create.c) - target_sources(check PRIVATE ${CMAKE_CURRENT_SOURCE_DIR}/../lib/timer_delete.c) - target_sources(check PRIVATE ${CMAKE_CURRENT_SOURCE_DIR}/../lib/timer_settime.c) - target_sources(checkShared PRIVATE ${CMAKE_CURRENT_SOURCE_DIR}/../lib/clock_gettime.c) - target_sources(checkShared PRIVATE ${CMAKE_CURRENT_SOURCE_DIR}/../lib/timer_create.c) - target_sources(checkShared PRIVATE ${CMAKE_CURRENT_SOURCE_DIR}/../lib/timer_delete.c) - target_sources(checkShared PRIVATE ${CMAKE_CURRENT_SOURCE_DIR}/../lib/timer_settime.c) -endif(NOT HAVE_LIBRT) - -if(NOT HAVE_GETLINE) - target_sources(check PRIVATE ${CMAKE_CURRENT_SOURCE_DIR}/../lib/getline.c) - target_sources(checkShared PRIVATE ${CMAKE_CURRENT_SOURCE_DIR}/../lib/getline.c) -endif(NOT HAVE_GETLINE) - -if(NOT HAVE_GETTIMEOFDAY) - target_sources(check PRIVATE ${CMAKE_CURRENT_SOURCE_DIR}/../lib/gettimeofday.c) - target_sources(checkShared PRIVATE ${CMAKE_CURRENT_SOURCE_DIR}/../lib/gettimeofday.c) -endif(NOT HAVE_GETTIMEOFDAY) - -if(NOT HAVE_DECL_LOCALTIME_R) - target_sources(check PRIVATE ${CMAKE_CURRENT_SOURCE_DIR}/../lib/localtime_r.c) - target_sources(checkShared PRIVATE ${CMAKE_CURRENT_SOURCE_DIR}/../lib/localtime_r.c) -endif(NOT HAVE_DECL_LOCALTIME_R) - -if(NOT HAVE_MALLOC) - target_sources(check PRIVATE ${CMAKE_CURRENT_SOURCE_DIR}/../lib/malloc.c) - target_sources(checkShared PRIVATE ${CMAKE_CURRENT_SOURCE_DIR}/../lib/malloc.c) -endif(NOT HAVE_MALLOC) - -if(NOT HAVE_REALLOC) - target_sources(check PRIVATE ${CMAKE_CURRENT_SOURCE_DIR}/../lib/realloc.c) - target_sources(checkShared PRIVATE ${CMAKE_CURRENT_SOURCE_DIR}/../lib/realloc.c) -endif(NOT HAVE_REALLOC) - -if(NOT HAVE_SNPRINTF) - target_sources(check PRIVATE ${CMAKE_CURRENT_SOURCE_DIR}/../lib/snprintf.c) - target_sources(checkShared PRIVATE ${CMAKE_CURRENT_SOURCE_DIR}/../lib/snprintf.c) -endif(NOT HAVE_SNPRINTF) - -if(NOT HAVE_DECL_STRDUP AND NOT HAVE__STRDUP) - target_sources(check PRIVATE ${CMAKE_CURRENT_SOURCE_DIR}/../lib/strdup.c) - target_sources(checkShared PRIVATE ${CMAKE_CURRENT_SOURCE_DIR}/../lib/strdup.c) -endif(NOT HAVE_DECL_STRDUP AND NOT HAVE__STRDUP) - -if(NOT HAVE_DECL_STRSIGNAL) - target_sources(check PRIVATE ${CMAKE_CURRENT_SOURCE_DIR}/../lib/strsignal.c) - target_sources(checkShared PRIVATE ${CMAKE_CURRENT_SOURCE_DIR}/../lib/strsignal.c) -endif(NOT HAVE_DECL_STRSIGNAL) - -if(NOT HAVE_DECL_ALARM) - target_sources(check PRIVATE ${CMAKE_CURRENT_SOURCE_DIR}/../lib/alarm.c) - target_sources(checkShared PRIVATE ${CMAKE_CURRENT_SOURCE_DIR}/../lib/alarm.c) -endif(NOT HAVE_DECL_ALARM) - -if(NOT HAVE_PTHREAD) - target_sources(check PRIVATE ${CMAKE_CURRENT_SOURCE_DIR}/../lib/pthread_mutex.c) - target_sources(checkShared PRIVATE ${CMAKE_CURRENT_SOURCE_DIR}/../lib/pthread_mutex.c) -endif() - -# Include libraries if available -if (HAVE_LIBM) - target_link_libraries(check PUBLIC m) - target_link_libraries(checkShared PUBLIC m) -endif (HAVE_LIBM) -if (HAVE_LIBRT) - target_link_libraries(check PUBLIC rt) - target_link_libraries(checkShared PUBLIC rt) -endif (HAVE_LIBRT) -if (HAVE_SUBUNIT) - target_link_libraries(check PUBLIC subunit) - target_link_libraries(checkShared PUBLIC subunit) -endif (HAVE_SUBUNIT) - -if(MSVC) - target_compile_definitions(checkShared - PRIVATE "CK_DLL_EXP=_declspec(dllexport)" - INTERFACE "CK_DLL_EXP=_declspec(dllimport)" - ) -endif (MSVC) - -# More configuration for exporting - -set(LIBRARY_OUTPUT_NAME "check") -list(APPEND public_headers "${CMAKE_CURRENT_BINARY_DIR}/check.h") -list(APPEND public_headers "${CMAKE_CURRENT_BINARY_DIR}/../check_stdint.h") - -set_target_properties(check PROPERTIES - OUTPUT_NAME ${LIBRARY_OUTPUT_NAME} - PUBLIC_HEADER "${public_headers}" +CONFIGURE_FILE(check.h.in check.h @ONLY) + +SET(LIBRARY_OUTPUT_NAME "check") + +LIST(APPEND PUBLIC_HEADERS + ${CMAKE_CURRENT_BINARY_DIR}/check.h + ${CMAKE_SOURCE_DIR}/check_stdint.h +) + +ADD_LIBRARY(check STATIC + check.c + check_error.c + check_list.c + check_log.c + check_msg.c + check_pack.c + check_print.c + check_run.c + check_str.c + ${CMAKE_SOURCE_DIR}/lib/fpclassify.c + $<$>:${CMAKE_SOURCE_DIR}/lib/clock_gettime.c ${CMAKE_SOURCE_DIR}/lib/timer_create.c ${CMAKE_SOURCE_DIR}/lib/timer_delete.c ${CMAKE_SOURCE_DIR}/lib/timer_settime.c> + $<$>:${CMAKE_SOURCE_DIR}/lib/getline.c> + $<$>:${CMAKE_SOURCE_DIR}/lib/gettimeofday.c> + $<$>:${CMAKE_SOURCE_DIR}/lib/localtime_r.c> + $<$>:${CMAKE_SOURCE_DIR}/lib/malloc.c> + $<$>:${CMAKE_SOURCE_DIR}/lib/realloc.c> + $<$>:${CMAKE_SOURCE_DIR}/lib/snprintf.c> + $<$>,$>>:${CMAKE_SOURCE_DIR}/lib/strdup.c> + $<$>:${CMAKE_SOURCE_DIR}/lib/strsignal.c> + $<$>:${CMAKE_SOURCE_DIR}/lib/alarm.c> + $<$>:${CMAKE_SOURCE_DIR}/lib/pthread_mutex.c> +) + +SET_TARGET_PROPERTIES(check + PROPERTIES + LANGUAGE + C + C_STANDARD + 99 + C_STANDARD_REQUIRED + ON + C_EXTENSIONS + ON + OUTPUT_NAME + ${LIBRARY_OUTPUT_NAME} + VERSION + ${PROJECT_VERSION} + PUBLIC_HEADER + "${PUBLIC_HEADERS}" +) + +TARGET_COMPILE_OPTIONS(check + PUBLIC + #################################################### + # Clang Options + #################################################### + # + # Enable the standard diagnostic options if we + # detect that the current C compiler is clang. + # + $<$:-Wall -Wextra> + + #################################################### + # GCC Options + #################################################### + # + # Enable the standard diagnostic options if we + # detect that the current C compiler is GCC. + # + $<$:-Wall -Wextra> + # + # If the C compiler is GCC, we are building a Debug + # build, and the version of our compiler is at least + # 10.1.0, enable the static analyzer. + # + # This option was implemented in version 10.1.0, so + # this is the minimum version required for this + # option. + # + $<$,$,10.1.0>,$>:-fanalyzer> + + #################################################### + # MSVC Options + #################################################### + # + $<$,$>:/Od /RTC1 /GS /Gy /Zi /analyze:512 /sdl /TC /Wall> + $<$,$>:/O2 /GF /Gy /Qpar /Qfast_transcendentals /TC> ) -if (MSVC) - # "On Windows you should probably give each library a different name, - # since there is a ".lib" file for both shared and static". - # https://stackoverflow.com/a/2152157/4716395 - # "Dynamic-Link Library" (DLL) is Microsoft terminology. - # So we call it this: - set(LIBRARY_OUTPUT_NAME "checkDynamic") -endif (MSVC) -set_target_properties(checkShared PROPERTIES - OUTPUT_NAME ${LIBRARY_OUTPUT_NAME} - VERSION ${PROJECT_VERSION} - SOVERSION ${PROJECT_VERSION_MAJOR} - PUBLIC_HEADER "${public_headers}" +TARGET_COMPILE_DEFINITIONS(check + PUBLIC + $<$:_CRT_SECURE_NO_DEPRECATE _CRT_SECURE_NO_WARNINGS _CRT_NONSTDC_NO_WARNINGS> ) -target_include_directories(check - PUBLIC - $ - $ - $ + +TARGET_LINK_LIBRARIES(check + PRIVATE + $<$,$>:${CMAKE_THREAD_LIBS_INIT}> + PUBLIC + $<$:m> + $<$:rt> + $<$:subunit> ) -target_include_directories(checkShared - PUBLIC - $ - $ - $ + +TARGET_INCLUDE_DIRECTORIES(check + PRIVATE + ${CMAKE_CURRENT_SOURCE_DIR} + PUBLIC + $ + $ + $ ) -if(NOT THIS_IS_SUBPROJECT) - install(TARGETS check checkShared - EXPORT check-targets - ARCHIVE DESTINATION ${CMAKE_INSTALL_LIBDIR} - LIBRARY DESTINATION ${CMAKE_INSTALL_LIBDIR} - RUNTIME DESTINATION ${CMAKE_INSTALL_BINDIR} - PUBLIC_HEADER DESTINATION ${CMAKE_INSTALL_INCLUDEDIR} - ) -endif() +ADD_LIBRARY(Check::check ALIAS check) + +IF(MSVC) + SET(LIBRARY_OUTPUT_NAME "checkDynamic") +ENDIF() + +ADD_LIBRARY(checkShared SHARED + check.c + check_error.c + check_list.c + check_log.c + check_msg.c + check_pack.c + check_print.c + check_run.c + check_str.c + ${CMAKE_SOURCE_DIR}/lib/fpclassify.c + $<$>:${CMAKE_SOURCE_DIR}/lib/clock_gettime.c ${CMAKE_SOURCE_DIR}/lib/timer_create.c ${CMAKE_SOURCE_DIR}/lib/timer_delete.c ${CMAKE_SOURCE_DIR}/lib/timer_settime.c> + $<$>:${CMAKE_SOURCE_DIR}/lib/getline.c> + $<$>:${CMAKE_SOURCE_DIR}/lib/gettimeofday.c> + $<$>:${CMAKE_SOURCE_DIR}/lib/localtime_r.c> + $<$>:${CMAKE_SOURCE_DIR}/lib/malloc.c> + $<$>:${CMAKE_SOURCE_DIR}/lib/realloc.c> + $<$>:${CMAKE_SOURCE_DIR}/lib/snprintf.c> + $<$>,$>>:${CMAKE_SOURCE_DIR}/lib/strdup.c> + $<$>:${CMAKE_SOURCE_DIR}/lib/strsignal.c> + $<$>:${CMAKE_SOURCE_DIR}/lib/alarm.c> + $<$>:${CMAKE_SOURCE_DIR}/lib/pthread_mutex.c> +) + +SET_TARGET_PROPERTIES(checkShared + PROPERTIES + LANGUAGE + C + C_STANDARD + 99 + C_STANDARD_REQUIRED + ON + C_EXTENSIONS + ON + OUTPUT_NAME + ${LIBRARY_OUTPUT_NAME} + VERSION + ${PROJECT_VERSION} + SOVERSION + ${PROJECT_VERSION_MAJOR} + PUBLIC_HEADER + "${PUBLIC_HEADERS}" +) + +TARGET_COMPILE_OPTIONS(checkShared + PUBLIC + #################################################### + # Clang Options + #################################################### + # + # Enable the standard diagnostic options if we + # detect that the current C compiler is clang. + # + $<$:-Wall -Wextra> + + #################################################### + # GCC Options + #################################################### + # + # Enable the standard diagnostic options if we + # detect that the current C compiler is GCC. + # + $<$:-Wall -Wextra> + # + # If the C compiler is GCC, we are building a Debug + # build, and the version of our compiler is at least + # 10.1.0, enable the static analyzer. + # + # This option was implemented in version 10.1.0, so + # this is the minimum version required for this + # option. + # + $<$,$,10.1.0>,$>:-fanalyzer> + + #################################################### + # MSVC Options + #################################################### + # + $<$,$>:/Od /RTC1 /GS /Gy /Zi /analyze:512 /sdl /TC /Wall> + $<$,$>:/O2 /GF /Gy /Qpar /Qfast_transcendentals /TC> +) + +TARGET_COMPILE_DEFINITIONS(checkShared + PUBLIC + $<$:_CRT_SECURE_NO_DEPRECATE _CRT_SECURE_NO_WARNINGS _CRT_NONSTDC_NO_WARNINGS> + PRIVATE + $<$: "CK_DLL_EXP=_declspec(dllexport)" > + INTERFACE + $<$: "CK_DLL_EXP=_declspec(dllimport)" > +) + +TARGET_LINK_LIBRARIES(checkShared + PUBLIC + $<$:m> + $<$:rt> + $<$:subunit> +) + +TARGET_INCLUDE_DIRECTORIES(checkShared + PRIVATE + ${CMAKE_CURRENT_SOURCE_DIR} + PUBLIC + $ + $ + $ +) -# vim: shiftwidth=2:softtabstop=2:tabstop=2:expandtab:autoindent +ADD_LIBRARY(Check::checkShared ALIAS checkShared) +IF(NOT THIS_IS_SUBPROJECT) + INSTALL( + TARGETS + check + checkShared + EXPORT + check-targets + ARCHIVE DESTINATION + ${CMAKE_INSTALL_LIBDIR} + LIBRARY DESTINATION + ${CMAKE_INSTALL_LIBDIR} + RUNTIME DESTINATION + ${CMAKE_INSTALL_BINDIR} + PUBLIC_HEADER DESTINATION + ${CMAKE_INSTALL_INCLUDEDIR} + ) +ENDIF() diff --git a/tests/CMakeLists.txt b/tests/CMakeLists.txt index 5a925c25..d7bd1754 100644 --- a/tests/CMakeLists.txt +++ b/tests/CMakeLists.txt @@ -20,76 +20,124 @@ # Boston, MA 02111-1307, USA. # -include_directories(${CMAKE_CURRENT_SOURCE_DIR}/../src) -# Enable finding check.h -include_directories(${CMAKE_CURRENT_BINARY_DIR}/../src) +CONFIGURE_FILE(test_vars.in test_vars @ONLY) -# For the test_vars.in script, to give the unit test shell script -# runners the location of the source files -set(srcdir "${CMAKE_CURRENT_SOURCE_DIR}") +ADD_EXECUTABLE(check_check + check_check_exit.c + check_check_fixture.c + check_check_fork.c + check_check_limit.c + check_check_log.c + check_check_log_internal.c + check_check_main.c + check_check_master.c + check_check_msg.c + check_check_pack.c + check_check_selective.c + check_check_sub.c + check_check_tags.c + check_list.c +) -if(WIN32) - # CMake uses Unix slashes for everything, but the tests that - # read srcdir expect platform specific slashes. There are two - # slashes because the shell scripts will consume srcdir. - string(REPLACE "/" "\\\\" srcdir "${srcdir}") - set(EXEEXT ".exe") - set(IS_MSVC "1") -endif(WIN32) +ADD_EXECUTABLE(check_check_export + check_check_sub.c + check_check_master.c + check_check_log.c + check_check_fork.c + check_check_export_main.c +) -configure_file(${CMAKE_CURRENT_SOURCE_DIR}/test_vars.in - ${CMAKE_CURRENT_BINARY_DIR}/test_vars @ONLY) +ADD_EXECUTABLE(ex_output + ex_output.c +) -if(ENABLE_MEMORY_LEAKING_TESTS) - add_definitions(-DMEMORY_LEAKING_TESTS_ENABLED=1) -else(ENABLE_MEMORY_LEAKING_TESTS) - add_definitions(-DMEMORY_LEAKING_TESTS_ENABLED=0) -endif(ENABLE_MEMORY_LEAKING_TESTS) +ADD_EXECUTABLE(check_nofork + check_nofork.c +) -set(CHECK_CHECK_SOURCES - check_check_exit.c - check_check_fixture.c - check_check_fork.c - check_check_limit.c - check_check_log.c - check_check_log_internal.c - check_check_main.c - check_check_master.c - check_check_msg.c - check_check_pack.c - check_check_selective.c - check_check_sub.c - check_check_tags.c - check_list.c) -set(CHECK_CHECK_HEADERS check_check.h) -add_executable(check_check ${CHECK_CHECK_HEADERS} ${CHECK_CHECK_SOURCES}) -target_link_libraries(check_check check) +ADD_EXECUTABLE(check_nofork_teardown + check_nofork_teardown.c +) -set(CHECK_CHECK_EXPORT_SOURCES - check_check_sub.c - check_check_master.c - check_check_log.c - check_check_fork.c - check_check_export_main.c +ADD_EXECUTABLE(check_set_max_msg_size + check_set_max_msg_size.c ) -set(CHECK_CHECK_EXPORT_HEADERS check_check.h) -add_executable(check_check_export - ${CHECK_CHECK_EXPORT_HEADERS} - ${CHECK_CHECK_EXPORT_SOURCES}) -target_link_libraries(check_check_export check) -set(EX_OUTPUT_SOURCES ex_output.c) -add_executable(ex_output ${EX_OUTPUT_SOURCES}) -target_link_libraries(ex_output check) +SET(CHECK_TESTS + check_check + check_check_export + ex_output + check_nofork + check_nofork_teardown + check_set_max_msg_size +) + +SET_TARGET_PROPERTIES(${CHECK_TESTS} + PROPERTIES + LANGUAGE + C + C_STANDARD + 99 + C_STANDARD_REQUIRED + ON + C_EXTENSIONS + ON +) + +FOREACH(CHECK_TEST ${CHECK_TESTS}) + TARGET_COMPILE_OPTIONS(${CHECK_TEST} + PUBLIC + ################################################ + # Clang Options + ################################################ + # + # Enable the standard diagnostic options if we + # detect that the current C compiler is clang. + # + $<$:-Wall -Wextra> + + ################################################ + # GCC Options + ################################################ + # + # Enable the standard diagnostic options if we + # detect that the current C compiler is GCC. + # + $<$:-Wall -Wextra> + # + # If the C compiler is GCC, we are building a + # Debug build, and the version of our compiler + # is at least 10.1.0 enable the static analyzer. + # + # This option was implemented in version 10.1.0, + # so this is the minimum version required for + # this option. + # + $<$,$,10.1.0>,$>:-fanalyzer> + + ################################################ + # MSVC Options + ################################################ + # + $<$,$>:/Od /RTC1 /GS /Gy /Zi /analyze:512 /sdl /TC /Wall> + $<$,$>:/O2 /GF /Gy /Qpar /Qfast_transcendentals /TC> + ) -set(CHECK_NOFORK_SOURCES check_nofork.c) -add_executable(check_nofork ${CHECK_NOFORK_SOURCES}) -target_link_libraries(check_nofork check) + TARGET_COMPILE_DEFINITIONS(${CHECK_TEST} + PUBLIC + $<$:_CRT_SECURE_NO_DEPRECATE _CRT_SECURE_NO_WARNINGS _CRT_NONSTDC_NO_WARNINGS> + $<$:MEMORY_LEAKING_TESTS_ENABLED=1> + ) -set(CHECK_NOFORK_TEARDOWN_SOURCES check_nofork_teardown.c) -add_executable(check_nofork_teardown ${CHECK_NOFORK_TEARDOWN_SOURCES}) -target_link_libraries(check_nofork_teardown check) + TARGET_INCLUDE_DIRECTORIES(${CHECK_TEST} PUBLIC + ${CMAKE_SOURCE_DIR}/src + ${CMAKE_BINARY_DIR} + ${CMAKE_BINARY_DIR}/src + ) -set(CHECK_SET_MAX_MSG_SIZE_SOURCES check_set_max_msg_size.c) -add_executable(check_set_max_msg_size ${CHECK_SET_MAX_MSG_SIZE_SOURCES}) -target_link_libraries(check_set_max_msg_size check) + TARGET_LINK_LIBRARIES(${CHECK_TEST} + PUBLIC + $<$,$>:${CMAKE_THREAD_LIBS_INIT}> + check + ) +ENDFOREACH()