Browse Source

Tests: Add tests for target_sources(FILE_SET) and associated functionality

Kyle Edwards 4 years ago
parent
commit
a7c71b9f03
65 changed files with 436 additions and 0 deletions
  1. 1 0
      Tests/RunCMake/target_sources/FileSetChangeScope-result.txt
  2. 5 0
      Tests/RunCMake/target_sources/FileSetChangeScope-stderr.txt
  3. 5 0
      Tests/RunCMake/target_sources/FileSetChangeScope.cmake
  4. 1 0
      Tests/RunCMake/target_sources/FileSetChangeType-result.txt
  5. 5 0
      Tests/RunCMake/target_sources/FileSetChangeType-stderr.txt
  6. 5 0
      Tests/RunCMake/target_sources/FileSetChangeType.cmake
  7. 1 0
      Tests/RunCMake/target_sources/FileSetDefaultWrongType-result.txt
  8. 4 0
      Tests/RunCMake/target_sources/FileSetDefaultWrongType-stderr.txt
  9. 4 0
      Tests/RunCMake/target_sources/FileSetDefaultWrongType.cmake
  10. 4 0
      Tests/RunCMake/target_sources/FileSetDirectories.cmake
  11. 21 0
      Tests/RunCMake/target_sources/FileSetExport.cmake
  12. 1 0
      Tests/RunCMake/target_sources/FileSetFileNoExist-result.txt
  13. 10 0
      Tests/RunCMake/target_sources/FileSetFileNoExist-stderr.txt
  14. 4 0
      Tests/RunCMake/target_sources/FileSetFileNoExist.cmake
  15. 97 0
      Tests/RunCMake/target_sources/FileSetImport.cmake
  16. 1 0
      Tests/RunCMake/target_sources/FileSetInstallMissingSetsInterface-result.txt
  17. 5 0
      Tests/RunCMake/target_sources/FileSetInstallMissingSetsInterface-stderr.txt
  18. 5 0
      Tests/RunCMake/target_sources/FileSetInstallMissingSetsInterface.cmake
  19. 9 0
      Tests/RunCMake/target_sources/FileSetInstallMissingSetsPrivate.cmake
  20. 1 0
      Tests/RunCMake/target_sources/FileSetNoExistInterface-result.txt
  21. 4 0
      Tests/RunCMake/target_sources/FileSetNoExistInterface-stderr.txt
  22. 7 0
      Tests/RunCMake/target_sources/FileSetNoExistInterface.cmake
  23. 1 0
      Tests/RunCMake/target_sources/FileSetNoExistPrivate-result.txt
  24. 4 0
      Tests/RunCMake/target_sources/FileSetNoExistPrivate-stderr.txt
  25. 7 0
      Tests/RunCMake/target_sources/FileSetNoExistPrivate.cmake
  26. 1 0
      Tests/RunCMake/target_sources/FileSetNoScope-result.txt
  27. 4 0
      Tests/RunCMake/target_sources/FileSetNoScope-stderr.txt
  28. 6 0
      Tests/RunCMake/target_sources/FileSetNoScope.cmake
  29. 1 0
      Tests/RunCMake/target_sources/FileSetNoType-result.txt
  30. 4 0
      Tests/RunCMake/target_sources/FileSetNoType-stderr.txt
  31. 4 0
      Tests/RunCMake/target_sources/FileSetNoType.cmake
  32. 1 0
      Tests/RunCMake/target_sources/FileSetOverlappingBaseDirs-result.txt
  33. 9 0
      Tests/RunCMake/target_sources/FileSetOverlappingBaseDirs-stderr.txt
  34. 4 0
      Tests/RunCMake/target_sources/FileSetOverlappingBaseDirs.cmake
  35. 67 0
      Tests/RunCMake/target_sources/FileSetProperties.cmake
  36. 1 0
      Tests/RunCMake/target_sources/FileSetWrongBaseDirs-result.txt
  37. 12 0
      Tests/RunCMake/target_sources/FileSetWrongBaseDirs-stderr.txt
  38. 4 0
      Tests/RunCMake/target_sources/FileSetWrongBaseDirs.cmake
  39. 1 0
      Tests/RunCMake/target_sources/FileSetWrongBaseDirsRelative-result.txt
  40. 10 0
      Tests/RunCMake/target_sources/FileSetWrongBaseDirsRelative-stderr.txt
  41. 3 0
      Tests/RunCMake/target_sources/FileSetWrongBaseDirsRelative.cmake
  42. 1 0
      Tests/RunCMake/target_sources/FileSetWrongType-result.txt
  43. 4 0
      Tests/RunCMake/target_sources/FileSetWrongType-stderr.txt
  44. 4 0
      Tests/RunCMake/target_sources/FileSetWrongType.cmake
  45. 57 0
      Tests/RunCMake/target_sources/RunCMakeTest.cmake
  46. 0 0
      Tests/RunCMake/target_sources/debug/empty.h
  47. 0 0
      Tests/RunCMake/target_sources/debug/empty2.h
  48. 0 0
      Tests/RunCMake/target_sources/dir/dir.h
  49. 0 0
      Tests/RunCMake/target_sources/dir1/file1.h
  50. 0 0
      Tests/RunCMake/target_sources/dir2/file2.h
  51. 1 0
      Tests/RunCMake/target_sources/dir3/CMakeLists.txt
  52. 4 0
      Tests/RunCMake/target_sources/dir3/dir3.h
  53. 4 0
      Tests/RunCMake/target_sources/dir4/CMakeLists.txt
  54. 0 0
      Tests/RunCMake/target_sources/dir4/dir4.h
  55. 0 0
      Tests/RunCMake/target_sources/empty.c
  56. 0 0
      Tests/RunCMake/target_sources/empty3.h
  57. 1 0
      Tests/RunCMake/target_sources/error.c
  58. 0 0
      Tests/RunCMake/target_sources/h1.h
  59. 0 0
      Tests/RunCMake/target_sources/h2.h
  60. 0 0
      Tests/RunCMake/target_sources/h3.h
  61. 6 0
      Tests/RunCMake/target_sources/lib1.c
  62. 8 0
      Tests/RunCMake/target_sources/lib2.c
  63. 2 0
      Tests/RunCMake/target_sources/reldir/CMakeLists.txt
  64. 0 0
      Tests/RunCMake/target_sources/release/empty.h
  65. 0 0
      Tests/RunCMake/target_sources/release/empty2.h

