From 45dcb68ecad8ea9d2d0eca19d8d6106e12ae1daf Mon Sep 17 00:00:00 2001 From: Chase Naples Date: Mon, 6 Oct 2025 08:35:35 -0400 Subject: [PATCH 1/4] cmake: surface headers in Visual Studio solution --- CMakeLists.txt | 36 +++++++++++++++++++++++++++++++++++- 1 file changed, 35 insertions(+), 1 deletion(-) diff --git a/CMakeLists.txt b/CMakeLists.txt index b306dc1c..814892d4 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -17,7 +17,41 @@ target_compile_features(GSL INTERFACE "cxx_std_14") # Setup include directory add_subdirectory(include) -target_sources(GSL INTERFACE $) +set(GSL_HEADER_FILES + ${GSL_SOURCE_DIR}/include/gsl/algorithm + ${GSL_SOURCE_DIR}/include/gsl/assert + ${GSL_SOURCE_DIR}/include/gsl/byte + ${GSL_SOURCE_DIR}/include/gsl/gsl + ${GSL_SOURCE_DIR}/include/gsl/narrow + ${GSL_SOURCE_DIR}/include/gsl/pointers + ${GSL_SOURCE_DIR}/include/gsl/span + ${GSL_SOURCE_DIR}/include/gsl/span_ext + ${GSL_SOURCE_DIR}/include/gsl/util + ${GSL_SOURCE_DIR}/include/gsl/zstring +) + +target_sources(GSL INTERFACE + ${GSL_HEADER_FILES} + $ +) + +if (CMAKE_GENERATOR MATCHES "Visual Studio") + source_group(TREE ${GSL_SOURCE_DIR}/include PREFIX "Header Files" FILES ${GSL_HEADER_FILES}) + + set(GSL_SOLUTION_FILES + ${GSL_SOURCE_DIR}/.clang-format + ${GSL_SOURCE_DIR}/.gitattributes + ${GSL_SOURCE_DIR}/.gitignore + ${GSL_SOURCE_DIR}/CMakeSettings.json + ${GSL_SOURCE_DIR}/CONTRIBUTING.md + ${GSL_SOURCE_DIR}/LICENSE + ${GSL_SOURCE_DIR}/README.md + ${GSL_SOURCE_DIR}/SECURITY.md + ${GSL_SOURCE_DIR}/ThirdPartyNotices.txt + ) + + set_property(DIRECTORY APPEND PROPERTY VS_SOLUTION_ITEMS ${GSL_SOLUTION_FILES}) +endif() if (GSL_TEST) enable_testing() From 5146d3126ccc2feb167a781250e77080dd40add9 Mon Sep 17 00:00:00 2001 From: Chase Naples Date: Tue, 7 Oct 2025 17:57:35 -0400 Subject: [PATCH 2/4] cmake: fix interface header paths --- CMakeLists.txt | 40 ++++++++++++++++++++++++++++------------ 1 file changed, 28 insertions(+), 12 deletions(-) diff --git a/CMakeLists.txt b/CMakeLists.txt index 814892d4..1783173b 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -18,25 +18,41 @@ target_compile_features(GSL INTERFACE "cxx_std_14") add_subdirectory(include) set(GSL_HEADER_FILES - ${GSL_SOURCE_DIR}/include/gsl/algorithm - ${GSL_SOURCE_DIR}/include/gsl/assert - ${GSL_SOURCE_DIR}/include/gsl/byte - ${GSL_SOURCE_DIR}/include/gsl/gsl - ${GSL_SOURCE_DIR}/include/gsl/narrow - ${GSL_SOURCE_DIR}/include/gsl/pointers - ${GSL_SOURCE_DIR}/include/gsl/span - ${GSL_SOURCE_DIR}/include/gsl/span_ext - ${GSL_SOURCE_DIR}/include/gsl/util - ${GSL_SOURCE_DIR}/include/gsl/zstring + gsl/algorithm + gsl/assert + gsl/byte + gsl/gsl + gsl/narrow + gsl/pointers + gsl/span + gsl/span_ext + gsl/util + gsl/zstring ) +# Build/install interface lists ensure CMake is happy when exporting headers via +# INTERFACE sources. Absolute paths would be rejected by newer CMake versions +# (discovered while testing with 4.1). +set(GSL_HEADER_INTERFACE_SOURCES) +foreach(header ${GSL_HEADER_FILES}) + list(APPEND GSL_HEADER_INTERFACE_SOURCES + $ + $ + ) +endforeach() + target_sources(GSL INTERFACE - ${GSL_HEADER_FILES} + ${GSL_HEADER_INTERFACE_SOURCES} $ ) if (CMAKE_GENERATOR MATCHES "Visual Studio") - source_group(TREE ${GSL_SOURCE_DIR}/include PREFIX "Header Files" FILES ${GSL_HEADER_FILES}) + # Visual Studio still needs concrete file paths for solution grouping. + set(GSL_HEADER_ABSOLUTE_PATHS) + foreach(header ${GSL_HEADER_FILES}) + list(APPEND GSL_HEADER_ABSOLUTE_PATHS ${GSL_SOURCE_DIR}/include/${header}) + endforeach() + source_group(TREE ${GSL_SOURCE_DIR}/include PREFIX "Header Files" FILES ${GSL_HEADER_ABSOLUTE_PATHS}) set(GSL_SOLUTION_FILES ${GSL_SOURCE_DIR}/.clang-format From d43635bbabee7559e44731dd9dd56eff1bb07a67 Mon Sep 17 00:00:00 2001 From: Chase Naples Date: Wed, 8 Oct 2025 00:00:57 -0400 Subject: [PATCH 3/4] cmake: glob headers and surface solution docs --- CMakeLists.txt | 18 ++++++------------ 1 file changed, 6 insertions(+), 12 deletions(-) diff --git a/CMakeLists.txt b/CMakeLists.txt index 1783173b..2ee5c3d4 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -17,18 +17,11 @@ target_compile_features(GSL INTERFACE "cxx_std_14") # Setup include directory add_subdirectory(include) -set(GSL_HEADER_FILES - gsl/algorithm - gsl/assert - gsl/byte - gsl/gsl - gsl/narrow - gsl/pointers - gsl/span - gsl/span_ext - gsl/util - gsl/zstring +file(GLOB GSL_HEADER_FILES + RELATIVE "${CMAKE_CURRENT_SOURCE_DIR}/include" + "${CMAKE_CURRENT_SOURCE_DIR}/include/gsl/*" ) +list(SORT GSL_HEADER_FILES) # Build/install interface lists ensure CMake is happy when exporting headers via # INTERFACE sources. Absolute paths would be rejected by newer CMake versions @@ -66,7 +59,8 @@ if (CMAKE_GENERATOR MATCHES "Visual Studio") ${GSL_SOURCE_DIR}/ThirdPartyNotices.txt ) - set_property(DIRECTORY APPEND PROPERTY VS_SOLUTION_ITEMS ${GSL_SOLUTION_FILES}) + set_property(DIRECTORY PROPERTY VS_SOLUTION_ITEMS ${GSL_SOLUTION_FILES}) + source_group("Solution Items" FILES ${GSL_SOLUTION_FILES}) endif() if (GSL_TEST) From 8fce2e7e885de2987e8e3b7ad2f1ca70c0605fe1 Mon Sep 17 00:00:00 2001 From: Chase Naples Date: Wed, 8 Oct 2025 16:55:17 -0400 Subject: [PATCH 4/4] cmake: avoid VS solution items property --- CMakeLists.txt | 24 +++++++++++------------- 1 file changed, 11 insertions(+), 13 deletions(-) diff --git a/CMakeLists.txt b/CMakeLists.txt index 2ee5c3d4..4f9bc0f2 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -21,11 +21,9 @@ file(GLOB GSL_HEADER_FILES RELATIVE "${CMAKE_CURRENT_SOURCE_DIR}/include" "${CMAKE_CURRENT_SOURCE_DIR}/include/gsl/*" ) -list(SORT GSL_HEADER_FILES) # Build/install interface lists ensure CMake is happy when exporting headers via -# INTERFACE sources. Absolute paths would be rejected by newer CMake versions -# (discovered while testing with 4.1). +# INTERFACE sources. Absolute paths would be rejected starting with CMake 4.1.2. set(GSL_HEADER_INTERFACE_SOURCES) foreach(header ${GSL_HEADER_FILES}) list(APPEND GSL_HEADER_INTERFACE_SOURCES @@ -40,14 +38,8 @@ target_sources(GSL INTERFACE ) if (CMAKE_GENERATOR MATCHES "Visual Studio") - # Visual Studio still needs concrete file paths for solution grouping. - set(GSL_HEADER_ABSOLUTE_PATHS) - foreach(header ${GSL_HEADER_FILES}) - list(APPEND GSL_HEADER_ABSOLUTE_PATHS ${GSL_SOURCE_DIR}/include/${header}) - endforeach() - source_group(TREE ${GSL_SOURCE_DIR}/include PREFIX "Header Files" FILES ${GSL_HEADER_ABSOLUTE_PATHS}) - - set(GSL_SOLUTION_FILES + file(GLOB GSL_WORKSPACE_FILES "${CMAKE_CURRENT_SOURCE_DIR}/include/gsl/*") + list(APPEND GSL_WORKSPACE_FILES ${GSL_SOURCE_DIR}/.clang-format ${GSL_SOURCE_DIR}/.gitattributes ${GSL_SOURCE_DIR}/.gitignore @@ -59,8 +51,14 @@ if (CMAKE_GENERATOR MATCHES "Visual Studio") ${GSL_SOURCE_DIR}/ThirdPartyNotices.txt ) - set_property(DIRECTORY PROPERTY VS_SOLUTION_ITEMS ${GSL_SOLUTION_FILES}) - source_group("Solution Items" FILES ${GSL_SOLUTION_FILES}) + target_sources(GSL PRIVATE ${GSL_WORKSPACE_FILES}) + + set(GSL_HEADER_ABSOLUTE_PATHS) + foreach(header ${GSL_HEADER_FILES}) + list(APPEND GSL_HEADER_ABSOLUTE_PATHS ${GSL_SOURCE_DIR}/include/${header}) + endforeach() + source_group(TREE ${GSL_SOURCE_DIR}/include PREFIX "Header Files" FILES ${GSL_HEADER_ABSOLUTE_PATHS}) + source_group("Solution Items" FILES ${GSL_WORKSPACE_FILES}) endif() if (GSL_TEST)