You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

354 lines
14 KiB

# a simple CXX only test case
cmake_minimum_required(VERSION 3.10)
project (Properties)
# these first three tests really test both properties and the management of
# cmSourceFile objects by CMake.
# test properties on a build tree file that is relative (yuck)
configure_file(properties.h.in "${Properties_BINARY_DIR}/properties.h")
set_source_files_properties(properties.h PROPERTIES TEST1 1)
get_source_file_property(RESULT1 properties.h TEST1)
# test properties on a headerfile in the source tree
# accessed without an extension (also yuck)
set_source_files_properties(properties2 PROPERTIES TEST2 1)
get_source_file_property(RESULT2 properties2 TEST2)
# test properties on a relative source that is not generated
set_source_files_properties(SubDir/properties3.cxx PROPERTIES TEST3 1)
get_source_file_property(RESULT3 SubDir/properties3.cxx TEST3)
include_directories("${Properties_SOURCE_DIR}" "${Properties_BINARY_DIR}")
# test generic property interfaces
get_property(GLOBALRESULT GLOBAL PROPERTY GLOBALTEST DEFINED)
if (GLOBALRESULT)
message(SEND_ERROR "Error: global prop defined when it should not be, "
"result is GLOBALRESULT=${GLOBALRESULT}")
endif ()
define_property(GLOBAL PROPERTY GLOBALTEST
BRIEF_DOCS "A test property"
FULL_DOCS "A long description of this test property"
)
get_property(GLOBALRESULT GLOBAL PROPERTY GLOBALTEST DEFINED)
if (NOT GLOBALRESULT)
message(SEND_ERROR "Error: global prop not defined "
"result is GLOBALRESULT=${GLOBALRESULT}")
endif ()
set_property(GLOBAL PROPERTY GLOBALTEST 1)
set_property(DIRECTORY PROPERTY DIRECTORYTEST 1)
set_property(SOURCE SubDir/properties3.cxx PROPERTY SOURCETEST 1)
get_property(GLOBALRESULT GLOBAL PROPERTY GLOBALTEST)
get_property(DIRECTORYRESULT DIRECTORY PROPERTY DIRECTORYTEST)
get_property(SOURCERESULT
SOURCE SubDir/properties3.cxx
PROPERTY SOURCETEST
)
if (RESULT1 AND RESULT2 AND RESULT3 AND GLOBALRESULT AND
DIRECTORYRESULT AND SOURCERESULT)
add_executable (Properties SubDir/properties3.cxx properties)
else ()
message(SEND_ERROR
"Error: test results are RESULT1=${RESULT1} RESULT2=${RESULT2} "
"RESULT3=${RESULT3} GLOBALRESULT=${GLOBALRESULT} "
"DIRECTORYRESULT=${DIRECTORYRESULT} "
"SOURCERESULT=${SOURCERESULT}")
endif ()
# test the target property
set_property(TARGET Properties PROPERTY TARGETTEST 1)
get_property(TARGETRESULT TARGET Properties PROPERTY TARGETTEST)
if (NOT TARGETRESULT)
message(SEND_ERROR
"Error: target result is TARGETRESULT=${TARGETRESULT}")
endif ()
# test APPEND and APPEND_STRING set_property()
set_property(TARGET Properties PROPERTY FOO foo)
set_property(TARGET Properties PROPERTY BAR bar)
set_property(TARGET Properties APPEND PROPERTY FOO 123)
set_property(TARGET Properties APPEND_STRING PROPERTY BAR 456)
get_property(APPEND_RESULT TARGET Properties PROPERTY FOO)
if (NOT "${APPEND_RESULT}" STREQUAL "foo;123")
message(SEND_ERROR
"Error: target result is APPEND_RESULT=${APPEND_RESULT}")
endif ()
get_property(APPEND_STRING_RESULT TARGET Properties PROPERTY BAR)
if (NOT "${APPEND_STRING_RESULT}" STREQUAL "bar456")
message(SEND_ERROR
"Error: target result is APPEND_STRING_RESULT=${APPEND_STRING_RESULT}")
endif ()
# test get_property SET
get_property(TARGETRESULT TARGET Properties PROPERTY TARGETTEST SET)
if (NOT TARGETRESULT)
message(SEND_ERROR
"Error: target prop not set, result is TARGETRESULT=${TARGETRESULT}")
endif ()
# test unsetting a property
set_property(TARGET Properties PROPERTY TARGETTEST)
get_property(TARGETRESULT TARGET Properties PROPERTY TARGETTEST SET)
if (TARGETRESULT)
message(SEND_ERROR "Error: target prop not unset, "
"result is TARGETRESULT=${TARGETRESULT}")
endif ()
# test the target SOURCES property
get_property(Properties_SOURCES TARGET Properties PROPERTY SOURCES)
set_source_files_properties(${Properties_SOURCES} PROPERTIES TEST4 1)
get_source_file_property(RESULT4 properties.h TEST4)
if(NOT RESULT4)
message(SEND_ERROR "Error: target result is"
" RESULT4=${RESULT4}"
" Properties_SOURCES=[${Properties_SOURCES}]")
endif()
# test CACHE properties
macro(check_cache_props)
foreach(prop VALUE TYPE HELPSTRING ADVANCED STRINGS)
get_property(result CACHE SOME_ENTRY PROPERTY ${prop})
if(NOT "x${result}" STREQUAL "x${expect_${prop}}")
message(SEND_ERROR "CACHE property ${prop} is [${result}], not [${expect_${prop}}]")
endif()
endforeach()
endmacro()
set(expect_VALUE "ON")
set(expect_TYPE "BOOL")
set(expect_HELPSTRING "sample cache entry")
set(expect_ADVANCED 0)
set(expect_STRINGS "")
set(SOME_ENTRY "${expect_VALUE}" CACHE ${expect_TYPE} "${expect_HELPSTRING}" FORCE)
mark_as_advanced(CLEAR SOME_ENTRY)
set_property(CACHE SOME_ENTRY PROPERTY STRINGS "")
check_cache_props()
set(expect_VALUE "Some string")
set(expect_TYPE "STRING")
set(expect_HELPSTRING "sample cache entry help")
set(expect_ADVANCED 1)
set(expect_STRINGS "Some string;Some other string;Some third string")
set_property(CACHE SOME_ENTRY PROPERTY TYPE "${expect_TYPE}")
set_property(CACHE SOME_ENTRY PROPERTY HELPSTRING "${expect_HELPSTRING}")
set_property(CACHE SOME_ENTRY PROPERTY VALUE "${expect_VALUE}")
set_property(CACHE SOME_ENTRY PROPERTY ADVANCED "${expect_ADVANCED}")
set_property(CACHE SOME_ENTRY PROPERTY STRINGS "${expect_STRINGS}")
check_cache_props()
function(generate_file_for_set_property_test i target_name)
set(src_path "${CMAKE_CURRENT_BINARY_DIR}/src${i}.cpp")
file(CONFIGURE OUTPUT "${src_path}" CONTENT
"#ifndef def${i}\n\
#error Expected def${i}\n\
#endif\n\
#ifdef _WIN32\n\
__declspec(dllexport)\n\
#endif\n\
void dummy_symbol${i}() {}\n"
NEWLINE_STYLE UNIX)
target_sources(${target_name} PRIVATE "${src_path}")
endfunction()
add_library(maindirtest SHARED)
# Generate file to be used with both DIRECTORY and TARGET_DIRECTORY options in
# set_source_files_properties and set_property().
generate_file_for_set_property_test(32 maindirtest)
generate_file_for_set_property_test(33 maindirtest)
# Set/get properties by binary directory path.
add_subdirectory(SubDir SubDirA)
get_property(dir_prop_top DIRECTORY PROPERTY dir_prop_top)
if(NOT dir_prop_top STREQUAL "${CMAKE_CURRENT_BINARY_DIR}/SubDirA")
message(SEND_ERROR "dir_prop_top unexpected value after SubDirA:\n ${dir_prop_top}")
endif()
add_subdirectory(SubDir SubDirB)
get_property(dir_prop_top DIRECTORY PROPERTY dir_prop_top)
if(NOT dir_prop_top STREQUAL "${CMAKE_CURRENT_BINARY_DIR}/SubDirB")
message(SEND_ERROR "dir_prop_top unexpected value after SubDirB:\n ${dir_prop_top}")
endif()
get_property(dir_prop_subA DIRECTORY ${CMAKE_CURRENT_BINARY_DIR}/SubDirA PROPERTY dir_prop_sub)
if(NOT dir_prop_subA STREQUAL "${CMAKE_CURRENT_BINARY_DIR}/SubDirA")
message(SEND_ERROR "SubDirA property dir_prop_sub incorrect:\n ${dir_prop_subA}")
endif()
get_property(dir_prop_subB DIRECTORY ${CMAKE_CURRENT_BINARY_DIR}/SubDirB PROPERTY dir_prop_sub)
if(NOT dir_prop_subB STREQUAL "${CMAKE_CURRENT_BINARY_DIR}/SubDirB")
message(SEND_ERROR "SubDirB property dir_prop_sub incorrect:\n ${dir_prop_subB}")
endif()
get_directory_property(dir_prop_subA DIRECTORY ${CMAKE_CURRENT_BINARY_DIR}/SubDirA dir_prop_sub)
if(NOT dir_prop_subA STREQUAL "${CMAKE_CURRENT_BINARY_DIR}/SubDirA")
message(SEND_ERROR "SubDirA property dir_prop_sub incorrect:\n ${dir_prop_subA}")
endif()
get_directory_property(dir_prop_subB DIRECTORY ${CMAKE_CURRENT_BINARY_DIR}/SubDirB dir_prop_sub)
if(NOT dir_prop_subB STREQUAL "${CMAKE_CURRENT_BINARY_DIR}/SubDirB")
message(SEND_ERROR "SubDirB property dir_prop_sub incorrect:\n ${dir_prop_subB}")
endif()
add_subdirectory(SubDir2)
set(src_prefix "${CMAKE_CURRENT_BINARY_DIR}/SubDir2/")
# Set property + target directory
set_property(SOURCE "${src_prefix}/src1.cpp"
TARGET_DIRECTORY set_prop_lib_1
PROPERTY COMPILE_DEFINITIONS def1)
# Append property + target directory
set_property(SOURCE "${src_prefix}/src2.cpp"
TARGET_DIRECTORY set_prop_lib_1
APPEND PROPERTY COMPILE_DEFINITIONS def2)
# Set property + relative directory path
set_property(SOURCE "${src_prefix}/src3.cpp"
DIRECTORY SubDir2
PROPERTY COMPILE_DEFINITIONS def3)
# Set property + absolute directory path
set_property(SOURCE "${src_prefix}/src4.cpp"
DIRECTORY "${CMAKE_CURRENT_SOURCE_DIR}/SubDir2"
PROPERTY COMPILE_DEFINITIONS def4)
# Append property + relative directory path
set_property(SOURCE "${src_prefix}/src5.cpp"
DIRECTORY SubDir2
APPEND PROPERTY COMPILE_DEFINITIONS def5)
# Append property + absolute directory path
set_property(SOURCE "${src_prefix}/src6.cpp"
DIRECTORY "${CMAKE_CURRENT_SOURCE_DIR}/SubDir2"
APPEND PROPERTY COMPILE_DEFINITIONS def6)
# Target directory
set_source_files_properties("${CMAKE_CURRENT_BINARY_DIR}/SubDir2/src10.cpp"
TARGET_DIRECTORY set_prop_lib_1
PROPERTIES COMPILE_DEFINITIONS def10)
# Relative directory path
set_source_files_properties("${CMAKE_CURRENT_BINARY_DIR}/SubDir2/src11.cpp"
DIRECTORY SubDir2
PROPERTIES COMPILE_DEFINITIONS def11)
# Absolute directory path
set_source_files_properties("${CMAKE_CURRENT_BINARY_DIR}/SubDir2/src12.cpp"
DIRECTORY "${CMAKE_CURRENT_SOURCE_DIR}/SubDir2"
PROPERTIES COMPILE_DEFINITIONS def12)
# Multiple files + absolute directory path
set_source_files_properties("${CMAKE_CURRENT_BINARY_DIR}/SubDir2/src20.cpp"
"${CMAKE_CURRENT_BINARY_DIR}/SubDir2/src21.cpp"
DIRECTORY "${CMAKE_CURRENT_SOURCE_DIR}/SubDir2"
PROPERTIES COMPILE_DEFINITIONS "def20;def21")
# Multiple files + multiple target directories
set_source_files_properties("${CMAKE_CURRENT_BINARY_DIR}/SubDir2/src22.cpp"
"${CMAKE_CURRENT_BINARY_DIR}/SubDir2/src23.cpp"
TARGET_DIRECTORY set_prop_lib_2 set_prop_lib_3
PROPERTIES COMPILE_DEFINITIONS "def22;def23")
# Multiple files in multiple relative directories
generate_file_for_set_property_test(30 maindirtest)
set_source_files_properties("${CMAKE_CURRENT_BINARY_DIR}/src30.cpp"
"${CMAKE_CURRENT_BINARY_DIR}/SubDir2/src31.cpp"
DIRECTORY . SubDir2
PROPERTIES COMPILE_DEFINITIONS "def30;def31")
# Check that specifying files without any properties doesn't crash.
set_source_files_properties("${CMAKE_CURRENT_BINARY_DIR}/src30.cpp"
"${CMAKE_CURRENT_BINARY_DIR}/SubDir2/src31.cpp")
# Check that specifying both DIRECTORY and TARGET_DIRECTORY works.
set_source_files_properties("${CMAKE_CURRENT_BINARY_DIR}/src32.cpp"
DIRECTORY .
TARGET_DIRECTORY set_prop_lib_3
PROPERTIES COMPILE_DEFINITIONS "def32")
set_property(SOURCE "${CMAKE_CURRENT_BINARY_DIR}/src33.cpp"
DIRECTORY SubDir2
TARGET_DIRECTORY maindirtest
PROPERTY COMPILE_DEFINITIONS "def33")
function(check_get_property_value expected)
if(NOT actual STREQUAL expected)
message(SEND_ERROR "Error: get_property returned unexpected value\n"
"actual: ${actual}\n"
"expected: ${expected}")
endif()
endfunction()
# Check that source file directory scopes are deduplicated.
set_property(SOURCE "${CMAKE_CURRENT_BINARY_DIR}/src32.cpp"
DIRECTORY SubDir2 SubDir2 SubDir2
TARGET_DIRECTORY set_prop_lib_3 set_prop_lib_3 set_prop_lib_3
APPEND
PROPERTY NON_DUPLICATED_CUSTOM_PROP 1
)
get_property(actual
SOURCE "${CMAKE_CURRENT_BINARY_DIR}/src32.cpp"
DIRECTORY SubDir2
PROPERTY NON_DUPLICATED_CUSTOM_PROP)
check_get_property_value("1")
get_source_file_property(actual "${CMAKE_CURRENT_BINARY_DIR}/src32.cpp"
TARGET_DIRECTORY set_prop_lib_3
NON_DUPLICATED_CUSTOM_PROP)
check_get_property_value("1")
# Get property + target directory
get_property(actual
SOURCE "${src_prefix}/src1.cpp"
TARGET_DIRECTORY set_prop_lib_1
PROPERTY COMPILE_DEFINITIONS)
check_get_property_value("def1")
# Get property + relative directory path
get_property(actual
SOURCE "${src_prefix}/src3.cpp"
DIRECTORY SubDir2
PROPERTY COMPILE_DEFINITIONS)
check_get_property_value("def3")
# Get property + absolute directory path
get_property(actual
SOURCE "${src_prefix}/src4.cpp"
DIRECTORY "${CMAKE_CURRENT_SOURCE_DIR}/SubDir2"
PROPERTY COMPILE_DEFINITIONS)
check_get_property_value("def4")
# Get property + target directory
unset(actual)
get_source_file_property(actual
"${CMAKE_CURRENT_BINARY_DIR}/SubDir2/src10.cpp"
TARGET_DIRECTORY set_prop_lib_1
COMPILE_DEFINITIONS)
check_get_property_value("def10")
# Get property + relative directory path
get_source_file_property(actual
"${CMAKE_CURRENT_BINARY_DIR}/SubDir2/src11.cpp"
DIRECTORY SubDir2
COMPILE_DEFINITIONS)
check_get_property_value("def11")
# Get property + absolute directory path
get_source_file_property(actual
"${CMAKE_CURRENT_BINARY_DIR}/SubDir2/src12.cpp"
DIRECTORY "${CMAKE_CURRENT_SOURCE_DIR}/SubDir2"
COMPILE_DEFINITIONS)
check_get_property_value("def12")