From 3188baf052d1269c9c1d1d144ff1e6ea597d0cf6 Mon Sep 17 00:00:00 2001 From: fshstk Date: Sat, 27 Dec 2025 11:50:57 +0100 Subject: [PATCH 1/3] Refactor *.g.cpp file generation Builds using Ninja were failing due to the way that Ninja handles empty strings passed to the BYPRODUCTS property. This led to a refactoring of the conditional logic for generating *.g.cpp files. --- CMakeLists.txt | 96 ++++++++++++++++++-------------------------------- README.md | 14 +------- 2 files changed, 36 insertions(+), 74 deletions(-) diff --git a/CMakeLists.txt b/CMakeLists.txt index 1fe2ad0..a77b728 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -82,6 +82,26 @@ set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} ${COMPILER_FLAGS}") string(REPLACE ";" " " LINKER_FLAGS "${LINKER_FLAGS}") set(CMAKE_MODULE_LINKER_FLAGS "${CMAKE_MODULE_LINKER_FLAGS} ${LINKER_FLAGS}") +function(add_gen_target) + cmake_parse_arguments(PARSE_ARGV 0 arg "" "OUTFILE" "COMMAND") + set(OUTPATH "src/${arg_OUTFILE}") + add_custom_target("${arg_OUTFILE}" + WORKING_DIRECTORY ${PROJECT_SOURCE_DIR} + COMMAND + if [ ! -f "${OUTPATH}" ]\; then + ${arg_COMMAND} \; + else + echo "${OUTPATH} already exists -- skipping" \; + fi + COMMENT + "Generating ${OUTPATH}" + BYPRODUCTS + # Absolute path necessary here since CMake assumes build dir by default: + "${PROJECT_SOURCE_DIR}/${OUTPATH}" + ) + set(SOURCE_LIST "${SOURCE_LIST};${OUTPATH}" PARENT_SCOPE) +endfunction() + set(OBJECT_LIST "Device" "MuteControl" @@ -91,76 +111,30 @@ set(OBJECT_LIST "VolumeControl" ) -add_custom_target("gen") - foreach(CLASS IN LISTS OBJECT_LIST) - if(NOT EXISTS "${PROJECT_SOURCE_DIR}/src/${CLASS}.g.cpp") - # automatically generate after "make clobber" - set(BYPRODUCTS "${PROJECT_SOURCE_DIR}/src/${CLASS}.g.cpp") - else() - # don't automatically re-generate if already exists - set(BYPRODUCTS "") - endif() - add_custom_command( - TARGET "gen" - COMMAND cd "${PROJECT_SOURCE_DIR}" && - "${PROJECT_SOURCE_DIR}/scripts/generate-accessors.py" - -i "src/${CLASS}.json" - -o "src/${CLASS}.g.cpp" - COMMENT - "Generating src/${CLASS}.g.cpp" - BYPRODUCTS - "${BYPRODUCTS}" - ) - - list(APPEND SOURCE_LIST - "${PROJECT_SOURCE_DIR}/src/${CLASS}.cpp" - "${PROJECT_SOURCE_DIR}/src/${CLASS}.g.cpp" - ) + add_gen_target( + OUTFILE ${CLASS}.g.cpp + COMMAND ./scripts/generate-accessors.py + -i "src/${CLASS}.json" + -o "src/${CLASS}.g.cpp" + ) + list(APPEND SOURCE_LIST "src/${CLASS}.cpp") endforeach() -if(NOT EXISTS "${PROJECT_SOURCE_DIR}/src/Bridge.g.cpp") - set(BYPRODUCTS "${PROJECT_SOURCE_DIR}/src/Bridge.g.cpp") -else() - set(BYPRODUCTS "") -endif() -add_custom_command( - TARGET "gen" - COMMAND cd "${PROJECT_SOURCE_DIR}" && - "${PROJECT_SOURCE_DIR}/scripts/generate-bridge.py" +add_gen_target( + OUTFILE "Bridge.g.cpp" + COMMAND ./scripts/generate-bridge.py -i "src/Bridge.json" -o "src/Bridge.g.cpp" - COMMENT - "Generating src/Bridge.g.cpp" - BYPRODUCTS - "${BYPRODUCTS}" - ) - -list(APPEND SOURCE_LIST - "${PROJECT_SOURCE_DIR}/src/Bridge.g.cpp" - ) +) -if(NOT EXISTS "${PROJECT_SOURCE_DIR}/src/Strings.g.cpp") - set(BYPRODUCTS "${PROJECT_SOURCE_DIR}/src/Strings.g.cpp") -else() - set(BYPRODUCTS "") -endif() -add_custom_command( - TARGET "gen" - COMMAND cd "${PROJECT_SOURCE_DIR}" && - "${PROJECT_SOURCE_DIR}/scripts/generate-strings.py" +add_gen_target( + OUTFILE "Strings.g.cpp" + COMMAND ./scripts/generate-strings.py -c "${CMAKE_CXX_COMPILER}" -s "${CMAKE_OSX_SYSROOT}" -o "src/Strings.g.cpp" - COMMENT - "Generating src/Strings.g.cpp" - BYPRODUCTS - "${BYPRODUCTS}" - ) - -list(APPEND SOURCE_LIST - "${PROJECT_SOURCE_DIR}/src/Strings.g.cpp" - ) +) list(APPEND SOURCE_LIST "src/Client.cpp" diff --git a/README.md b/README.md index db32b68..83fc2ad 100644 --- a/README.md +++ b/README.md @@ -606,22 +606,10 @@ Build and run tests: make test ``` -Run code generation: - -``` -make gen -``` - -Remove build results: - -``` -make clean -``` - Remove build results and generated files: ``` -make clobber +make clean ``` Format code: From d4b36231f13270ce95690195a3bb39e55ba89de4 Mon Sep 17 00:00:00 2001 From: fshstk Date: Sat, 27 Dec 2025 16:39:48 +0100 Subject: [PATCH 2/3] Adapt examples to support ninja-build This requires specifying BUILD_BYPRODUCTS so ninja knows which target is producing libASPL.a. --- examples/NetcatDevice/CMakeLists.txt | 1 + examples/SinewaveDevice/CMakeLists.txt | 1 + examples/_template/CMakeLists.txt.in | 1 + 3 files changed, 3 insertions(+) diff --git a/examples/NetcatDevice/CMakeLists.txt b/examples/NetcatDevice/CMakeLists.txt index 2f10a3e..295ec5f 100644 --- a/examples/NetcatDevice/CMakeLists.txt +++ b/examples/NetcatDevice/CMakeLists.txt @@ -33,6 +33,7 @@ get_filename_component(LIBASPL_SOURCE_DIR set(LIBASPL_TARGET NetcatDevice_libASPL) include(ExternalProject) ExternalProject_Add(${LIBASPL_TARGET} + BUILD_BYPRODUCTS ${CMAKE_CURRENT_BINARY_DIR}/libASPL-prefix/lib/libASPL.a SOURCE_DIR ${LIBASPL_SOURCE_DIR} BINARY_DIR ${CMAKE_CURRENT_BINARY_DIR}/libASPL-build INSTALL_DIR ${CMAKE_CURRENT_BINARY_DIR}/libASPL-prefix diff --git a/examples/SinewaveDevice/CMakeLists.txt b/examples/SinewaveDevice/CMakeLists.txt index c1b7cea..b26c8b4 100644 --- a/examples/SinewaveDevice/CMakeLists.txt +++ b/examples/SinewaveDevice/CMakeLists.txt @@ -33,6 +33,7 @@ get_filename_component(LIBASPL_SOURCE_DIR set(LIBASPL_TARGET SinewaveDevice_libASPL) include(ExternalProject) ExternalProject_Add(${LIBASPL_TARGET} + BUILD_BYPRODUCTS ${CMAKE_CURRENT_BINARY_DIR}/libASPL-prefix/lib/libASPL.a SOURCE_DIR ${LIBASPL_SOURCE_DIR} BINARY_DIR ${CMAKE_CURRENT_BINARY_DIR}/libASPL-build INSTALL_DIR ${CMAKE_CURRENT_BINARY_DIR}/libASPL-prefix diff --git a/examples/_template/CMakeLists.txt.in b/examples/_template/CMakeLists.txt.in index 9105bb0..3d6c2cb 100644 --- a/examples/_template/CMakeLists.txt.in +++ b/examples/_template/CMakeLists.txt.in @@ -33,6 +33,7 @@ get_filename_component(LIBASPL_SOURCE_DIR set(LIBASPL_TARGET @DRIVER_NAME@_libASPL) include(ExternalProject) ExternalProject_Add(${LIBASPL_TARGET} + BUILD_BYPRODUCTS ${CMAKE_CURRENT_BINARY_DIR}/libASPL-prefix/lib/libASPL.a SOURCE_DIR ${LIBASPL_SOURCE_DIR} BINARY_DIR ${CMAKE_CURRENT_BINARY_DIR}/libASPL-build INSTALL_DIR ${CMAKE_CURRENT_BINARY_DIR}/libASPL-prefix From 3343d105269c23f6061e6210f46be53e8dff5d1d Mon Sep 17 00:00:00 2001 From: fshstk Date: Sat, 27 Dec 2025 16:59:36 +0100 Subject: [PATCH 3/3] Add fallback if no git version is found --- CMakeLists.txt | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/CMakeLists.txt b/CMakeLists.txt index a77b728..b486f31 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -9,12 +9,14 @@ execute_process( OUTPUT_STRIP_TRAILING_WHITESPACE COMMAND sh -c "cd \"${PROJECT_SOURCE_DIR}\" && git describe --tags --abbrev=0" ) -string(REGEX MATCH "v?([0-9.]+)" RESULT ${GIT_TAG}) +string(REGEX MATCH "v?([0-9.]+)" RESULT "${GIT_TAG}") set(GIT_TAG "${CMAKE_MATCH_1}") if(NOT GIT_TAG STREQUAL "") message(STATUS "Detected version tag from git: ${GIT_TAG}") + set(PACKAGE_VERSION "${GIT_TAG}") else() message(WARNING "Unable to detect version tag from git") + set(PACKAGE_VERSION "0.0.0") endif() if(CMAKE_OSX_SYSROOT STREQUAL "") @@ -32,8 +34,6 @@ else() endif() set(PACKAGE_NAME libASPL) -set(PACKAGE_VERSION ${GIT_TAG}) - set(LIB_TARGET libASPL) set(LIB_NAME ASPL) set(TEST_NAME aspl-test)