CustomCommandDepends.cmake 4.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111
  1. cmake_policy(SET CMP0116 NEW)
  2. enable_language(C)
  3. add_custom_command(OUTPUT main.c
  4. DEPFILE main.c.d
  5. COMMAND "${CMAKE_COMMAND}" -DINFILE=main.c.in -DOUTFILE=main.c -DDEPFILE=main.c.d
  6. -P "${CMAKE_CURRENT_SOURCE_DIR}/GenerateDepFile.cmake"
  7. WORKING_DIRECTORY "${CMAKE_CURRENT_BINARY_DIR}")
  8. add_custom_target(mainc ALL DEPENDS main.c)
  9. add_executable(main ${CMAKE_CURRENT_BINARY_DIR}/main.c)
  10. set(CODE_WITH_SPACE [[
  11. add_custom_command(OUTPUT main2.c
  12. DEPFILE main2.c.d
  13. COMMAND "${CMAKE_COMMAND}" -DINFILE=../main.c.in -DOUTFILE=main2.c -DDEPFILE=main2.c.d
  14. -P "${CMAKE_SOURCE_DIR}/GenerateDepFile.cmake"
  15. WORKING_DIRECTORY "${CMAKE_CURRENT_BINARY_DIR}")
  16. add_custom_target(main2c ALL DEPENDS main2.c)
  17. add_executable(main2 ${CMAKE_CURRENT_BINARY_DIR}/main2.c)
  18. ]])
  19. if(MAKE_SUPPORTS_SPACES)
  20. add_subdirectory("With Space")
  21. set(check_pairs_with_space "
  22. \"$<TARGET_FILE:main2>|${CMAKE_CURRENT_BINARY_DIR}/main.c.in\"
  23. \"$<TARGET_FILE:main2>|${CMAKE_CURRENT_BINARY_DIR}/With Space/main2.c\"
  24. ")
  25. set(check_exes_with_space "
  26. \"$<TARGET_FILE:main2>\"
  27. ")
  28. endif()
  29. file(GENERATE OUTPUT ${CMAKE_CURRENT_BINARY_DIR}/check-$<LOWER_CASE:$<CONFIG>>.cmake CONTENT "
  30. cmake_minimum_required(VERSION 3.19)
  31. set(check_pairs
  32. \"$<TARGET_FILE:main>|${CMAKE_CURRENT_BINARY_DIR}/main.c.in\"
  33. \"$<TARGET_FILE:main>|${CMAKE_CURRENT_BINARY_DIR}/main.c\"
  34. ${check_pairs_with_space}
  35. )
  36. set(check_exes
  37. \"$<TARGET_FILE:main>\"
  38. ${check_exes_with_space}
  39. )
  40. if (RunCMake_GENERATOR MATCHES \"Make\" AND check_step EQUAL 2)
  41. include(\"${CMAKE_CURRENT_BINARY_DIR}/CMakeFiles/Makefile.cmake\")
  42. if (NOT CMAKE_DEPEND_INFO_FILES)
  43. set(RunCMake_TEST_FAILED \"Variable CMAKE_DEPEND_INFO_FILES not found.\")
  44. else()
  45. list(FILTER CMAKE_DEPEND_INFO_FILES EXCLUDE REGEX main2)
  46. foreach(DEPEND_INFO_FILE IN LISTS CMAKE_DEPEND_INFO_FILES)
  47. include(\"${CMAKE_CURRENT_BINARY_DIR}/\${DEPEND_INFO_FILE}\")
  48. if (NOT CMAKE_DEPENDS_DEPENDENCY_FILES)
  49. set(RunCMake_TEST_FAILED \"Variable CMAKE_DEPENDS_DEPENDENCY_FILES not found.\")
  50. else()
  51. list(LENGTH CMAKE_DEPENDS_DEPENDENCY_FILES DEPENDENCY_FILES_SIZE)
  52. math(EXPR STOP_INDEX \"\${DEPENDENCY_FILES_SIZE} - 1\")
  53. foreach(INDEX RANGE 0 \${STOP_INDEX} 4)
  54. math(EXPR OBJECT_INDEX \"\${INDEX} + 1\")
  55. math(EXPR FORMAT_INDEX \"\${INDEX} + 2\")
  56. math(EXPR DEP_INDEX \"\${INDEX} + 3\")
  57. list(GET CMAKE_DEPENDS_DEPENDENCY_FILES \${OBJECT_INDEX} OBJECT_FILE)
  58. list(GET CMAKE_DEPENDS_DEPENDENCY_FILES \${FORMAT_INDEX} DEP_FORMAT)
  59. list(GET CMAKE_DEPENDS_DEPENDENCY_FILES \${DEP_INDEX} DEP_FILE)
  60. if (NOT EXISTS \"${CMAKE_CURRENT_BINARY_DIR}/\${DEP_FILE}\")
  61. set(RunCMake_TEST_FAILED \"File \${DEP_FILE} not found.\")
  62. else()
  63. cmake_path(APPEND TARGET_DEP_FILE \"${CMAKE_CURRENT_BINARY_DIR}\" \"\${DEPEND_INFO_FILE}\")
  64. cmake_path(REPLACE_FILENAME TARGET_DEP_FILE \"compiler_depend.make\")
  65. file(READ \"\${TARGET_DEP_FILE}\" DEPENDS_CONTENT)
  66. if (WIN32)
  67. string (REPLACE \"\\\\\" \"/\" DEPENDS_CONTENT \"\${DEPENDS_CONTENT}\")
  68. string (TOLOWER \"\${DEPENDS_CONTENT}\" DEPENDS_CONTENT)
  69. string (TOLOWER \"\${OBJECT_FILE}\" OBJECT_FILE)
  70. else()
  71. string(REPLACE \"\\\\ \" \" \" DEPENDS_CONTENT \"\${DEPENDS_CONTENT}\")
  72. endif()
  73. if(DEPEND_INFO_FILE MATCHES \"main\\\\.dir\")
  74. if (DEP_FORMAT STREQUAL \"gcc\" AND NOT DEPENDS_CONTENT MATCHES \"\${OBJECT_FILE} *:.+main.c\")
  75. set(RunCMake_TEST_FAILED \"Dependency file '\${TARGET_DEP_FILE}' badly generated:\\n\${DEPENDS_CONTENT}\")
  76. endif()
  77. if (DEP_FORMAT STREQUAL \"custom\" AND NOT DEPENDS_CONTENT MATCHES \"\${OBJECT_FILE} *:.+main.c.in\")
  78. set(RunCMake_TEST_FAILED \"Dependency file '\${TARGET_DEP_FILE}' badly generated:\\n\${DEPENDS_CONTENT}\")
  79. endif()
  80. else()
  81. if (NOT DEPENDS_CONTENT MATCHES \"\${OBJECT_FILE} *:.+main.c.in\")
  82. set(RunCMake_TEST_FAILED \"Dependency file '\${TARGET_DEP_FILE}' badly generated:\\n\${DEPENDS_CONTENT}\")
  83. endif()
  84. endif()
  85. endif()
  86. endforeach()
  87. endif()
  88. endforeach()
  89. endif()
  90. endif()
  91. if (RunCMake_GENERATOR STREQUAL \"Ninja\" AND check_step EQUAL 2)
  92. execute_process(
  93. COMMAND \${RunCMake_MAKE_PROGRAM} -t deps
  94. WORKING_DIRECTORY \${RunCMake_TEST_BINARY_DIR}
  95. OUTPUT_VARIABLE deps
  96. )
  97. if(NOT deps MATCHES \"main.c:.*main.c.in\")
  98. string(REPLACE deps \"\\n\" \"\\n \" \" \${deps}\")
  99. set(RunCMake_TEST_FAILED \"Dependencies not detected correctly:\\n\${deps}\")
  100. endif()
  101. endif()
  102. ")