+ 1 - 0
Tests/RunCMake/target_sources/FileSetChangeScope-result.txt

@@ -0,0 +1 @@
+1

+ 5 - 0
Tests/RunCMake/target_sources/FileSetChangeScope-stderr.txt

@@ -0,0 +1,5 @@
+^CMake Error at FileSetChangeScope\.cmake:[0-9]+ \(target_sources\):
+  target_sources Scope PUBLIC for file set "a" does not match original scope
+  INTERFACE
+Call Stack \(most recent call first\):
+  CMakeLists\.txt:[0-9]+ \(include\)$

+ 5 - 0
Tests/RunCMake/target_sources/FileSetChangeScope.cmake

@@ -0,0 +1,5 @@
+enable_language(C)
+
+add_library(lib1 STATIC empty.c)
+target_sources(lib1 INTERFACE FILE_SET a TYPE HEADERS)
+target_sources(lib1 PUBLIC FILE_SET a)

+ 1 - 0
Tests/RunCMake/target_sources/FileSetChangeType-result.txt

@@ -0,0 +1 @@
+1

+ 5 - 0
Tests/RunCMake/target_sources/FileSetChangeType-stderr.txt

@@ -0,0 +1,5 @@
+^CMake Error at FileSetChangeType\.cmake:[0-9]+ \(target_sources\):
+  target_sources Type "RESOURCES" for file set "a" does not match original
+  type "HEADERS"
+Call Stack \(most recent call first\):
+  CMakeLists\.txt:[0-9]+ \(include\)$

+ 5 - 0
Tests/RunCMake/target_sources/FileSetChangeType.cmake

@@ -0,0 +1,5 @@
+enable_language(C)
+
+add_library(lib1 STATIC empty.c)
+target_sources(lib1 PRIVATE FILE_SET a TYPE HEADERS)
+target_sources(lib1 PRIVATE FILE_SET a TYPE RESOURCES)

+ 1 - 0
Tests/RunCMake/target_sources/FileSetDefaultWrongType-result.txt

@@ -0,0 +1 @@
+1

+ 4 - 0
Tests/RunCMake/target_sources/FileSetDefaultWrongType-stderr.txt

@@ -0,0 +1,4 @@
+^CMake Error at FileSetDefaultWrongType\.cmake:[0-9]+ \(target_sources\):
+  target_sources File set TYPE may only be "HEADERS"
+Call Stack \(most recent call first\):
+  CMakeLists\.txt:[0-9]+ \(include\)$

+ 4 - 0
Tests/RunCMake/target_sources/FileSetDefaultWrongType.cmake

@@ -0,0 +1,4 @@
+enable_language(C)
+
+add_library(lib1 STATIC empty.c)
+target_sources(lib1 PRIVATE FILE_SET UNKNOWN)

+ 4 - 0
Tests/RunCMake/target_sources/FileSetDirectories.cmake

@@ -0,0 +1,4 @@
+enable_language(C)
+
+add_subdirectory(dir3)
+add_subdirectory(dir4)

+ 21 - 0
Tests/RunCMake/target_sources/FileSetExport.cmake

