Build object library

This commit is contained in:
2024-02-04 15:27:22 -08:00
parent 2d220a3f7d
commit d0ff4ed4d3

View File

@@ -46,9 +46,13 @@ if(HAS_ARM_NEON)
add_compile_definitions(HAS_ARM_NEON) add_compile_definitions(HAS_ARM_NEON)
endif() endif()
add_library(${PROJECT_NAME} SHARED ConflictSet.cpp) add_library(${PROJECT_NAME}_object OBJECT ConflictSet.cpp)
target_compile_options(${PROJECT_NAME} PRIVATE -fPIC -fno-exceptions target_compile_options(${PROJECT_NAME}_object PRIVATE -fPIC -fno-exceptions
-fvisibility=hidden) -fvisibility=hidden)
target_include_directories(${PROJECT_NAME}_object
PRIVATE ${CMAKE_SOURCE_DIR}/include)
add_library(${PROJECT_NAME} SHARED $<TARGET_OBJECTS:${PROJECT_NAME}_object>)
target_link_options(${PROJECT_NAME} PRIVATE $<$<NOT:$<CONFIG:Debug>>: target_link_options(${PROJECT_NAME} PRIVATE $<$<NOT:$<CONFIG:Debug>>:
-nodefaultlibs -lc>) -nodefaultlibs -lc>)
@@ -58,9 +62,9 @@ if(NOT APPLE)
LINKER:--version-script=${CMAKE_SOURCE_DIR}/linker.map) LINKER:--version-script=${CMAKE_SOURCE_DIR}/linker.map)
endif() endif()
add_library(${PROJECT_NAME}_static STATIC ConflictSet.cpp) add_library(${PROJECT_NAME}_static STATIC
target_compile_options(conflict_set_static PRIVATE -fno-exceptions $<TARGET_OBJECTS:${PROJECT_NAME}_object>)
-fvisibility=hidden)
if(NOT APPLE AND CMAKE_OBJCOPY) if(NOT APPLE AND CMAKE_OBJCOPY)
add_custom_command( add_custom_command(
TARGET conflict_set_static TARGET conflict_set_static
@@ -74,12 +78,14 @@ set(TEST_FLAGS -Wall -Wextra -Wpedantic -Wunreachable-code -UNDEBUG)
include(CTest) include(CTest)
add_executable(conflict_set_main ConflictSet.cpp) if(BUILD_TESTING)
target_include_directories(conflict_set_main
PRIVATE ${CMAKE_CURRENT_SOURCE_DIR}/include)
target_compile_definitions(conflict_set_main PRIVATE ENABLE_MAIN)
if(NOT APPLE) add_executable(conflict_set_main ConflictSet.cpp)
target_include_directories(conflict_set_main
PRIVATE ${CMAKE_CURRENT_SOURCE_DIR}/include)
target_compile_definitions(conflict_set_main PRIVATE ENABLE_MAIN)
if(NOT APPLE)
# libfuzzer target, to generate/manage corpus # libfuzzer target, to generate/manage corpus
set(FUZZ_FLAGS "-fsanitize=fuzzer-no-link,address,undefined") set(FUZZ_FLAGS "-fsanitize=fuzzer-no-link,address,undefined")
include(CheckCXXCompilerFlag) include(CheckCXXCompilerFlag)
@@ -98,68 +104,69 @@ if(NOT APPLE)
target_link_options(conflict_set_fuzz_test PRIVATE ${FUZZ_FLAGS} target_link_options(conflict_set_fuzz_test PRIVATE ${FUZZ_FLAGS}
-fsanitize=fuzzer) -fsanitize=fuzzer)
endif() endif()
endif() endif()
# corpus tests # corpus tests
file(GLOB CORPUS_TESTS ${CMAKE_SOURCE_DIR}/corpus/*) file(GLOB CORPUS_TESTS ${CMAKE_SOURCE_DIR}/corpus/*)
add_executable(fuzz_driver ConflictSet.cpp FuzzTestDriver.cpp) add_executable(fuzz_driver ConflictSet.cpp FuzzTestDriver.cpp)
target_compile_options(fuzz_driver PRIVATE ${TEST_FLAGS}) target_compile_options(fuzz_driver PRIVATE ${TEST_FLAGS})
target_compile_definitions(fuzz_driver PRIVATE ENABLE_FUZZ) target_compile_definitions(fuzz_driver PRIVATE ENABLE_FUZZ)
target_include_directories(fuzz_driver target_include_directories(fuzz_driver
PRIVATE ${CMAKE_CURRENT_SOURCE_DIR}/include) PRIVATE ${CMAKE_CURRENT_SOURCE_DIR}/include)
foreach(TEST ${CORPUS_TESTS}) foreach(TEST ${CORPUS_TESTS})
get_filename_component(hash ${TEST} NAME) get_filename_component(hash ${TEST} NAME)
add_test(NAME conflict_set_fuzz_${hash} COMMAND fuzz_driver ${TEST}) add_test(NAME conflict_set_fuzz_${hash} COMMAND fuzz_driver ${TEST})
endforeach() endforeach()
add_executable(driver TestDriver.cpp) add_executable(driver TestDriver.cpp)
target_compile_options(driver PRIVATE ${TEST_FLAGS}) target_compile_options(driver PRIVATE ${TEST_FLAGS})
target_link_libraries(driver PRIVATE ${PROJECT_NAME}) target_link_libraries(driver PRIVATE ${PROJECT_NAME})
find_program(VALGRIND_EXE valgrind) find_program(VALGRIND_EXE valgrind)
if(VALGRIND_EXE) if(VALGRIND_EXE)
add_test(NAME conflict_set_blackbox_valgrind add_test(NAME conflict_set_blackbox_valgrind
COMMAND ${VALGRIND_EXE} --error-exitcode=99 -- $<TARGET_FILE:driver> COMMAND ${VALGRIND_EXE} --error-exitcode=99 --
${CORPUS_TESTS}) $<TARGET_FILE:driver> ${CORPUS_TESTS})
endif() endif()
foreach(TEST ${CORPUS_TESTS}) foreach(TEST ${CORPUS_TESTS})
get_filename_component(hash ${TEST} NAME) get_filename_component(hash ${TEST} NAME)
add_test(NAME conflict_set_blackbox_${hash} COMMAND driver ${TEST}) add_test(NAME conflict_set_blackbox_${hash} COMMAND driver ${TEST})
endforeach() endforeach()
# api smoke tests # api smoke tests
# c90 # c90
add_executable(conflict_set_c_api_test conflict_set_c_api_test.c) add_executable(conflict_set_c_api_test conflict_set_c_api_test.c)
target_compile_options(conflict_set_c_api_test PRIVATE ${TEST_FLAGS}) target_compile_options(conflict_set_c_api_test PRIVATE ${TEST_FLAGS})
target_link_libraries(conflict_set_c_api_test PRIVATE ${PROJECT_NAME}) target_link_libraries(conflict_set_c_api_test PRIVATE ${PROJECT_NAME})
set_property(TARGET conflict_set_c_api_test PROPERTY C_STANDARD 90) set_property(TARGET conflict_set_c_api_test PROPERTY C_STANDARD 90)
set_property(TARGET conflict_set_c_api_test PROPERTY C_STANDARD_REQUIRED ON) set_property(TARGET conflict_set_c_api_test PROPERTY C_STANDARD_REQUIRED ON)
add_test(NAME conflict_set_c_api_test COMMAND conflict_set_c_api_test) add_test(NAME conflict_set_c_api_test COMMAND conflict_set_c_api_test)
# c++98 # c++98
add_executable(conflict_set_cxx_api_test conflict_set_cxx_api_test.cpp) add_executable(conflict_set_cxx_api_test conflict_set_cxx_api_test.cpp)
target_compile_options(conflict_set_cxx_api_test PRIVATE ${TEST_FLAGS}) target_compile_options(conflict_set_cxx_api_test PRIVATE ${TEST_FLAGS})
target_link_libraries(conflict_set_cxx_api_test PRIVATE ${PROJECT_NAME}) target_link_libraries(conflict_set_cxx_api_test PRIVATE ${PROJECT_NAME})
set_property(TARGET conflict_set_cxx_api_test PROPERTY CXX_STANDARD 98) set_property(TARGET conflict_set_cxx_api_test PROPERTY CXX_STANDARD 98)
set_property(TARGET conflict_set_cxx_api_test PROPERTY CXX_STANDARD_REQUIRED ON) set_property(TARGET conflict_set_cxx_api_test PROPERTY CXX_STANDARD_REQUIRED
add_test(NAME conflict_set_cxx_api_test COMMAND conflict_set_cxx_api_test) ON)
add_test(NAME conflict_set_cxx_api_test COMMAND conflict_set_cxx_api_test)
if(NOT APPLE) if(NOT APPLE)
add_test( add_test(
NAME conflict_set_shared_symbols NAME conflict_set_shared_symbols
COMMAND ${CMAKE_SOURCE_DIR}/test_symbols.sh $<TARGET_FILE:${PROJECT_NAME}> COMMAND ${CMAKE_SOURCE_DIR}/test_symbols.sh
${CMAKE_SOURCE_DIR}/symbols.txt) $<TARGET_FILE:${PROJECT_NAME}> ${CMAKE_SOURCE_DIR}/symbols.txt)
add_test( add_test(
NAME conflict_set_static_symbols NAME conflict_set_static_symbols
COMMAND COMMAND
${CMAKE_SOURCE_DIR}/test_symbols.sh $<TARGET_FILE:${PROJECT_NAME}_static> ${CMAKE_SOURCE_DIR}/test_symbols.sh
${CMAKE_SOURCE_DIR}/symbols.txt) $<TARGET_FILE:${PROJECT_NAME}_static> ${CMAKE_SOURCE_DIR}/symbols.txt)
endif()
endif() endif()
# packaging # packaging
set(CPACK_PACKAGE_CONTACT andrew@weaselab.dev) set(CPACK_PACKAGE_CONTACT andrew@weaselab.dev)