From 0be7d3d39eb4fb8e3fe07bd953288f69bf519ca6 Mon Sep 17 00:00:00 2001 From: Hennadii Stepanov <32963518+hebasto@users.noreply.github.com> Date: Tue, 17 Dec 2024 14:13:53 +0000 Subject: [PATCH 1/2] cmake: Enable `APPEND_*FLAGS` only for command-line generators Command-line build tool generators are the only ones that support low-level rule variables. IDE build tool generators, such as "Visual Studio" and "Xcode", do not utilize these variables when creating project files. This change ensures that CMake warns users if any of the `SECP256K1_APPEND_*FLAGS` options are set while using an unsupported generator. --- CMakeLists.txt | 35 +++++++++++++++++++---------------- 1 file changed, 19 insertions(+), 16 deletions(-) diff --git a/CMakeLists.txt b/CMakeLists.txt index aba6e51259..8ca94e6dcd 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -280,19 +280,20 @@ if(SECP256K1_BUILD_CTIME_TESTS) unset(msan_enabled) endif() -set(SECP256K1_APPEND_CFLAGS "" CACHE STRING "Compiler flags that are appended to the command line after all other flags added by the build system. This variable is intended for debugging and special builds.") -if(SECP256K1_APPEND_CFLAGS) - # Appending to this low-level rule variable is the only way to +# Only some generators use low-level rule variables. +if(CMAKE_GENERATOR MATCHES "Make|Ninja") + # Appending to the low-level rule variables is the only way to # guarantee that the flags appear at the end of the command line. - string(APPEND CMAKE_C_COMPILE_OBJECT " ${SECP256K1_APPEND_CFLAGS}") -endif() + set(SECP256K1_APPEND_CFLAGS "" CACHE STRING "Compiler flags that are appended to the command line after all other flags added by the build system. This variable is intended for debugging and special builds.") + if(SECP256K1_APPEND_CFLAGS) + string(APPEND CMAKE_C_COMPILE_OBJECT " ${SECP256K1_APPEND_CFLAGS}") + endif() -set(SECP256K1_APPEND_LDFLAGS "" CACHE STRING "Linker flags that are appended to the command line after all other flags added by the build system. This variable is intended for debugging and special builds.") -if(SECP256K1_APPEND_LDFLAGS) - # Appending to this low-level rule variable is the only way to - # guarantee that the flags appear at the end of the command line. - string(APPEND CMAKE_C_CREATE_SHARED_LIBRARY " ${SECP256K1_APPEND_LDFLAGS}") - string(APPEND CMAKE_C_LINK_EXECUTABLE " ${SECP256K1_APPEND_LDFLAGS}") + set(SECP256K1_APPEND_LDFLAGS "" CACHE STRING "Linker flags that are appended to the command line after all other flags added by the build system. This variable is intended for debugging and special builds.") + if(SECP256K1_APPEND_LDFLAGS) + string(APPEND CMAKE_C_CREATE_SHARED_LIBRARY " ${SECP256K1_APPEND_LDFLAGS}") + string(APPEND CMAKE_C_LINK_EXECUTABLE " ${SECP256K1_APPEND_LDFLAGS}") + endif() endif() if(NOT CMAKE_RUNTIME_OUTPUT_DIRECTORY) @@ -381,11 +382,13 @@ else() message(" - LDFLAGS for executables ............ ${CMAKE_EXE_LINKER_FLAGS_DEBUG}") message(" - LDFLAGS for shared libraries ....... ${CMAKE_SHARED_LINKER_FLAGS_DEBUG}") endif() -if(SECP256K1_APPEND_CFLAGS) - message("SECP256K1_APPEND_CFLAGS ............... ${SECP256K1_APPEND_CFLAGS}") -endif() -if(SECP256K1_APPEND_LDFLAGS) - message("SECP256K1_APPEND_LDFLAGS .............. ${SECP256K1_APPEND_LDFLAGS}") +if(CMAKE_GENERATOR MATCHES "Make|Ninja") + if(SECP256K1_APPEND_CFLAGS) + message("SECP256K1_APPEND_CFLAGS ............... ${SECP256K1_APPEND_CFLAGS}") + endif() + if(SECP256K1_APPEND_LDFLAGS) + message("SECP256K1_APPEND_LDFLAGS .............. ${SECP256K1_APPEND_LDFLAGS}") + endif() endif() message("") if(print_msan_notice) From c12bc0163b03210e6187906273c6063dd94aa284 Mon Sep 17 00:00:00 2001 From: Hennadii Stepanov <32963518+hebasto@users.noreply.github.com> Date: Sun, 15 Dec 2024 12:00:59 +0000 Subject: [PATCH 2/2] cmake: Fix passing `SECP256K1_APPEND_CFLAGS` to clang-cl This change also makes the compile invocation string more natural by ensuring flags do not follow source files. Linker flags are also amended for consistency. --- CMakeLists.txt | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/CMakeLists.txt b/CMakeLists.txt index 8ca94e6dcd..2e4ae71bcc 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -286,13 +286,13 @@ if(CMAKE_GENERATOR MATCHES "Make|Ninja") # guarantee that the flags appear at the end of the command line. set(SECP256K1_APPEND_CFLAGS "" CACHE STRING "Compiler flags that are appended to the command line after all other flags added by the build system. This variable is intended for debugging and special builds.") if(SECP256K1_APPEND_CFLAGS) - string(APPEND CMAKE_C_COMPILE_OBJECT " ${SECP256K1_APPEND_CFLAGS}") + string(REPLACE "" " ${SECP256K1_APPEND_CFLAGS}" CMAKE_C_COMPILE_OBJECT "${CMAKE_C_COMPILE_OBJECT}") endif() set(SECP256K1_APPEND_LDFLAGS "" CACHE STRING "Linker flags that are appended to the command line after all other flags added by the build system. This variable is intended for debugging and special builds.") if(SECP256K1_APPEND_LDFLAGS) - string(APPEND CMAKE_C_CREATE_SHARED_LIBRARY " ${SECP256K1_APPEND_LDFLAGS}") - string(APPEND CMAKE_C_LINK_EXECUTABLE " ${SECP256K1_APPEND_LDFLAGS}") + string(REPLACE "" " ${SECP256K1_APPEND_LDFLAGS}" CMAKE_C_CREATE_SHARED_LIBRARY "${CMAKE_C_CREATE_SHARED_LIBRARY}") + string(REPLACE "" " ${SECP256K1_APPEND_LDFLAGS}" CMAKE_C_LINK_EXECUTABLE "${CMAKE_C_LINK_EXECUTABLE}") endif() endif()