CMakeLists.txt (5133B)
1 # This is free and unencumbered software released into the public domain. 2 # 3 # Anyone is free to copy, modify, publish, use, compile, sell, or 4 # distribute this software, either in source code form or as a compiled 5 # binary, for any purpose, commercial or non-commercial, and by any 6 # means. 7 # 8 # In jurisdictions that recognize copyright laws, the author or authors 9 # of this software dedicate any and all copyright interest in the 10 # software to the public domain. We make this dedication for the benefit 11 # of the public at large and to the detriment of our heirs and 12 # successors. We intend this dedication to be an overt act of 13 # relinquishment in perpetuity of all present and future rights to this 14 # software under copyright law. 15 # 16 # THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, 17 # EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF 18 # MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. 19 # IN NO EVENT SHALL THE AUTHORS BE LIABLE FOR ANY CLAIM, DAMAGES OR 20 # OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, 21 # ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR 22 # OTHER DEALINGS IN THE SOFTWARE. 23 # 24 # For more information, please refer to <http://unlicense.org/> 25 26 project(utest) 27 cmake_minimum_required(VERSION 3.15) 28 29 set(UTEST_USE_SANITIZER "" CACHE STRING "Set which Clang Sanitizer to use") 30 31 include_directories(${CMAKE_CURRENT_SOURCE_DIR}/../) 32 33 function(set_flags file msvc gcc clang_extra) 34 if("${CMAKE_C_COMPILER_ID}" STREQUAL "GNU") 35 set_source_files_properties("${file}" PROPERTIES COMPILE_FLAGS "${gcc}") 36 elseif("${CMAKE_C_COMPILER_ID}" STREQUAL "Clang") 37 if(CMAKE_CXX_COMPILER_FRONTEND_VARIANT STREQUAL "MSVC") 38 set_source_files_properties("${file}" PROPERTIES COMPILE_FLAGS "${msvc}") 39 else() 40 set_source_files_properties("${file}" PROPERTIES COMPILE_FLAGS "${gcc} ${clang_extra}") 41 endif() 42 elseif("${CMAKE_C_COMPILER_ID}" STREQUAL "MSVC") 43 set_source_files_properties("${file}" PROPERTIES COMPILE_FLAGS "${msvc}") 44 elseif("${CMAKE_C_COMPILER_ID}" STREQUAL "TinyCC") 45 set_source_files_properties("${file}" PROPERTIES COMPILE_FLAGS "${gcc}") 46 else() 47 message(WARNING "Unknown compiler '${CMAKE_C_COMPILER_ID}'!") 48 endif() 49 endfunction() 50 51 set(MSVC_WARNINGS "/Wall /WX /wd4514 /wd5045") 52 set(GCC_WARNINGS "-Wall -Wextra -Werror") 53 set(CLANG_WARNINGS "-Weverything") 54 55 set_flags(main.c "${MSVC_WARNINGS}" "${GCC_WARNINGS} -std=gnu89" "${CLANG_WARNINGS}") 56 set_flags(test.c "${MSVC_WARNINGS}" "${GCC_WARNINGS} -std=gnu89" "${CLANG_WARNINGS}") 57 set_flags(test99.c "${MSVC_WARNINGS}" "${GCC_WARNINGS} -std=c99" "${CLANG_WARNINGS}") 58 59 list(FIND CMAKE_C_COMPILE_FEATURES c_std_11 IDX) 60 if (${IDX} GREATER -1) 61 set_flags(test11.c "${MSVC_WARNINGS} /std:c11" "${GCC_WARNINGS} -std=c11" "${CLANG_WARNINGS}") 62 63 if("${CMAKE_C_COMPILER_ID}" STREQUAL "GNU") 64 set_source_files_properties(type_printers.c PROPERTIES 65 COMPILE_FLAGS "-std=gnu11") 66 endif() 67 endif() 68 69 set_flags(test.cpp "${MSVC_WARNINGS}" "${GCC_WARNINGS} -std=gnu++98" "${CLANG_WARNINGS}") 70 set_flags(test_no_exceptions.cpp "${MSVC_WARNINGS} /EHs-c-" "${GCC_WARNINGS} -fno-exceptions -std=gnu++98" "${CLANG_WARNINGS}") 71 72 list(FIND CMAKE_CXX_COMPILE_FEATURES cxx_std_11 IDX) 73 if (${IDX} GREATER -1) 74 set_flags(test11.cpp "${MSVC_WARNINGS}" "${GCC_WARNINGS} -std=c++11" "${CLANG_WARNINGS}") 75 endif() 76 77 list(FIND CMAKE_CXX_COMPILE_FEATURES cxx_std_14 IDX) 78 if (${IDX} GREATER -1) 79 set_flags(test14.cpp "${MSVC_WARNINGS} /std:c++14" "${GCC_WARNINGS} -std=c++14" "${CLANG_WARNINGS}") 80 endif() 81 82 list(FIND CMAKE_CXX_COMPILE_FEATURES cxx_std_17 IDX) 83 if (${IDX} GREATER -1) 84 set_flags(test17.cpp "${MSVC_WARNINGS} /std:c++17" "${GCC_WARNINGS} -std=c++17" "${CLANG_WARNINGS}") 85 endif() 86 87 set(SOURCES 88 ../utest.h 89 main.c 90 test.c 91 test11.c 92 test99.c 93 test.cpp 94 test11.cpp 95 test14.cpp 96 test17.cpp 97 test_no_exceptions.cpp 98 stdint_include.c 99 type_printers.c 100 type_printers.cpp 101 side_effects.c 102 side_effects.cpp 103 ) 104 105 add_executable(utest_test ${SOURCES}) 106 107 if(NOT "${UTEST_USE_SANITIZER}" STREQUAL "") 108 target_compile_options(utest_test PUBLIC -fno-omit-frame-pointer -fsanitize=${UTEST_USE_SANITIZER}) 109 target_link_options(utest_test PUBLIC -fno-omit-frame-pointer -fsanitize=${UTEST_USE_SANITIZER}) 110 endif() 111 112 add_executable(utest_test_wpo ${SOURCES}) 113 114 if(NOT "${UTEST_USE_SANITIZER}" STREQUAL "") 115 target_compile_options(utest_test_wpo PUBLIC -fno-omit-frame-pointer -fsanitize=${UTEST_USE_SANITIZER}) 116 target_link_options(utest_test_wpo PUBLIC -fno-omit-frame-pointer -fsanitize=${UTEST_USE_SANITIZER}) 117 endif() 118 119 if("${CMAKE_CXX_COMPILER_ID}" STREQUAL "MSVC") 120 target_compile_options(utest_test_wpo PRIVATE "$<$<CONFIG:RELEASE>:/GL>") 121 target_link_options(utest_test_wpo PRIVATE "$<$<CONFIG:RELEASE>:/LTCG>") 122 endif() 123 124 add_executable(utest_test_mt ${SOURCES}) 125 126 if("${CMAKE_CXX_COMPILER_ID}" STREQUAL "Clang") 127 if(CMAKE_CXX_COMPILER_FRONTEND_VARIANT STREQUAL "MSVC") 128 target_compile_options(utest_test_mt PUBLIC "/MT") 129 endif() 130 elseif("${CMAKE_CXX_COMPILER_ID}" STREQUAL "MSVC") 131 target_compile_options(utest_test_mt PUBLIC "/MT") 132 endif()