@@ -0,0 +1,21 @@
+enable_language(C)
+
+add_library(lib1 STATIC lib1.c)
+target_sources(lib1
+  PUBLIC FILE_SET HEADERS BASE_DIRS ${CMAKE_CURRENT_SOURCE_DIR} FILES error.c
+  PRIVATE FILE_SET a TYPE HEADERS BASE_DIRS ${CMAKE_CURRENT_SOURCE_DIR} FILES h1.h
+  PUBLIC FILE_SET b TYPE HEADERS BASE_DIRS ${CMAKE_CURRENT_SOURCE_DIR} FILES h2.h
+  INTERFACE FILE_SET c TYPE HEADERS BASE_DIRS "$<1:${CMAKE_CURRENT_SOURCE_DIR}/dir>" FILES "$<1:dir/dir.h>"
+  INTERFACE FILE_SET d TYPE HEADERS BASE_DIRS FILES "${CMAKE_CURRENT_SOURCE_DIR}/$<IF:$<CONFIG:Debug>,debug,release>/empty.h"
+  INTERFACE FILE_SET e TYPE HEADERS BASE_DIRS "${CMAKE_CURRENT_SOURCE_DIR}/$<IF:$<CONFIG:Debug>,debug,release>" FILES "${CMAKE_CURRENT_SOURCE_DIR}/$<IF:$<CONFIG:Debug>,debug,release>/empty2.h"
+  INTERFACE FILE_SET f TYPE HEADERS BASE_DIRS "${CMAKE_CURRENT_SOURCE_DIR}" FILES "${CMAKE_CURRENT_SOURCE_DIR}/empty3.h"
+  INTERFACE FILE_SET g TYPE HEADERS BASE_DIRS "${CMAKE_CURRENT_SOURCE_DIR}/dir1" "${CMAKE_CURRENT_SOURCE_DIR}/dir2" FILES "${CMAKE_CURRENT_SOURCE_DIR}/dir1/file1.h" "${CMAKE_CURRENT_SOURCE_DIR}/dir2/file2.h"
+  INTERFACE FILE_SET dir3 TYPE HEADERS BASE_DIRS "${CMAKE_CURRENT_SOURCE_DIR}/dir3" FILES dir3/dir3.h
+  )
+
+install(TARGETS lib1 EXPORT export FILE_SET HEADERS FILE_SET a FILE_SET b FILE_SET c DESTINATION include/dir FILE_SET d FILE_SET e FILE_SET f DESTINATION include/$<IF:$<CONFIG:Debug>,debug,release> FILE_SET g FILE_SET dir3 DESTINATION include/dir3)
+install(EXPORT export FILE export.cmake NAMESPACE install:: DESTINATION lib/cmake)
+export(EXPORT export FILE export.cmake NAMESPACE export::)
+
+add_library(lib2 STATIC lib2.c)
+target_link_libraries(lib2 PRIVATE lib1)

+ 1 - 0
Tests/RunCMake/target_sources/FileSetFileNoExist-result.txt

@@ -0,0 +1 @@
+1

+ 10 - 0
Tests/RunCMake/target_sources/FileSetFileNoExist-stderr.txt

@@ -0,0 +1,10 @@
+^CMake Error at FileSetFileNoExist\.cmake:[0-9]+ \(add_library\):
+  Cannot find source file:
+
+    [^
+]*/Tests/RunCMake/target_sources/noexist\.h
+Call Stack \(most recent call first\):
+  CMakeLists\.txt:[0-9]+ \(include\)
+
+
+CMake Generate step failed\.  Build files cannot be regenerated correctly\.$

+ 4 - 0
Tests/RunCMake/target_sources/FileSetFileNoExist.cmake

@@ -0,0 +1,4 @@
+enable_language(C)
+
+add_library(lib1 STATIC empty.c)
+target_sources(lib1 PRIVATE FILE_SET HEADERS BASE_DIRS ${CMAKE_CURRENT_SOURCE_DIR} FILES noexist.h)

+ 97 - 0
Tests/RunCMake/target_sources/FileSetImport.cmake

