diff --git a/cmake/ci.cmake b/cmake/ci.cmake index 4e7e4dcc2..eef7345b4 100644 --- a/cmake/ci.cmake +++ b/cmake/ci.cmake @@ -416,7 +416,7 @@ set(GCC_CXXFLAGS add_custom_target(ci_test_gcc COMMAND CXX=${GCC_TOOL} CXXFLAGS="${GCC_CXXFLAGS}" ${CMAKE_COMMAND} -DCMAKE_BUILD_TYPE=Debug -GNinja - -DJSON_BuildTests=ON + -DJSON_BuildTests=ON -DJSON_32bitTest=AUTO -S${PROJECT_SOURCE_DIR} -B${PROJECT_BINARY_DIR}/build_gcc COMMAND ${CMAKE_COMMAND} --build ${PROJECT_BINARY_DIR}/build_gcc COMMAND cd ${PROJECT_BINARY_DIR}/build_gcc && ${CMAKE_CTEST_COMMAND} --parallel ${N} --output-on-failure @@ -426,7 +426,7 @@ add_custom_target(ci_test_gcc add_custom_target(ci_test_clang COMMAND CXX=${CLANG_TOOL} CXXFLAGS="${CLANG_CXXFLAGS}" ${CMAKE_COMMAND} -DCMAKE_BUILD_TYPE=Debug -GNinja - -DJSON_BuildTests=ON -DJSON_32bitTest=ON + -DJSON_BuildTests=ON -DJSON_32bitTest=AUTO -S${PROJECT_SOURCE_DIR} -B${PROJECT_BINARY_DIR}/build_clang COMMAND ${CMAKE_COMMAND} --build ${PROJECT_BINARY_DIR}/build_clang COMMAND cd ${PROJECT_BINARY_DIR}/build_clang && ${CMAKE_CTEST_COMMAND} --parallel ${N} --output-on-failure @@ -441,7 +441,7 @@ foreach(CXX_STANDARD 11 14 17 20) add_custom_target(ci_test_gcc_cxx${CXX_STANDARD} COMMAND CXX=${GCC_TOOL} CXXFLAGS="${GCC_CXXFLAGS}" ${CMAKE_COMMAND} -DCMAKE_BUILD_TYPE=Debug -GNinja - -DJSON_BuildTests=ON -DJSON_FastTests=ON + -DJSON_BuildTests=ON -DJSON_FastTests=ON -DJSON_32bitTest=AUTO -DJSON_TestStandards=${CXX_STANDARD} -S${PROJECT_SOURCE_DIR} -B${PROJECT_BINARY_DIR}/build_gcc_cxx${CXX_STANDARD} COMMAND ${CMAKE_COMMAND} --build ${PROJECT_BINARY_DIR}/build_gcc_cxx${CXX_STANDARD} @@ -452,7 +452,7 @@ foreach(CXX_STANDARD 11 14 17 20) add_custom_target(ci_test_clang_cxx${CXX_STANDARD} COMMAND CXX=${CLANG_TOOL} CXXFLAGS="${CLANG_CXXFLAGS}" ${CMAKE_COMMAND} -DCMAKE_BUILD_TYPE=Debug -GNinja - -DJSON_BuildTests=ON -DJSON_FastTests=ON -DJSON_32bitTest=ON + -DJSON_BuildTests=ON -DJSON_FastTests=ON -DJSON_32bitTest=AUTO -DJSON_TestStandards=${CXX_STANDARD} -S${PROJECT_SOURCE_DIR} -B${PROJECT_BINARY_DIR}/build_clang_cxx${CXX_STANDARD} COMMAND ${CMAKE_COMMAND} --build ${PROJECT_BINARY_DIR}/build_clang_cxx${CXX_STANDARD} @@ -468,7 +468,7 @@ endforeach() add_custom_target(ci_test_noexceptions COMMAND CXX=${CLANG_TOOL} ${CMAKE_COMMAND} -DCMAKE_BUILD_TYPE=Debug -GNinja - -DJSON_BuildTests=ON -DJSON_32bitTest=ON -DCMAKE_CXX_FLAGS=-DJSON_NOEXCEPTION -DDOCTEST_TEST_FILTER=--no-throw + -DJSON_BuildTests=ON -DJSON_32bitTest=AUTO -DCMAKE_CXX_FLAGS=-DJSON_NOEXCEPTION -DDOCTEST_TEST_FILTER=--no-throw -S${PROJECT_SOURCE_DIR} -B${PROJECT_BINARY_DIR}/build_noexceptions COMMAND ${CMAKE_COMMAND} --build ${PROJECT_BINARY_DIR}/build_noexceptions COMMAND cd ${PROJECT_BINARY_DIR}/build_noexceptions && ${CMAKE_CTEST_COMMAND} --parallel ${N} --output-on-failure @@ -482,7 +482,7 @@ add_custom_target(ci_test_noexceptions add_custom_target(ci_test_noimplicitconversions COMMAND CXX=${CLANG_TOOL} ${CMAKE_COMMAND} -DCMAKE_BUILD_TYPE=Debug -GNinja - -DJSON_BuildTests=ON -DJSON_ImplicitConversions=OFF -DJSON_32bitTest=ON + -DJSON_BuildTests=ON -DJSON_ImplicitConversions=OFF -DJSON_32bitTest=AUTO -S${PROJECT_SOURCE_DIR} -B${PROJECT_BINARY_DIR}/build_noimplicitconversions COMMAND ${CMAKE_COMMAND} --build ${PROJECT_BINARY_DIR}/build_noimplicitconversions COMMAND cd ${PROJECT_BINARY_DIR}/build_noimplicitconversions && ${CMAKE_CTEST_COMMAND} --parallel ${N} --output-on-failure @@ -496,7 +496,7 @@ add_custom_target(ci_test_noimplicitconversions add_custom_target(ci_test_diagnostics COMMAND CXX=${CLANG_TOOL} ${CMAKE_COMMAND} -DCMAKE_BUILD_TYPE=Debug -GNinja - -DJSON_BuildTests=ON -DJSON_Diagnostics=ON -DJSON_32bitTest=ON + -DJSON_BuildTests=ON -DJSON_Diagnostics=ON -DJSON_32bitTest=AUTO -S${PROJECT_SOURCE_DIR} -B${PROJECT_BINARY_DIR}/build_diagnostics COMMAND ${CMAKE_COMMAND} --build ${PROJECT_BINARY_DIR}/build_diagnostics COMMAND cd ${PROJECT_BINARY_DIR}/build_diagnostics && ${CMAKE_CTEST_COMMAND} --parallel ${N} --output-on-failure @@ -510,7 +510,7 @@ add_custom_target(ci_test_diagnostics add_custom_target(ci_test_legacycomparison COMMAND CXX=${CLANG_TOOL} ${CMAKE_COMMAND} -DCMAKE_BUILD_TYPE=Debug -GNinja - -DJSON_BuildTests=ON -DJSON_LegacyDiscardedValueComparison=ON -DJSON_32bitTest=ON + -DJSON_BuildTests=ON -DJSON_LegacyDiscardedValueComparison=ON -DJSON_32bitTest=AUTO -S${PROJECT_SOURCE_DIR} -B${PROJECT_BINARY_DIR}/build_legacycomparison COMMAND ${CMAKE_COMMAND} --build ${PROJECT_BINARY_DIR}/build_legacycomparison COMMAND cd ${PROJECT_BINARY_DIR}/build_legacycomparison && ${CMAKE_CTEST_COMMAND} --parallel ${N} --output-on-failure @@ -579,7 +579,7 @@ add_custom_target(ci_test_amalgamation COMMAND CXX=${GCC_TOOL} CXXFLAGS="${GCC_CXXFLAGS}" ${CMAKE_COMMAND} -DCMAKE_BUILD_TYPE=Debug -GNinja - -DJSON_BuildTests=ON -DJSON_MultipleHeader=OFF -DJSON_FastTests=ON -DJSON_32bitTest=ON + -DJSON_BuildTests=ON -DJSON_MultipleHeader=OFF -DJSON_FastTests=ON -DJSON_32bitTest=AUTO -S${PROJECT_SOURCE_DIR} -B${PROJECT_BINARY_DIR}/build_single_header COMMAND ${CMAKE_COMMAND} --build ${PROJECT_BINARY_DIR}/build_single_header COMMAND cd ${PROJECT_BINARY_DIR}/build_single_header && ${CMAKE_CTEST_COMMAND} --parallel ${N} --output-on-failure @@ -595,7 +595,7 @@ add_custom_target(ci_test_amalgamation add_custom_target(ci_test_valgrind COMMAND CXX=${GCC_TOOL} ${CMAKE_COMMAND} -DCMAKE_BUILD_TYPE=Debug -GNinja - -DJSON_BuildTests=ON -DJSON_Valgrind=ON + -DJSON_BuildTests=ON -DJSON_Valgrind=ON -DJSON_32bitTest=AUTO -S${PROJECT_SOURCE_DIR} -B${PROJECT_BINARY_DIR}/build_valgrind COMMAND ${CMAKE_COMMAND} --build ${PROJECT_BINARY_DIR}/build_valgrind COMMAND cd ${PROJECT_BINARY_DIR}/build_valgrind && ${CMAKE_CTEST_COMMAND} -L valgrind --parallel ${N} --output-on-failure @@ -611,7 +611,7 @@ set(CLANG_ANALYZER_CHECKS "fuchsia.HandleChecker,nullability.NullableDereference add_custom_target(ci_clang_analyze COMMAND CXX=${CLANG_TOOL} ${CMAKE_COMMAND} -DCMAKE_BUILD_TYPE=Debug -GNinja - -DJSON_BuildTests=ON -DJSON_32bitTest=ON + -DJSON_BuildTests=ON -DJSON_32bitTest=AUTO -S${PROJECT_SOURCE_DIR} -B${PROJECT_BINARY_DIR}/build_clang_analyze COMMAND cd ${PROJECT_BINARY_DIR}/build_clang_analyze && ${SCAN_BUILD_TOOL} -enable-checker ${CLANG_ANALYZER_CHECKS} --use-c++=${CLANG_TOOL} -analyze-headers -o ${PROJECT_BINARY_DIR}/report ninja COMMENT "Check code with Clang Analyzer" @@ -743,7 +743,7 @@ add_custom_target(ci_non_git_tests add_custom_target(ci_reproducible_tests COMMAND ${CMAKE_COMMAND} -DCMAKE_BUILD_TYPE=Debug -GNinja - -DJSON_BuildTests=ON -DJSON_FastTests=ON + -DJSON_BuildTests=ON -DJSON_FastTests=ON -DJSON_32bitTest=AUTO -S${PROJECT_SOURCE_DIR} -B${PROJECT_BINARY_DIR}/build_reproducible_tests COMMAND ${CMAKE_COMMAND} --build ${PROJECT_BINARY_DIR}/build_reproducible_tests COMMAND cd ${PROJECT_BINARY_DIR}/build_reproducible_tests && ${CMAKE_CTEST_COMMAND} --parallel ${N} -LE not_reproducible --output-on-failure @@ -882,7 +882,7 @@ foreach(COMPILER g++-4.8 g++-4.9 g++-5 g++-6 g++-7 g++-8 g++-9 g++-10 g++-11 cla add_custom_target(ci_test_compiler_${COMPILER} COMMAND CXX=${COMPILER} ${CMAKE_COMMAND} -DCMAKE_BUILD_TYPE=Debug -GNinja - -DJSON_BuildTests=ON -DJSON_FastTests=ON -DJSON_32bitTest=ON + -DJSON_BuildTests=ON -DJSON_FastTests=ON -DJSON_32bitTest=AUTO -S${PROJECT_SOURCE_DIR} -B${PROJECT_BINARY_DIR}/build_compiler_${COMPILER} ${ADDITIONAL_FLAGS} COMMAND ${CMAKE_COMMAND} --build ${PROJECT_BINARY_DIR}/build_compiler_${COMPILER} diff --git a/tests/CMakeLists.txt b/tests/CMakeLists.txt index 780c065a3..1d0f5a2c3 100644 --- a/tests/CMakeLists.txt +++ b/tests/CMakeLists.txt @@ -2,9 +2,9 @@ cmake_minimum_required(VERSION 3.13) option(JSON_Valgrind "Execute test suite with Valgrind." OFF) option(JSON_FastTests "Skip expensive/slow tests." OFF) -option(JSON_32bitTest "Enable the 32bit unit test." OFF) -set(JSON_TestStandards "" CACHE STRING "The list of standards to test explicitly.") +set(JSON_32bitTest SAFE_AUTO CACHE STRING "Enable the 32bit unit test (ON/OFF/AUTO/SAFE_AUTO).") +set(JSON_TestStandards "" CACHE STRING "The list of standards to test explicitly.") set(JSON_32BIT_TEST_CXXFLAGS "-m32" CACHE STRING "Compiler flags used to enable 32bit test.") set(JSON_32BIT_TEST_LINKFLAGS "-m32" CACHE STRING "Linker flags used to enable 32bit test.") @@ -133,18 +133,53 @@ foreach(file ${files}) json_test_add_test_for(${file} MAIN test_main CXX_STANDARDS ${test_cxx_standards} ${test_force}) endforeach() -if(NOT JSON_32bitTest) +string(TOUPPER "${JSON_32bitTest}" json_32bit_test) +if("${json_32bit_test}" STREQUAL AUTO) + # check if compiler supports -m32 + if(${CMAKE_CXX_COMPILER_ID} STREQUAL GNU) + execute_process( + COMMAND ${CMAKE_CXX_COMPILER} -v --version + OUTPUT_VARIABLE gcc_version_output + ERROR_VARIABLE gcc_version_output) + string(REGEX MATCH "--with-multilib-list=([^ ]*)" multilib_match + "${gcc_version_output}") + if(multilib_match) + string(REPLACE "," ";" multilib_archs "${CMAKE_MATCH_1}") + list(FIND multilib_archs m32 has_multilib_m32) + if(NOT ${has_multilib_m32} EQUAL -1) + message(STATUS "Auto-enabling 32bit unit test.") + set(json_32bit_test ON) + set(JSON_32BIT_TEST_CXXFLAGS "-m32" CACHE STRING "" FORCE) + set(JSON_32BIT_TEST_LINKFLAGS "-m32" CACHE STRING "" FORCE) + endif() + endif() + elseif(${CMAKE_CXX_COMPILER_ID} STREQUAL Clang) + execute_process( + COMMAND ${CMAKE_CXX_COMPILER} -m32 --version + RESULT_VARIABLE clang_version_result + OUTPUT_QUIET ERROR_QUIET) + if(${clang_version_result} EQUAL 0) + message(STATUS "Auto-enabling 32bit unit test.") + set(json_32bit_test ON) + set(JSON_32BIT_TEST_CXXFLAGS "-m32" CACHE STRING "" FORCE) + set(JSON_32BIT_TEST_LINKFLAGS "-m32" CACHE STRING "" FORCE) + endif() + endif() +endif() + +if("${json_32bit_test}" STREQUAL SAFE_AUTO) + # check if compiler is targeting 32bit by default include(CheckTypeSize) check_type_size("size_t" sizeof_size_t LANGUAGE CXX) if(sizeof_size_t AND ${sizeof_size_t} EQUAL 4) message(STATUS "Auto-enabling 32bit unit test.") - set(JSON_32bitTest ON CACHE BOOL "" FORCE) + set(json_32bit_test ON) set(JSON_32BIT_TEST_CXXFLAGS "" CACHE STRING "" FORCE) set(JSON_32BIT_TEST_LINKFLAGS "" CACHE STRING "" FORCE) endif() endif() -if(JSON_32bitTest) +if(${json_32bit_test} STREQUAL ON) message(STATUS "Building 32bit unit test.") add_library(test_main32 OBJECT ${test_main_SOURCES}) target_compile_definitions(test_main32 ${test_main_COMPILE_DEFINITIONS})