add_custom_target 用来创建一个自定义的 target。
其使用方式一般如下:
add_custom_target(
libgogolib # target name
ALL # 是否包含到 ALL target 中
COMMAND go build -buildmode=c-shared -o "${PROJECT_BINARY_DIR}/autogen/libgogolib.so" # 执行命令
WORKING_DIRECTORY "${CMAKE_CURRENT_SOURCE_DIR}/golib"
BYPRODUCTS "gogolib" # 指明生成的文件。CMake 不会检查此文件是否存在
)
add_library(cus_lib lib.cpp)
add_dependencies(cus_lib libgogolib) # 指明 target 的依赖
target_link_directories(cus_lib PRIVATE "${PROJECT_BINARY_DIR}/autogen")
target_include_directories(cus_lib PRIVATE "${PROJECT_BINARY_DIR}/autogen/")
target_link_libraries(cus_lib PRIVATE "${PROJECT_BINARY_DIR}/autogen/gogolib.so") # 链接库
使用外部工具构建库
一个常见的需求是使用外部工具构建库,然后通过 INTERFACE 库导入到 CMake 中。一个自然的选择是组合使用 add_custom_target
和 add_library(xxx INTERFACE)
。然而由于 INTERFACE 库实际上不会构建任何内容,因此上面的办法是行不通的。[1]
可行的方式为组合使用 add_custom_target
, add_custom_command
和 add_library(xxx INTERFACE)
:
set(BASE_DIR ../../../../)
file(REAL_PATH ${BASE_DIR} BASE_DIR)
set(MY_LIB ${BASE_DIR}/target/debug/libxxx.a)
add_custom_command(
OUTPUT ${MY_LIB} (1)
COMMAND cargo rustc --crate-type staticlib --manifest-path ${BASE_DIR}/xxx/Cargo.toml
WORKING_DIRECTORY ${BASE_DIR}
)
add_custom_target(
build_xxx
VERBATIM
DEPENDS ${MY_LIB} (2)
)
add_library(mylib INTERFACE)
target_link_libraries(mylib INTERFACE ${MY_LIB})
add_dependencies(mylib build_xxx) (3)
告诉 CMake 那里去找 libxxx.a。
让 build_xxx 去执行 add_custom_command。
让 mylib 执行 build_xxx。