@@ -0,0 +1,97 @@
+enable_language(C)
+
+get_property(_multi_config GLOBAL PROPERTY GENERATOR_IS_MULTI_CONFIG)
+
+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()
+
+get_filename_component(export_build_dir "${CMAKE_BINARY_DIR}" DIRECTORY)
+string(APPEND export_build_dir "/FileSetExport-build")
+
+include("${export_build_dir}/export.cmake")
+include("${export_build_dir}/install/lib/cmake/export.cmake")
+
+assert_prop_eq(export::lib1 HEADER_SETS "")
+assert_prop_eq(export::lib1 INTERFACE_HEADER_SETS "HEADERS;b;c;d;e;f;g;dir3")
+assert_prop_eq(export::lib1 HEADER_SET "${CMAKE_CURRENT_SOURCE_DIR}/error.c")
+assert_prop_eq(export::lib1 HEADER_DIRS "${CMAKE_CURRENT_SOURCE_DIR}")
+assert_prop_eq(export::lib1 HEADER_SET_b "${CMAKE_CURRENT_SOURCE_DIR}/h2.h")
+assert_prop_eq(export::lib1 HEADER_DIRS_b "${CMAKE_CURRENT_SOURCE_DIR}")
+assert_prop_eq(export::lib1 HEADER_SET_c "$<1:dir/dir.h>")
+assert_prop_eq(export::lib1 HEADER_DIRS_c "$<1:${CMAKE_CURRENT_SOURCE_DIR}/dir>")
+assert_prop_eq(export::lib1 HEADER_SET_d "${CMAKE_CURRENT_SOURCE_DIR}/$<IF:$<CONFIG:Debug>,debug,release>/empty.h")
+assert_prop_eq(export::lib1 HEADER_DIRS_d "${CMAKE_CURRENT_SOURCE_DIR}")
+assert_prop_eq(export::lib1 HEADER_SET_e "${CMAKE_CURRENT_SOURCE_DIR}/$<IF:$<CONFIG:Debug>,debug,release>/empty2.h")
+assert_prop_eq(export::lib1 HEADER_DIRS_e "${CMAKE_CURRENT_SOURCE_DIR}/$<IF:$<CONFIG:Debug>,debug,release>")
+assert_prop_eq(export::lib1 HEADER_SET_f "${CMAKE_CURRENT_SOURCE_DIR}/empty3.h")
+assert_prop_eq(export::lib1 HEADER_DIRS_f "${CMAKE_CURRENT_SOURCE_DIR}")
+assert_prop_eq(export::lib1 HEADER_SET_g "${CMAKE_CURRENT_SOURCE_DIR}/dir1/file1.h;${CMAKE_CURRENT_SOURCE_DIR}/dir2/file2.h")
+assert_prop_eq(export::lib1 HEADER_DIRS_g "${CMAKE_CURRENT_SOURCE_DIR}/dir1;${CMAKE_CURRENT_SOURCE_DIR}/dir2")
+assert_prop_eq(export::lib1 INTERFACE_INCLUDE_DIRECTORIES "${CMAKE_CURRENT_SOURCE_DIR};${CMAKE_CURRENT_SOURCE_DIR};$<1:${CMAKE_CURRENT_SOURCE_DIR}/dir>;${CMAKE_CURRENT_SOURCE_DIR};${CMAKE_CURRENT_SOURCE_DIR}/$<IF:$<CONFIG:Debug>,debug,release>;${CMAKE_CURRENT_SOURCE_DIR};${CMAKE_CURRENT_SOURCE_DIR}/dir1;${CMAKE_CURRENT_SOURCE_DIR}/dir2;${CMAKE_CURRENT_SOURCE_DIR}/dir3;$<BUILD_INTERFACE:${CMAKE_CURRENT_SOURCE_DIR}>;$<BUILD_INTERFACE:${CMAKE_CURRENT_SOURCE_DIR}>;$<BUILD_INTERFACE:$<1:${CMAKE_CURRENT_SOURCE_DIR}/dir>>;$<BUILD_INTERFACE:${CMAKE_CURRENT_SOURCE_DIR}>;$<BUILD_INTERFACE:${CMAKE_CURRENT_SOURCE_DIR}/$<IF:$<CONFIG:Debug>,debug,release>>;$<BUILD_INTERFACE:${CMAKE_CURRENT_SOURCE_DIR}>;$<BUILD_INTERFACE:${CMAKE_CURRENT_SOURCE_DIR}/dir1>;$<BUILD_INTERFACE:${CMAKE_CURRENT_SOURCE_DIR}/dir2>;$<BUILD_INTERFACE:${CMAKE_CURRENT_SOURCE_DIR}/dir3>")
+
+assert_prop_eq(install::lib1 HEADER_SETS "")
+assert_prop_eq(install::lib1 INTERFACE_HEADER_SETS "HEADERS;b;c;d;e;f;g;dir3")
+assert_prop_eq(install::lib1 HEADER_SET "${export_build_dir}/install/include/error.c")
+assert_prop_eq(install::lib1 HEADER_DIRS "${export_build_dir}/install/include")
+assert_prop_eq(install::lib1 HEADER_SET_b "${export_build_dir}/install/include/h2.h")
+assert_prop_eq(install::lib1 HEADER_DIRS_b "${export_build_dir}/install/include")
+assert_prop_eq(install::lib1 HEADER_SET_c "${export_build_dir}/install/include/dir/dir.h")
+assert_prop_eq(install::lib1 HEADER_DIRS_c "${export_build_dir}/install/include/dir")
+if(_multi_config)
+  assert_prop_eq(install::lib1 HEADER_SET_d "$<$<CONFIG:Debug>:${export_build_dir}/install/include/debug/empty.h>;$<$<CONFIG:Release>:${export_build_dir}/install/include/release/empty.h>")
+else()
+  assert_prop_eq(install::lib1 HEADER_SET_d "${export_build_dir}/install/include/debug/empty.h")
+endif()
+assert_prop_eq(install::lib1 HEADER_DIRS_d "${export_build_dir}/install/include")
+if(_multi_config)
+  assert_prop_eq(install::lib1 HEADER_SET_e "$<$<CONFIG:Debug>:${export_build_dir}/install/include/empty2.h>;$<$<CONFIG:Release>:${export_build_dir}/install/include/empty2.h>")
+else()
+  assert_prop_eq(install::lib1 HEADER_SET_e "${export_build_dir}/install/include/empty2.h")
+endif()
+assert_prop_eq(install::lib1 HEADER_DIRS_e "${export_build_dir}/install/include")
+if(_multi_config)
+  assert_prop_eq(install::lib1 HEADER_SET_f "$<$<CONFIG:Debug>:${export_build_dir}/install/include/debug/empty3.h>;$<$<CONFIG:Release>:${export_build_dir}/install/include/release/empty3.h>")
+  assert_prop_eq(install::lib1 HEADER_DIRS_f "$<$<CONFIG:Debug>:${export_build_dir}/install/include/debug>;$<$<CONFIG:Release>:${export_build_dir}/install/include/release>")
+else()
+  assert_prop_eq(install::lib1 HEADER_SET_f "${export_build_dir}/install/include/debug/empty3.h")
+  assert_prop_eq(install::lib1 HEADER_DIRS_f "${export_build_dir}/install/include/debug")
+endif()
+assert_prop_eq(install::lib1 HEADER_SET_g "${export_build_dir}/install/include/file1.h;${export_build_dir}/install/include/file2.h")
+assert_prop_eq(install::lib1 HEADER_DIRS_g "${export_build_dir}/install/include")
+if(_multi_config)
+  assert_prop_eq(install::lib1 INTERFACE_INCLUDE_DIRECTORIES "$<BUILD_INTERFACE:${export_build_dir}/install/include>;$<BUILD_INTERFACE:${export_build_dir}/install/include>;$<BUILD_INTERFACE:${export_build_dir}/install/include/dir>;$<BUILD_INTERFACE:${export_build_dir}/install/include>;$<BUILD_INTERFACE:${export_build_dir}/install/include>;$<BUILD_INTERFACE:$<$<CONFIG:Debug>:${export_build_dir}/install/include/debug>>;$<BUILD_INTERFACE:$<$<CONFIG:Release>:${export_build_dir}/install/include/release>>;$<BUILD_INTERFACE:${export_build_dir}/install/include>;$<BUILD_INTERFACE:${export_build_dir}/install/include/dir3>")
+else()
+  assert_prop_eq(install::lib1 INTERFACE_INCLUDE_DIRECTORIES "$<BUILD_INTERFACE:${export_build_dir}/install/include>;$<BUILD_INTERFACE:${export_build_dir}/install/include>;$<BUILD_INTERFACE:${export_build_dir}/install/include/dir>;$<BUILD_INTERFACE:${export_build_dir}/install/include>;$<BUILD_INTERFACE:${export_build_dir}/install/include>;$<BUILD_INTERFACE:${export_build_dir}/install/include/debug>;$<BUILD_INTERFACE:${export_build_dir}/install/include>;$<BUILD_INTERFACE:${export_build_dir}/install/include/dir3>")
+endif()
+
+file(GLOB_RECURSE actual
+  LIST_DIRECTORIES TRUE
+  RELATIVE "${CMAKE_BINARY_DIR}/../FileSetExport-build/install/include"
+  "${CMAKE_BINARY_DIR}/../FileSetExport-build/install/include/*"
+  )
+if(actual)
+  list(SORT actual)
+endif()
+if(_multi_config)
+  set(expect "^debug;debug/empty\\.h;debug/empty3\\.h;dir;dir/dir\\.h;dir3;dir3/dir3\.h;empty2\\.h;error\\.c;file1\\.h;file2\\.h;h2\\.h;release;release/empty\\.h;release/empty3\\.h$")
+else()
+  set(expect "^debug;debug/empty\\.h;debug/empty3\\.h;dir;dir/dir\\.h;dir3;dir3/dir3\.h;empty2\\.h;error\\.c;file1\\.h;file2\\.h;h2\\.h$")
+endif()
+if(NOT "${actual}" MATCHES "${expect}")
+  message(SEND_ERROR "Installed files:
+  ${actual}
+do not match what we expected:
+  ${expect}
+in directory:
+  ${CMAKE_INSTALL_PREFIX}")
+endif()
+
+add_library(lib2_export STATIC lib2.c)
+target_link_libraries(lib2_export PRIVATE export::lib1)
+add_library(lib2_install STATIC lib2.c)
+target_link_libraries(lib2_install PRIVATE install::lib1)

+ 1 - 0
Tests/RunCMake/target_sources/FileSetInstallMissingSetsInterface-result.txt

@@ -0,0 +1 @@
+1

+ 5 - 0
Tests/RunCMake/target_sources/FileSetInstallMissingSetsInterface-stderr.txt

@@ -0,0 +1,5 @@
+^CMake Error at FileSetInstallMissingSetsInterface\.cmake:[0-9]+ \(install\):
+  install TARGETS target lib1 is exported but not all of its file sets are
+  installed
+Call Stack \(most recent call first\):
+  CMakeLists\.txt:[0-9]+ \(include\)$

+ 5 - 0
Tests/RunCMake/target_sources/FileSetInstallMissingSetsInterface.cmake

@@ -0,0 +1,5 @@
+enable_language(C)
+
+add_library(lib1 STATIC empty.c)
+target_sources(lib1 INTERFACE FILE_SET a TYPE HEADERS BASE_DIRS ${CMAKE_CURRENT_SOURCE_DIR} FILES h1.h)
+install(TARGETS lib1 EXPORT a)

+ 9 - 0
Tests/RunCMake/target_sources/FileSetInstallMissingSetsPrivate.cmake

@@ -0,0 +1,9 @@
+enable_language(C)
+
+add_library(lib1 STATIC empty.c)
+target_sources(lib1 PRIVATE FILE_SET a TYPE HEADERS BASE_DIRS ${CMAKE_CURRENT_SOURCE_DIR} FILES h1.h)
+install(TARGETS lib1 EXPORT a)
+
+add_library(lib2 STATIC empty.c)
+target_sources(lib2 INTERFACE FILE_SET a TYPE HEADERS BASE_DIRS ${CMAKE_CURRENT_SOURCE_DIR} FILES h1.h)
+install(TARGETS lib2)

+ 1 - 0
Tests/RunCMake/target_sources/FileSetNoExistInterface-result.txt

@@ -0,0 +1 @@
+1

+ 4 - 0
Tests/RunCMake/target_sources/FileSetNoExistInterface-stderr.txt

@@ -0,0 +1,4 @@
+^CMake Error at FileSetNoExistInterface\.cmake:[0-9]+ \(set_property\):
+  Header set "a" has not yet been created\.
+Call Stack \(most recent call first\):
+  CMakeLists\.txt:[0-9]+ \(include\)$

+ 7 - 0
Tests/RunCMake/target_sources/FileSetNoExistInterface.cmake

@@ -0,0 +1,7 @@
+enable_language(C)
+
+add_library(lib1 STATIC empty.c)
+set_property(TARGET lib1 PROPERTY INTERFACE_HEADER_SETS "a")
+
+# Error happens at configure-time, so this doesn't help.
+target_sources(lib1 INTERFACE FILE_SET a TYPE HEADERS)

+ 1 - 0
Tests/RunCMake/target_sources/FileSetNoExistPrivate-result.txt

@@ -0,0 +1 @@
+1

+ 4 - 0
Tests/RunCMake/target_sources/FileSetNoExistPrivate-stderr.txt

@@ -0,0 +1,4 @@
+^CMake Error at FileSetNoExistPrivate\.cmake:[0-9]+ \(set_property\):
+  Header set "a" has not yet been created\.
+Call Stack \(most recent call first\):
+  CMakeLists\.txt:[0-9]+ \(include\)$

+ 7 - 0
Tests/RunCMake/target_sources/FileSetNoExistPrivate.cmake

@@ -0,0 +1,7 @@
+enable_language(C)
+
+add_library(lib1 STATIC empty.c)
+set_property(TARGET lib1 PROPERTY HEADER_SETS "a")
+
+# Error happens at configure-time, so this doesn't help.
+target_sources(lib1 PRIVATE FILE_SET a TYPE HEADERS)

+ 1 - 0
Tests/RunCMake/target_sources/FileSetNoScope-result.txt

@@ -0,0 +1 @@
+1

+ 4 - 0
Tests/RunCMake/target_sources/FileSetNoScope-stderr.txt

@@ -0,0 +1,4 @@
+^CMake Error at FileSetNoScope\.cmake:[0-9]+ \(target_sources\):
+  target_sources File set "a" is not in HEADER_SETS or INTERFACE_HEADER_SETS
+Call Stack \(most recent call first\):
+  CMakeLists\.txt:[0-9]+ \(include\)$

+ 6 - 0
Tests/RunCMake/target_sources/FileSetNoScope.cmake

@@ -0,0 +1,6 @@
+enable_language(C)
+
+add_library(lib1 STATIC empty.c)
+target_sources(lib1 PRIVATE FILE_SET a TYPE HEADERS BASE_DIRS ${CMAKE_CURRENT_SOURCE_DIR} FILES h1.h)
+set_property(TARGET lib1 PROPERTY HEADER_SETS)
+target_sources(lib1 PRIVATE FILE_SET a TYPE HEADERS FILES h2.h)

+ 1 - 0
Tests/RunCMake/target_sources/FileSetNoType-result.txt

@@ -0,0 +1 @@
+1

+ 4 - 0
Tests/RunCMake/target_sources/FileSetNoType-stderr.txt

@@ -0,0 +1,4 @@
+^CMake Error at FileSetNoType\.cmake:[0-9]+ \(target_sources\):
+  target_sources Must specify a TYPE when creating file set
+Call Stack \(most recent call first\):
+  CMakeLists\.txt:[0-9]+ \(include\)$

+ 4 - 0
Tests/RunCMake/target_sources/FileSetNoType.cmake

@@ -0,0 +1,4 @@
+enable_language(C)
+
+add_library(lib1 STATIC empty.c)
+target_sources(lib1 PRIVATE FILE_SET a)

+ 1 - 0
Tests/RunCMake/target_sources/FileSetOverlappingBaseDirs-result.txt

@@ -0,0 +1 @@
+1

+ 9 - 0
Tests/RunCMake/target_sources/FileSetOverlappingBaseDirs-stderr.txt

@@ -0,0 +1,9 @@
+CMake Error at FileSetOverlappingBaseDirs\.cmake:[0-9]+ \(target_sources\):
+  Base directories in file set cannot be subdirectories of each other:
+
+    [^
+]*/Tests/RunCMake/target_sources/\.
+    [^
+]*/Tests/RunCMake/target_sources/dir3
+Call Stack \(most recent call first\):
+  CMakeLists\.txt:[0-9]+ \(include\)

+ 4 - 0
Tests/RunCMake/target_sources/FileSetOverlappingBaseDirs.cmake

@@ -0,0 +1,4 @@
+enable_language(C)
+
+add_library(lib1 STATIC empty.c)
+target_sources(lib1 PRIVATE FILE_SET a TYPE HEADERS BASE_DIRS $<1:${CMAKE_CURRENT_SOURCE_DIR}/.$<SEMICOLON>${CMAKE_CURRENT_SOURCE_DIR}/dir3> FILES h1.h)

+ 67 - 0
Tests/RunCMake/target_sources/FileSetProperties.cmake

@@ -0,0 +1,67 @@
+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)
+
+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 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 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)
+assert_prop_eq(lib1 HEADER_SETS "a;b")
+assert_prop_eq(lib1 INTERFACE_HEADER_SETS "a;c")
+assert_prop_eq(lib1 HEADER_DIRS_c "${CMAKE_CURRENT_SOURCE_DIR}")
+assert_prop_eq(lib1 HEADER_SET_c "")
+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}>")
+
+target_sources(lib1 PUBLIC FILE_SET HEADERS BASE_DIRS "${CMAKE_CURRENT_SOURCE_DIR}" FILES h1.h)
+assert_prop_eq(lib1 HEADER_DIRS "${CMAKE_CURRENT_SOURCE_DIR}")
+assert_prop_eq(lib1 HEADER_SET "${CMAKE_CURRENT_SOURCE_DIR}/h1.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}>")
+
+target_sources(lib1 PUBLIC FILE_SET HEADERS FILES h2.h)
+assert_prop_eq(lib1 HEADER_DIRS "${CMAKE_CURRENT_SOURCE_DIR}")
+assert_prop_eq(lib1 HEADER_SET "${CMAKE_CURRENT_SOURCE_DIR}/h1.h;${CMAKE_CURRENT_SOURCE_DIR}/h2.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}>")

