From b46b61a3ffe084d0fadb22941b3baee3d463f839 Mon Sep 17 00:00:00 2001 From: Rob-ot Jacob Date: Thu, 5 Mar 2026 22:55:33 +0000 Subject: [PATCH 1/3] Fix cmake build: use target_link_libraries instead of LINK_FLAGS LINK_FLAGS places library flags before object files in the linker command, causing undefined reference errors with GNU ld which requires libraries to appear after the object files that use them. Replace LINK_FLAGS with target_link_options (for rpath) and target_link_libraries (for wxWidgets and NetCDF libraries) so that the link order is correct. Co-Authored-By: Oz --- src/CMakeLists.txt | 7 ++++++- 1 file changed, 6 insertions(+), 1 deletion(-) diff --git a/src/CMakeLists.txt b/src/CMakeLists.txt index 075c56d..0656752 100644 --- a/src/CMakeLists.txt +++ b/src/CMakeLists.txt @@ -34,9 +34,14 @@ set_target_properties(ncvis CXX_STANDARD 11 CXX_STANDARD_REQUIRED YES CXX_EXTENSIONS NO - LINK_FLAGS "${NCVIS_LINKER_FLAGS}" ) +# Link libraries after object files (required for GNU ld) +target_link_options(ncvis PRIVATE -Wl,-rpath,${WXCONFIG_RPATH}/lib) +separate_arguments(WX_LINK_LIBS UNIX_COMMAND "${WX_LINK_FLAGS}") +separate_arguments(NC_LINK_LIBS UNIX_COMMAND "-L${NC_LIB_DIR} -lnetcdf ${NC_LINK_FLAGS}") +target_link_libraries(ncvis PRIVATE ${WX_LINK_LIBS} ${NC_LINK_LIBS}) + # Install target INSTALL(TARGETS ncvis RUNTIME DESTINATION bin From abbf89b2df8bf64755ab9a1bd7c8497d6517740d Mon Sep 17 00:00:00 2001 From: Rob-ot Jacob Date: Fri, 6 Mar 2026 05:28:13 +0000 Subject: [PATCH 2/3] Address Copilot review: improve CMake link handling - Use BUILD_RPATH/INSTALL_RPATH properties instead of raw -Wl,-rpath flag - Use target_link_directories instead of -L flag in separate_arguments - Split link items into libraries (target_link_libraries) and flags (target_link_options) - Use NATIVE_COMMAND instead of UNIX_COMMAND in separate_arguments Co-Authored-By: Oz --- src/CMakeLists.txt | 37 +++++++++++++++++++++++++++++++++---- 1 file changed, 33 insertions(+), 4 deletions(-) diff --git a/src/CMakeLists.txt b/src/CMakeLists.txt index 0656752..54bcfc9 100644 --- a/src/CMakeLists.txt +++ b/src/CMakeLists.txt @@ -34,13 +34,42 @@ set_target_properties(ncvis CXX_STANDARD 11 CXX_STANDARD_REQUIRED YES CXX_EXTENSIONS NO + BUILD_RPATH "${WXCONFIG_RPATH}/lib" + INSTALL_RPATH "${WXCONFIG_RPATH}/lib" ) # Link libraries after object files (required for GNU ld) -target_link_options(ncvis PRIVATE -Wl,-rpath,${WXCONFIG_RPATH}/lib) -separate_arguments(WX_LINK_LIBS UNIX_COMMAND "${WX_LINK_FLAGS}") -separate_arguments(NC_LINK_LIBS UNIX_COMMAND "-L${NC_LIB_DIR} -lnetcdf ${NC_LINK_FLAGS}") -target_link_libraries(ncvis PRIVATE ${WX_LINK_LIBS} ${NC_LINK_LIBS}) +separate_arguments(WX_LINK_ITEMS NATIVE_COMMAND "${WX_LINK_FLAGS}") +separate_arguments(NC_LINK_ITEMS NATIVE_COMMAND "-lnetcdf ${NC_LINK_FLAGS}") +target_link_directories(ncvis PRIVATE ${NC_LIB_DIR}) + +# Split wxWidgets link items into libraries (-l...) and other linker options +set(WX_LIBRARIES "") +set(WX_OPTIONS "") +foreach(item IN LISTS WX_LINK_ITEMS) + if(item MATCHES "^-l.+") + list(APPEND WX_LIBRARIES "${item}") + else() + list(APPEND WX_OPTIONS "${item}") + endif() +endforeach() + +# Split NetCDF link items into libraries (-l...) and other linker options +set(NC_LIBRARIES "") +set(NC_OPTIONS "") +foreach(item IN LISTS NC_LINK_ITEMS) + if(item MATCHES "^-l.+") + list(APPEND NC_LIBRARIES "${item}") + else() + list(APPEND NC_OPTIONS "${item}") + endif() +endforeach() + +# Link true libraries +target_link_libraries(ncvis PRIVATE ${WX_LIBRARIES} ${NC_LIBRARIES}) + +# Apply non-library linker options +target_link_options(ncvis PRIVATE ${WX_OPTIONS} ${NC_OPTIONS}) # Install target INSTALL(TARGETS ncvis From 518ca5c08571f07e28a319b81e25e8db8c400b99 Mon Sep 17 00:00:00 2001 From: Rajeev Jain Date: Wed, 2 Sep 2026 13:18:59 -0500 Subject: [PATCH 3/3] Use find_package results for linking instead of parsing config output Splitting wx-config output token-by-token separates '-framework' from the framework name: target_link_libraries turns the name into -lCocoa, and target_link_options de-duplicates the repeated '-framework' tokens, leaving bare words on the link line. Both fail on macOS. wxWidgets_LIBRARIES and NETCDF_LIBRARIES are already populated by the existing find_package calls and keep such items intact. --- src/CMakeLists.txt | 37 +++++-------------------------------- 1 file changed, 5 insertions(+), 32 deletions(-) diff --git a/src/CMakeLists.txt b/src/CMakeLists.txt index 54bcfc9..4692967 100644 --- a/src/CMakeLists.txt +++ b/src/CMakeLists.txt @@ -38,38 +38,11 @@ set_target_properties(ncvis INSTALL_RPATH "${WXCONFIG_RPATH}/lib" ) -# Link libraries after object files (required for GNU ld) -separate_arguments(WX_LINK_ITEMS NATIVE_COMMAND "${WX_LINK_FLAGS}") -separate_arguments(NC_LINK_ITEMS NATIVE_COMMAND "-lnetcdf ${NC_LINK_FLAGS}") -target_link_directories(ncvis PRIVATE ${NC_LIB_DIR}) - -# Split wxWidgets link items into libraries (-l...) and other linker options -set(WX_LIBRARIES "") -set(WX_OPTIONS "") -foreach(item IN LISTS WX_LINK_ITEMS) - if(item MATCHES "^-l.+") - list(APPEND WX_LIBRARIES "${item}") - else() - list(APPEND WX_OPTIONS "${item}") - endif() -endforeach() - -# Split NetCDF link items into libraries (-l...) and other linker options -set(NC_LIBRARIES "") -set(NC_OPTIONS "") -foreach(item IN LISTS NC_LINK_ITEMS) - if(item MATCHES "^-l.+") - list(APPEND NC_LIBRARIES "${item}") - else() - list(APPEND NC_OPTIONS "${item}") - endif() -endforeach() - -# Link true libraries -target_link_libraries(ncvis PRIVATE ${WX_LIBRARIES} ${NC_LIBRARIES}) - -# Apply non-library linker options -target_link_options(ncvis PRIVATE ${WX_OPTIONS} ${NC_OPTIONS}) +# Link libraries after object files (required for GNU ld). +# Use the results of find_package rather than parsing wx-config/nc-config +# output: those are already correct lists and preserve multi-token items such +# as "-framework Cocoa", which token-by-token filtering breaks on macOS. +target_link_libraries(ncvis PRIVATE ${wxWidgets_LIBRARIES} ${NETCDF_LIBRARIES}) # Install target INSTALL(TARGETS ncvis