依赖项更改时重建 CMake 目标

Rebuild CMake target when dependency changes

这里有无数类似的问题,但我找不到能准确解决这个问题的问题:

我正在使用 CMake 构建共享库 ab 以及可执行文件 progprog 应该链接到 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 依赖于文件 badd_dependencies 只进行排序(一个先于另一个构建)。