+ 1 - 0
Tests/RunCMake/target_sources/FileSetWrongBaseDirs-result.txt

@@ -0,0 +1 @@
+1

+ 12 - 0
Tests/RunCMake/target_sources/FileSetWrongBaseDirs-stderr.txt

@@ -0,0 +1,12 @@
+CMake Error at FileSetWrongBaseDirs\.cmake:[0-9]+ \(target_sources\):
+  File:
+
+    [^
+]*/Tests/RunCMake/target_sources/h1\.h
+
+  must be in one of the file set's base directories:
+
+    [^
+]*/Tests/RunCMake/target_sources/dir3
+Call Stack \(most recent call first\):
+  CMakeLists\.txt:[0-9]+ \(include\)

+ 4 - 0
Tests/RunCMake/target_sources/FileSetWrongBaseDirs.cmake

@@ -0,0 +1,4 @@
+enable_language(C)
+
+add_library(lib1 STATIC empty.c)
+target_sources(lib1 PRIVATE FILE_SET a TYPE HEADERS BASE_DIRS ${CMAKE_CURRENT_SOURCE_DIR}/dir3 FILES h1.h)

+ 1 - 0
Tests/RunCMake/target_sources/FileSetWrongBaseDirsRelative-result.txt

@@ -0,0 +1 @@
+1

