|
|
|
|
@@ -158,18 +158,10 @@ add_custom_command(
|
|
|
|
|
VERBATIM
|
|
|
|
|
)
|
|
|
|
|
|
|
|
|
|
# More than one library target consumes the generated sources below. Route
|
|
|
|
|
# them through one explicit prerequisite so parallel Make builds cannot invoke
|
|
|
|
|
# the same generator twice and interleave writes to errno.c.
|
|
|
|
|
add_custom_target(akerror_generated
|
|
|
|
|
DEPENDS ${GENERATED_ERRNO_C} ${GENERATED_AKERROR_H}
|
|
|
|
|
)
|
|
|
|
|
|
|
|
|
|
add_library(akerror SHARED
|
|
|
|
|
src/error.c
|
|
|
|
|
${GENERATED_ERRNO_C}
|
|
|
|
|
)
|
|
|
|
|
add_dependencies(akerror akerror_generated)
|
|
|
|
|
|
|
|
|
|
target_include_directories(akerror PUBLIC
|
|
|
|
|
$<BUILD_INTERFACE:${GENERATED_DIR}/include>
|
|
|
|
|
@@ -208,32 +200,6 @@ set_target_properties(akerror PROPERTIES
|
|
|
|
|
akerr_instrument_for_coverage(akerror)
|
|
|
|
|
akerr_instrument_for_sanitizers(akerror)
|
|
|
|
|
|
|
|
|
|
# akerr_init() must terminate if it cannot reserve the library-owned status
|
|
|
|
|
# band. The production table sizes are deliberately PRIVATE, so exercise that
|
|
|
|
|
# otherwise unreachable startup failure with a second library target whose
|
|
|
|
|
# private registries cannot accept even the first reservation. Keeping this a
|
|
|
|
|
# distinct target is the test: no compile definition leaks into consumers or
|
|
|
|
|
# weakens the production library.
|
|
|
|
|
add_library(akerror_init_failure SHARED
|
|
|
|
|
src/error.c
|
|
|
|
|
${GENERATED_ERRNO_C}
|
|
|
|
|
)
|
|
|
|
|
add_dependencies(akerror_init_failure akerror_generated)
|
|
|
|
|
target_include_directories(akerror_init_failure PUBLIC
|
|
|
|
|
${GENERATED_DIR}/include
|
|
|
|
|
)
|
|
|
|
|
target_compile_definitions(akerror_init_failure
|
|
|
|
|
PUBLIC AKERR_USE_STDLIB=${AKERR_USE_STDLIB}
|
|
|
|
|
PRIVATE AKERR_STATUS_NAME_SLOTS=8
|
|
|
|
|
PRIVATE AKERR_MAX_RESERVED_STATUS_RANGES=0
|
|
|
|
|
PRIVATE ${AKERR_THREADS_DEFINE}
|
|
|
|
|
)
|
|
|
|
|
if(AKERR_THREAD_SAFE)
|
|
|
|
|
target_link_libraries(akerror_init_failure PRIVATE Threads::Threads)
|
|
|
|
|
endif()
|
|
|
|
|
akerr_instrument_for_coverage(akerror_init_failure)
|
|
|
|
|
akerr_instrument_for_sanitizers(akerror_init_failure)
|
|
|
|
|
|
|
|
|
|
# Each test is one source file in tests/ built into test_<name> and registered
|
|
|
|
|
# as CTest <name>. Tests expected to abort (unhandled error / contract
|
|
|
|
|
# violation) go in AKERR_WILL_FAIL_TESTS; all others must exit 0.
|
|
|
|
|
@@ -261,7 +227,6 @@ set(AKERR_TESTS
|
|
|
|
|
err_registry_init_order
|
|
|
|
|
err_status_exception
|
|
|
|
|
err_copy_string
|
|
|
|
|
err_init_reservation_fatal
|
|
|
|
|
err_library_status_fatal
|
|
|
|
|
err_refcount_double_fail
|
|
|
|
|
err_stacktrace_bounds
|
|
|
|
|
@@ -289,18 +254,13 @@ endif()
|
|
|
|
|
set(AKERR_WILL_FAIL_TESTS
|
|
|
|
|
err_trace
|
|
|
|
|
err_improper_closure
|
|
|
|
|
err_init_reservation_fatal
|
|
|
|
|
err_library_status_fatal
|
|
|
|
|
)
|
|
|
|
|
|
|
|
|
|
foreach(_test IN LISTS AKERR_TESTS)
|
|
|
|
|
add_executable(test_${_test} tests/${_test}.c)
|
|
|
|
|
target_include_directories(test_${_test} PRIVATE ${CMAKE_CURRENT_SOURCE_DIR}/tests)
|
|
|
|
|
if(_test STREQUAL "err_init_reservation_fatal")
|
|
|
|
|
target_link_libraries(test_${_test} PRIVATE akerror_init_failure)
|
|
|
|
|
else()
|
|
|
|
|
target_link_libraries(test_${_test} PRIVATE akerror)
|
|
|
|
|
endif()
|
|
|
|
|
if(AKERR_THREAD_SAFE)
|
|
|
|
|
target_link_libraries(test_${_test} PRIVATE Threads::Threads)
|
|
|
|
|
endif()
|
|
|
|
|
@@ -345,14 +305,7 @@ if(Python3_FOUND)
|
|
|
|
|
# The script configures and drives its own instrumented build tree (under
|
|
|
|
|
# ${CMAKE_BINARY_DIR}/coverage) so this build's binaries and its coverage
|
|
|
|
|
# counters can never be stale or half-instrumented. Reports via gcov.
|
|
|
|
|
# Keep the convenient generic name at the top level, but namespace it when
|
|
|
|
|
# embedded so a parent project can provide its own coverage target.
|
|
|
|
|
if(CMAKE_SOURCE_DIR STREQUAL CMAKE_CURRENT_SOURCE_DIR)
|
|
|
|
|
set(AKERR_COVERAGE_TARGET coverage)
|
|
|
|
|
else()
|
|
|
|
|
set(AKERR_COVERAGE_TARGET akerror_coverage)
|
|
|
|
|
endif()
|
|
|
|
|
add_custom_target(${AKERR_COVERAGE_TARGET}
|
|
|
|
|
add_custom_target(coverage
|
|
|
|
|
COMMAND ${Python3_EXECUTABLE}
|
|
|
|
|
${CMAKE_CURRENT_SOURCE_DIR}/scripts/coverage.py
|
|
|
|
|
--source-root ${CMAKE_CURRENT_SOURCE_DIR}
|
|
|
|
|
@@ -407,17 +360,8 @@ configure_package_config_file(
|
|
|
|
|
INSTALL_DESTINATION ${akerror_install_cmakedir}
|
|
|
|
|
)
|
|
|
|
|
|
|
|
|
|
# The SOVERSION is the project major version, so packages with the same major
|
|
|
|
|
# are ABI-compatible and a different major must be rejected.
|
|
|
|
|
write_basic_package_version_file(
|
|
|
|
|
"${CMAKE_CURRENT_BINARY_DIR}/akerrorConfigVersion.cmake"
|
|
|
|
|
VERSION ${PROJECT_VERSION}
|
|
|
|
|
COMPATIBILITY SameMajorVersion
|
|
|
|
|
)
|
|
|
|
|
|
|
|
|
|
install(FILES
|
|
|
|
|
"${CMAKE_CURRENT_BINARY_DIR}/akerrorConfig.cmake"
|
|
|
|
|
"${CMAKE_CURRENT_BINARY_DIR}/akerrorConfigVersion.cmake"
|
|
|
|
|
DESTINATION ${akerror_install_cmakedir}
|
|
|
|
|
)
|
|
|
|
|
|
|
|
|
|
|