mirror of
https://gitlab.kitware.com/cmake/cmake.git
synced 2026-09-25 04:09:36 +03:00
Currently, target properties related to file sets are specific to file set type (for example "SOURCE_SETS"). This raises some concerns: 1. For each new file set type, 6 new properties are created which need a lot off documentation update 2. there is no "generic" way to discover file sets information The new target properties (FILE_SET_TYPES, FILE_SETS_<TYPE>, and INTERFACE_FILE_SETS_<TYPE>), in conjunction with the file sets properties, enable a complete generic file sets information discovery.
94 lines
5.6 KiB
CMake
94 lines
5.6 KiB
CMake
enable_language(C)
|
|
|
|
function(assert_prop_undef tgt prop)
|
|
unset(actual_value)
|
|
get_property(actual_value TARGET ${tgt} PROPERTY ${prop})
|
|
if(DEFINED actual_value)
|
|
message(SEND_ERROR "${prop} should be undefined, actual value:\n ${actual_value}")
|
|
endif()
|
|
endfunction()
|
|
|
|
function(assert_prop_eq tgt prop value)
|
|
unset(actual_value)
|
|
get_property(actual_value TARGET ${tgt} PROPERTY ${prop})
|
|
if(NOT actual_value STREQUAL value)
|
|
message(SEND_ERROR "Expected value of ${prop}:\n ${value}\nActual value:\n ${actual_value}")
|
|
endif()
|
|
endfunction()
|
|
|
|
add_library(lib1 STATIC empty.c)
|
|
assert_prop_eq(lib1 HEADER_SETS "")
|
|
assert_prop_eq(lib1 INTERFACE_HEADER_SETS "")
|
|
assert_prop_undef(lib1 INCLUDE_DIRECTORIES)
|
|
assert_prop_undef(lib1 INTERFACE_INCLUDE_DIRECTORIES)
|
|
assert_prop_eq(lib1 FILE_SET_TYPES "")
|
|
|
|
target_sources(lib1 PUBLIC FILE_SET a TYPE HEADERS BASE_DIRS "." FILES h1.h h2.h)
|
|
assert_prop_eq(lib1 HEADER_SETS "a")
|
|
assert_prop_eq(lib1 INTERFACE_HEADER_SETS "a")
|
|
assert_prop_eq(lib1 FILE_SET_TYPES "HEADERS")
|
|
assert_prop_eq(lib1 FILE_SETS_HEADERS "a")
|
|
assert_prop_eq(lib1 INTERFACE_FILE_SETS_HEADERS "a")
|
|
assert_prop_eq(lib1 HEADER_DIRS_a "${CMAKE_CURRENT_SOURCE_DIR}/.")
|
|
assert_prop_eq(lib1 HEADER_SET_a "${CMAKE_CURRENT_SOURCE_DIR}/h1.h;${CMAKE_CURRENT_SOURCE_DIR}/h2.h")
|
|
assert_prop_eq(lib1 INCLUDE_DIRECTORIES "$<BUILD_INTERFACE:${CMAKE_CURRENT_SOURCE_DIR}/.>")
|
|
assert_prop_eq(lib1 INTERFACE_INCLUDE_DIRECTORIES "$<BUILD_INTERFACE:${CMAKE_CURRENT_SOURCE_DIR}/.>")
|
|
|
|
target_sources(lib1 PUBLIC FILE_SET a FILES h3.h)
|
|
assert_prop_eq(lib1 HEADER_SETS "a")
|
|
assert_prop_eq(lib1 INTERFACE_HEADER_SETS "a")
|
|
assert_prop_eq(lib1 HEADER_DIRS_a "${CMAKE_CURRENT_SOURCE_DIR}/.")
|
|
assert_prop_eq(lib1 HEADER_SET_a "${CMAKE_CURRENT_SOURCE_DIR}/h1.h;${CMAKE_CURRENT_SOURCE_DIR}/h2.h;${CMAKE_CURRENT_SOURCE_DIR}/h3.h")
|
|
assert_prop_eq(lib1 INCLUDE_DIRECTORIES "$<BUILD_INTERFACE:${CMAKE_CURRENT_SOURCE_DIR}/.>")
|
|
assert_prop_eq(lib1 INTERFACE_INCLUDE_DIRECTORIES "$<BUILD_INTERFACE:${CMAKE_CURRENT_SOURCE_DIR}/.>")
|
|
|
|
target_sources(lib1 PRIVATE FILE_SET b TYPE HEADERS BASE_DIRS "${CMAKE_CURRENT_SOURCE_DIR}/dir" FILES dir/dir.h)
|
|
assert_prop_eq(lib1 HEADER_SETS "a;b")
|
|
assert_prop_eq(lib1 INTERFACE_HEADER_SETS "a")
|
|
assert_prop_eq(lib1 FILE_SET_TYPES "HEADERS")
|
|
assert_prop_eq(lib1 FILE_SETS_HEADERS "a;b")
|
|
assert_prop_eq(lib1 INTERFACE_FILE_SETS_HEADERS "a")
|
|
assert_prop_eq(lib1 HEADER_DIRS_b "${CMAKE_CURRENT_SOURCE_DIR}/dir")
|
|
assert_prop_eq(lib1 HEADER_SET_b "${CMAKE_CURRENT_SOURCE_DIR}/dir/dir.h")
|
|
assert_prop_eq(lib1 INCLUDE_DIRECTORIES "$<BUILD_INTERFACE:${CMAKE_CURRENT_SOURCE_DIR}/.>;$<BUILD_INTERFACE:${CMAKE_CURRENT_SOURCE_DIR}/dir>")
|
|
assert_prop_eq(lib1 INTERFACE_INCLUDE_DIRECTORIES "$<BUILD_INTERFACE:${CMAKE_CURRENT_SOURCE_DIR}/.>")
|
|
|
|
target_sources(lib1 INTERFACE FILE_SET c TYPE HEADERS FILE_SET d TYPE HEADERS)
|
|
assert_prop_eq(lib1 HEADER_SETS "a;b")
|
|
assert_prop_eq(lib1 INTERFACE_HEADER_SETS "a;c;d")
|
|
assert_prop_eq(lib1 FILE_SETS_HEADERS "a;b")
|
|
assert_prop_eq(lib1 INTERFACE_FILE_SETS_HEADERS "a;c;d")
|
|
assert_prop_eq(lib1 HEADER_DIRS_c "${CMAKE_CURRENT_SOURCE_DIR}")
|
|
assert_prop_eq(lib1 HEADER_SET_c "")
|
|
assert_prop_eq(lib1 HEADER_DIRS_d "${CMAKE_CURRENT_SOURCE_DIR}")
|
|
assert_prop_eq(lib1 HEADER_SET_d "")
|
|
assert_prop_eq(lib1 INCLUDE_DIRECTORIES "$<BUILD_INTERFACE:${CMAKE_CURRENT_SOURCE_DIR}/.>;$<BUILD_INTERFACE:${CMAKE_CURRENT_SOURCE_DIR}/dir>")
|
|
assert_prop_eq(lib1 INTERFACE_INCLUDE_DIRECTORIES "$<BUILD_INTERFACE:${CMAKE_CURRENT_SOURCE_DIR}/.>;$<BUILD_INTERFACE:${CMAKE_CURRENT_SOURCE_DIR}>;$<BUILD_INTERFACE:${CMAKE_CURRENT_SOURCE_DIR}>")
|
|
|
|
target_sources(lib1 PUBLIC FILE_SET HEADERS BASE_DIRS "${CMAKE_CURRENT_SOURCE_DIR}" FILES h4.h)
|
|
assert_prop_eq(lib1 INTERFACE_HEADER_SETS "a;c;d;HEADERS")
|
|
assert_prop_eq(lib1 FILE_SETS_HEADERS "a;b;HEADERS")
|
|
assert_prop_eq(lib1 INTERFACE_FILE_SETS_HEADERS "a;c;d;HEADERS")
|
|
assert_prop_eq(lib1 HEADER_DIRS "${CMAKE_CURRENT_SOURCE_DIR}")
|
|
assert_prop_eq(lib1 HEADER_SET "${CMAKE_CURRENT_SOURCE_DIR}/h4.h")
|
|
assert_prop_eq(lib1 HEADER_DIRS_HEADERS "${CMAKE_CURRENT_SOURCE_DIR}")
|
|
assert_prop_eq(lib1 HEADER_SET_HEADERS "${CMAKE_CURRENT_SOURCE_DIR}/h4.h")
|
|
assert_prop_eq(lib1 INCLUDE_DIRECTORIES "$<BUILD_INTERFACE:${CMAKE_CURRENT_SOURCE_DIR}/.>;$<BUILD_INTERFACE:${CMAKE_CURRENT_SOURCE_DIR}/dir>;$<BUILD_INTERFACE:${CMAKE_CURRENT_SOURCE_DIR}>")
|
|
assert_prop_eq(lib1 INTERFACE_INCLUDE_DIRECTORIES "$<BUILD_INTERFACE:${CMAKE_CURRENT_SOURCE_DIR}/.>;$<BUILD_INTERFACE:${CMAKE_CURRENT_SOURCE_DIR}>;$<BUILD_INTERFACE:${CMAKE_CURRENT_SOURCE_DIR}>;$<BUILD_INTERFACE:${CMAKE_CURRENT_SOURCE_DIR}>")
|
|
|
|
target_sources(lib1 PUBLIC FILE_SET HEADERS FILES h5.h)
|
|
assert_prop_eq(lib1 INTERFACE_HEADER_SETS "a;c;d;HEADERS")
|
|
assert_prop_eq(lib1 HEADER_DIRS "${CMAKE_CURRENT_SOURCE_DIR}")
|
|
assert_prop_eq(lib1 HEADER_SET "${CMAKE_CURRENT_SOURCE_DIR}/h4.h;${CMAKE_CURRENT_SOURCE_DIR}/h5.h")
|
|
assert_prop_eq(lib1 HEADER_DIRS_HEADERS "${CMAKE_CURRENT_SOURCE_DIR}")
|
|
assert_prop_eq(lib1 HEADER_SET_HEADERS "${CMAKE_CURRENT_SOURCE_DIR}/h4.h;${CMAKE_CURRENT_SOURCE_DIR}/h5.h")
|
|
assert_prop_eq(lib1 INCLUDE_DIRECTORIES "$<BUILD_INTERFACE:${CMAKE_CURRENT_SOURCE_DIR}/.>;$<BUILD_INTERFACE:${CMAKE_CURRENT_SOURCE_DIR}/dir>;$<BUILD_INTERFACE:${CMAKE_CURRENT_SOURCE_DIR}>")
|
|
assert_prop_eq(lib1 INTERFACE_INCLUDE_DIRECTORIES "$<BUILD_INTERFACE:${CMAKE_CURRENT_SOURCE_DIR}/.>;$<BUILD_INTERFACE:${CMAKE_CURRENT_SOURCE_DIR}>;$<BUILD_INTERFACE:${CMAKE_CURRENT_SOURCE_DIR}>;$<BUILD_INTERFACE:${CMAKE_CURRENT_SOURCE_DIR}>")
|
|
|
|
target_sources(lib1 PUBLIC FILE_SET src1 TYPE SOURCES FILES lib1.c)
|
|
assert_prop_eq(lib1 FILE_SET_TYPES "HEADERS;SOURCES")
|
|
assert_prop_eq(lib1 FILE_SETS_HEADERS "a;b;HEADERS")
|
|
assert_prop_eq(lib1 INTERFACE_FILE_SETS_HEADERS "a;c;d;HEADERS")
|
|
assert_prop_eq(lib1 FILE_SETS_SOURCES "src1")
|
|
assert_prop_eq(lib1 INTERFACE_FILE_SETS_SOURCES "src1")
|