+ 10 - 0
Tests/RunCMake/target_sources/FileSetWrongBaseDirsRelative-stderr.txt

@@ -0,0 +1,10 @@
+CMake Error at reldir/CMakeLists\.txt:[0-9]+ \(target_sources\):
+  File:
+
+    [^
+]*/Tests/RunCMake/target_sources/reldir/\.\./h1\.h
+
+  must be in one of the file set's base directories:
+
+    [^
+]*/Tests/RunCMake/target_sources/reldir/\.

+ 3 - 0
Tests/RunCMake/target_sources/FileSetWrongBaseDirsRelative.cmake

@@ -0,0 +1,3 @@
+enable_language(C)
+
+add_subdirectory(reldir)

+ 1 - 0
Tests/RunCMake/target_sources/FileSetWrongType-result.txt

@@ -0,0 +1 @@
+1

+ 4 - 0
Tests/RunCMake/target_sources/FileSetWrongType-stderr.txt

@@ -0,0 +1,4 @@
+^CMake Error at FileSetWrongType\.cmake:[0-9]+ \(target_sources\):
+  target_sources File set TYPE may only be "HEADERS"
+Call Stack \(most recent call first\):
+  CMakeLists\.txt:[0-9]+ \(include\)$

+ 4 - 0
Tests/RunCMake/target_sources/FileSetWrongType.cmake

