diff --git a/CMakeLists.txt b/CMakeLists.txt index 8c39ecd..ed789ef 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -7,27 +7,37 @@ include(CMakePackageConfigHelpers) set(AKERR_USE_STDLIB 1 CACHE BOOL "Use the C standard library") set(akerror_install_cmakedir "${CMAKE_INSTALL_LIBDIR}/cmake/akerror") -set(SCRIPT ${CMAKE_SOURCE_DIR}/scripts/generrno.sh) -set(INFILE ${CMAKE_SOURCE_DIR}/include/akerror.tmpl.h) -set(OUTFILES ${CMAKE_SOURCE_DIR}/src/errno.c ${CMAKE_SOURCE_DIR}/include/akerror.h) +set(SCRIPT ${CMAKE_CURRENT_SOURCE_DIR}/scripts/generrno.sh) +set(INFILE ${CMAKE_CURRENT_SOURCE_DIR}/include/akerror.tmpl.h) + +set(GENERATED_DIR ${CMAKE_CURRENT_BINARY_DIR}/generated) + +set(GENERATED_ERRNO_C ${GENERATED_DIR}/src/errno.c) +set(GENERATED_AKERROR_H ${GENERATED_DIR}/include/akerror.h) + add_custom_command( - OUTPUT ${OUTFILES} - COMMAND ${CMAKE_COMMAND} -E make_directory ${CMAKE_SOURCE_DIR} - COMMAND /usr/bin/env bash ${SCRIPT} ${CMAKE_SOURCE_DIR} + OUTPUT ${GENERATED_ERRNO_C} ${GENERATED_AKERROR_H} + COMMAND ${CMAKE_COMMAND} -E make_directory ${GENERATED_DIR} + COMMAND /usr/bin/env bash + ${SCRIPT} + ${CMAKE_CURRENT_SOURCE_DIR} + ${GENERATED_DIR} DEPENDS ${SCRIPT} ${INFILE} VERBATIM ) -set_source_files_properties(src/errno.c PROPERTIES GENERATED TRUE) - -add_custom_target(generrno DEPENDS src/errno.c) - -find_package(PkgConfig REQUIRED) add_library(akerror SHARED src/error.c - src/errno.c + ${GENERATED_ERRNO_C} ) -add_dependencies(akerror generrno) + +target_include_directories(akerror PUBLIC + $/include + $ +) + +find_package(PkgConfig REQUIRED) +add_library(akerror::akerror ALIAS akerror) target_compile_definitions(akerror PUBLIC AKERR_USE_STDLIB=${AKERR_USE_STDLIB} @@ -42,11 +52,6 @@ add_test(NAME err_cleanup COMMAND test_err_cleanup) add_test(NAME err_trace COMMAND test_err_trace) add_test(NAME err_improper_closure COMMAND test_err_improper_closure) -# Specify include directories for the library's headers (if applicable) -target_include_directories(akerror PUBLIC - $ - $ -) target_link_libraries(test_err_catch PRIVATE akerror) target_link_libraries(test_err_cleanup PRIVATE akerror) target_link_libraries(test_err_trace PRIVATE akerror) diff --git a/scripts/generrno.sh b/scripts/generrno.sh index 8252228..df8e610 100644 --- a/scripts/generrno.sh +++ b/scripts/generrno.sh @@ -1,16 +1,20 @@ #!/bin/bash srcdir=$1 -rm -f ${srcdir}/src/errno.c -echo "#include " >> ${srcdir}/src/errno.c -echo "#include " >> ${srcdir}/src/errno.c -echo "void akerr_init_errno(void) {" >> ${srcdir}/src/errno.c +outdir=$2 + +mkdir -p ${outdir}/src +mkdir -p ${outdir}/include +rm -f ${outdir}/src/errno.c +echo "#include " >> ${outdir}/src/errno.c +echo "#include " >> ${outdir}/src/errno.c +echo "void akerr_init_errno(void) {" >> ${outdir}/src/errno.c maxval=$(errno --list | cut -d ' ' -f 2 | sort -g | tail -n 1) errno --list | while read LINE; do define=$(echo "$LINE" | cut -d ' ' -f 1); value=$(echo "$LINE" | cut -d ' ' -f 2); desc=$(echo "$LINE" | cut -d ' ' -f 3-); - echo " akerr_name_for_status(${define}, \"${desc}\");" >> ${srcdir}/src/errno.c ; + echo " akerr_name_for_status(${define}, \"${desc}\");" >> ${outdir}/src/errno.c ; done; -echo "}" >> ${srcdir}/src/errno.c -sed "s/#define AKERR_LAST_ERRNO_VALUE .*/#define AKERR_LAST_ERRNO_VALUE ${maxval}/" ${srcdir}/include/akerror.tmpl.h > ${srcdir}/include/akerror.h +echo "}" >> ${outdir}/src/errno.c +sed "s/#define AKERR_LAST_ERRNO_VALUE .*/#define AKERR_LAST_ERRNO_VALUE ${maxval}/" ${srcdir}/include/akerror.tmpl.h > ${outdir}/include/akerror.h