考虑使用CMake构建的Visual Studio的以下玩具项目。
档案CMakeLists.txt:
cmake_minimum_required (VERSION 2.8)
project(CMP0046)
# cmake_policy(SET CMP0046 OLD) <----
add_executable(an_exec a.cpp)
configure_file(data_file.txt data_file.txt.c @ONLY)
add_custom_command(OUTPUT data_file.txt.c
COMMAND ${CMAKE_COMMAND} data_file.txt data_file.txt.c -P ${PROJECT_SOURCE_DIR}/gen_file.cmake
MAIN_DEPENDENCY data_file.txt)
add_dependencies(an_exec data_file.txt.c)
文件gen_file.cmake
if (CMAKE_ARGV2)
configure_file(${CMAKE_ARGV1} ${CMAKE_ARGV2})
endif()
文件a.cpp
和data_file.txt
目前是空的,因为它们的内容并不重要。
树点:
data_file.txt.c
是使用CMake从data_file.txt
生成的; data_file.txt.c
以反映所有最近的更改当前的CMake脚本不会更改CMP0046策略(上面标有箭头的注释行),当我按下CMake GUI中的“生成”按钮时,这会导致有关缺少依赖关系的警告。
我有两个目标:
如果我取消注释该行并将CMP0046设置为OLD,则CMake很安静。但是,我在这里建议:What is the scope of CMake policies?,这是不正确的。
我更喜欢add_custom_command
而不是add_custom_target
,因为自定义目标会在生成的VS解决方案中显示为单独的项目。例如,这些行添加到CMakeLists.txt:
add_custom_target(data_file_txt_c
COMMAND ${CMAKE_COMMAND} data_file.txt data_file.txt.c -P ${PROJECT_SOURCE_DIR}/gen_file.cmake
DEPENDS data_file.txt)
add_dependencies(an_exec data_file_txt_c)
导致Visual Studio解决方案,其中添加了一个名为data_file_txt_c
的新项目,我希望避免这种情况。
那么,什么是最好的解决方案?