@@ -0,0 +1,4 @@
+enable_language(C)
+
+add_library(lib1 STATIC empty.c)
+target_sources(lib1 PRIVATE FILE_SET a TYPE UNKNOWN)

+ 57 - 0
Tests/RunCMake/target_sources/RunCMakeTest.cmake

@@ -21,3 +21,60 @@ run_cmake(AddCustomTargetInterfaceSources)
 run_cmake(AddCustomTargetSources)
 run_cmake(AddCustomTargetCheckProperty)
 run_cmake(AddCustomTargetGenx)
+
+run_cmake(FileSetProperties)
+run_cmake(FileSetNoType)
+run_cmake(FileSetWrongType)
+run_cmake(FileSetDefaultWrongType)
+run_cmake(FileSetChangeScope)
+run_cmake(FileSetChangeType)
+run_cmake(FileSetWrongBaseDirs)
+run_cmake(FileSetWrongBaseDirsRelative)
+run_cmake(FileSetOverlappingBaseDirs)
+run_cmake(FileSetInstallMissingSetsPrivate)
+run_cmake(FileSetInstallMissingSetsInterface)
+run_cmake(FileSetNoScope)
+run_cmake(FileSetNoExistPrivate)
+run_cmake(FileSetNoExistInterface)
+run_cmake(FileSetDirectories)
+
+set(RunCMake_TEST_OPTIONS -DCMAKE_POLICY_DEFAULT_CMP0115=NEW)
+run_cmake(FileSetFileNoExist)
+unset(RunCMake_TEST_OPTIONS)
+
+function(run_export_import name)
+  if(RunCMake_GENERATOR_IS_MULTI_CONFIG)
+    set(_config_options "-DCMAKE_CONFIGURATION_TYPES=Debug\\\\;Release")
+  else()
+    set(_config_options -DCMAKE_BUILD_TYPE=Debug)
+  endif()
+
+  set(RunCMake_TEST_NO_CLEAN 1)
+  set(RunCMake_TEST_BINARY_DIR "${RunCMake_BINARY_DIR}/${name}Export-build")
+  set(RunCMake_TEST_OPTIONS "--install-prefix=${RunCMake_TEST_BINARY_DIR}/install" ${_config_options})
+  file(REMOVE_RECURSE "${RunCMake_TEST_BINARY_DIR}")
+  file(MAKE_DIRECTORY "${RunCMake_TEST_BINARY_DIR}")
+  run_cmake(${name}Export)
+  run_cmake_command(${name}Export-build ${CMAKE_COMMAND} --build . --config Debug)
+  run_cmake_command(${name}Export-build ${CMAKE_COMMAND} --install . --config Debug)
+  if(RunCMake_GENERATOR_IS_MULTI_CONFIG)
+    run_cmake_command(${name}Export-build ${CMAKE_COMMAND} --build . --config Release)
+    run_cmake_command(${name}Export-build ${CMAKE_COMMAND} --install . --config Release)
+  endif()
+  unset(RunCMake_TEST_OPTIONS)
+
+  set(RunCMake_TEST_BINARY_DIR "${RunCMake_BINARY_DIR}/${name}Import-build")
+  unset(RunCMake_TEST_OPTIONS)
+  file(REMOVE_RECURSE "${RunCMake_TEST_BINARY_DIR}")
+  file(MAKE_DIRECTORY "${RunCMake_TEST_BINARY_DIR}")
+  run_cmake(${name}Import)
+  run_cmake_command(${name}Import-build ${CMAKE_COMMAND} --build . --config Debug)
+  if(RunCMake_GENERATOR_IS_MULTI_CONFIG)
+    run_cmake_command(${name}Import-build ${CMAKE_COMMAND} --build . --config Release)
+  endif()
+
+  unset(RunCMake_TEST_BINARY_DIR)
+  unset(RunCMake_TEST_NO_CLEAN)
+endfunction()
+
+run_export_import(FileSet)

