依赖项更改时重建 CMake 目标
Rebuild CMake target when dependency changes
这里有无数类似的问题,但我找不到能准确解决这个问题的问题:
我正在使用 CMake 构建共享库 a
和 b
以及可执行文件 prog
。 prog
应该链接到 a
,而不是链接到 b
。但是,与此同时,我希望在 b
过时时重建 prog
。实际上,b
是构建 prog
.
时使用的编译器插件
我试过:
add_library(a a.cc)
add_library(b b.cc)
add_dependencies(a b)
add_executable(prog prog.cc)
target_link_libraries(prog PRIVATE a)
但这不起作用,当 b
需要重建时,这不会导致 prog
也被重建。
我也试过:
add_library(a a.cc)
add_library(b b.cc)
target_link_libraries(a INTERFACE b)
add_executable(prog prog.cc)
target_link_libraries(prog PRIVATE a)
但这会导致 prog
链接到 b
。没有办法实现吗?
我看到生成器表达式在 OBJECT_DEPENDS
上下文中不起作用。触摸。反正就是做个小代理:
cmake_minimum_required(VERSION 3.11)
project(test)
add_library(a a.cpp)
add_library(b b.cpp)
add_executable(prog prog.cpp)
add_custom_command(
OUTPUT ${CMAKE_CURRENT_BINARY_DIR}/b_is_build
COMMAND ${CMAKE_COMMAND} -E touch ${CMAKE_CURRENT_BINARY_DIR}/b_is_build
DEPENDS $<TARGET_FILE:b>
)
set_source_files_properties(prog.cpp PROPERTIES
OBJECT_DEPENDS ${CMAKE_CURRENT_BINARY_DIR}/b_is_build
)
然后触摸 b.cpp
重建程序:
+ touch b.cpp
+ cmake --build _build --verbose
[1/5] /usr/bin/c++ -MD -MT CMakeFiles/b.dir/b.cpp.o -MF CMakeFiles/b.dir/b.cpp.o.d -o CMakeFiles/b.dir/b.cpp.o -c /dev/shm/.1000.home.tmp.dir/b.cpp
[2/5] : && /usr/bin/cmake -E rm -f libb.a && /usr/bin/ar qc libb.a CMakeFiles/b.dir/b.cpp.o && /usr/bin/ranlib libb.a && :
[3/5] cd /dev/shm/.1000.home.tmp.dir/_build && /usr/bin/cmake -E touch /dev/shm/.1000.home.tmp.dir/_build/b_is_build
[4/5] /usr/bin/c++ -MD -MT CMakeFiles/prog.dir/prog.cpp.o -MF CMakeFiles/prog.dir/prog.cpp.o.d -o CMakeFiles/prog.dir/prog.cpp.o -c /dev/shm/.1000.home.tmp.dir/prog.cpp
[5/5] : && /usr/bin/c++ CMakeFiles/prog.dir/prog.cpp.o -o prog liba.a && :
b is a compiler plugin used while building prog
理想情况下是告诉 CMake object files 依赖于那个插件 file,但是 $<TARGET_FILE
在这里不起作用.
set_source_file_properties(prog.cc PROPERTIES
OBJECT_DEPENDS $<TARGET_FILE:b>
)
或者告诉 CMake,链接生成的程序取决于插件,具体取决于插件的使用位置。
set_target_properties(prog PROPERTIES
LINK_DEPENDS $<TARGET_FILE:b>
)
依赖性以 文件 为模型 - 例如可执行文件 prog
依赖于文件 b
。 add_dependencies
只进行排序(一个先于另一个构建)。
这里有无数类似的问题,但我找不到能准确解决这个问题的问题:
我正在使用 CMake 构建共享库 a
和 b
以及可执行文件 prog
。 prog
应该链接到 a
,而不是链接到 b
。但是,与此同时,我希望在 b
过时时重建 prog
。实际上,b
是构建 prog
.
我试过:
add_library(a a.cc)
add_library(b b.cc)
add_dependencies(a b)
add_executable(prog prog.cc)
target_link_libraries(prog PRIVATE a)
但这不起作用,当 b
需要重建时,这不会导致 prog
也被重建。
我也试过:
add_library(a a.cc)
add_library(b b.cc)
target_link_libraries(a INTERFACE b)
add_executable(prog prog.cc)
target_link_libraries(prog PRIVATE a)
但这会导致 prog
链接到 b
。没有办法实现吗?
我看到生成器表达式在 OBJECT_DEPENDS
上下文中不起作用。触摸。反正就是做个小代理:
cmake_minimum_required(VERSION 3.11)
project(test)
add_library(a a.cpp)
add_library(b b.cpp)
add_executable(prog prog.cpp)
add_custom_command(
OUTPUT ${CMAKE_CURRENT_BINARY_DIR}/b_is_build
COMMAND ${CMAKE_COMMAND} -E touch ${CMAKE_CURRENT_BINARY_DIR}/b_is_build
DEPENDS $<TARGET_FILE:b>
)
set_source_files_properties(prog.cpp PROPERTIES
OBJECT_DEPENDS ${CMAKE_CURRENT_BINARY_DIR}/b_is_build
)
然后触摸 b.cpp
重建程序:
+ touch b.cpp
+ cmake --build _build --verbose
[1/5] /usr/bin/c++ -MD -MT CMakeFiles/b.dir/b.cpp.o -MF CMakeFiles/b.dir/b.cpp.o.d -o CMakeFiles/b.dir/b.cpp.o -c /dev/shm/.1000.home.tmp.dir/b.cpp
[2/5] : && /usr/bin/cmake -E rm -f libb.a && /usr/bin/ar qc libb.a CMakeFiles/b.dir/b.cpp.o && /usr/bin/ranlib libb.a && :
[3/5] cd /dev/shm/.1000.home.tmp.dir/_build && /usr/bin/cmake -E touch /dev/shm/.1000.home.tmp.dir/_build/b_is_build
[4/5] /usr/bin/c++ -MD -MT CMakeFiles/prog.dir/prog.cpp.o -MF CMakeFiles/prog.dir/prog.cpp.o.d -o CMakeFiles/prog.dir/prog.cpp.o -c /dev/shm/.1000.home.tmp.dir/prog.cpp
[5/5] : && /usr/bin/c++ CMakeFiles/prog.dir/prog.cpp.o -o prog liba.a && :
b is a compiler plugin used while building prog
理想情况下是告诉 CMake object files 依赖于那个插件 file,但是 $<TARGET_FILE
在这里不起作用.
set_source_file_properties(prog.cc PROPERTIES
OBJECT_DEPENDS $<TARGET_FILE:b>
)
或者告诉 CMake,链接生成的程序取决于插件,具体取决于插件的使用位置。
set_target_properties(prog PROPERTIES
LINK_DEPENDS $<TARGET_FILE:b>
)
依赖性以 文件 为模型 - 例如可执行文件 prog
依赖于文件 b
。 add_dependencies
只进行排序(一个先于另一个构建)。