+ 0 - 0
Tests/RunCMake/target_sources/debug/empty.h


+ 0 - 0
Tests/RunCMake/target_sources/debug/empty2.h


+ 0 - 0
Tests/RunCMake/target_sources/dir/dir.h


+ 0 - 0
Tests/RunCMake/target_sources/dir1/file1.h


+ 0 - 0
Tests/RunCMake/target_sources/dir2/file2.h


+ 1 - 0
Tests/RunCMake/target_sources/dir3/CMakeLists.txt

@@ -0,0 +1 @@
+add_library(lib1 STATIC ../empty.c)

+ 4 - 0
Tests/RunCMake/target_sources/dir3/dir3.h

@@ -0,0 +1,4 @@
+#ifndef DIR3_H
+#define DIR3_H
+
+#endif

+ 4 - 0
Tests/RunCMake/target_sources/dir4/CMakeLists.txt

@@ -0,0 +1,4 @@
+target_sources(lib1 PRIVATE FILE_SET HEADERS BASE_DIRS ${CMAKE_SOURCE_DIR} FILES
+  $<1:dir3.h>
+  dir4.h
+  )

+ 0 - 0
Tests/RunCMake/target_sources/dir4/dir4.h


+ 0 - 0
Tests/RunCMake/target_sources/empty.c


+ 0 - 0
Tests/RunCMake/target_sources/empty3.h


+ 1 - 0
Tests/RunCMake/target_sources/error.c

@@ -0,0 +1 @@
+#error "This should not be compiled"

+ 0 - 0
Tests/RunCMake/target_sources/h1.h


+ 0 - 0
Tests/RunCMake/target_sources/h2.h


+ 0 - 0
Tests/RunCMake/target_sources/h3.h


+ 6 - 0
Tests/RunCMake/target_sources/lib1.c

@@ -0,0 +1,6 @@
+#ifdef _WIN32
+__declspec(dllexport)
+#endif
+  void lib1(void)
+{
+}

+ 8 - 0
Tests/RunCMake/target_sources/lib2.c

@@ -0,0 +1,8 @@
+#include <dir3.h>
+
+#ifdef _WIN32
+__declspec(dllexport)
+#endif
+  void lib2(void)
+{
+}

+ 2 - 0
Tests/RunCMake/target_sources/reldir/CMakeLists.txt

@@ -0,0 +1,2 @@
+add_library(lib1 STATIC ../empty.c)
+target_sources(lib1 PRIVATE FILE_SET HEADERS BASE_DIRS . FILES ../h1.h)

+ 0 - 0
Tests/RunCMake/target_sources/release/empty.h


+ 0 - 0
Tests/RunCMake/target_sources/release/empty2.h