2
我有一個CMake項目Foobar
,它包含一個子目錄examples
,它也可以用作獨立的CMake構建。爲此,該子目錄執行find_package(Foobar)
並使用導出的目標。 Foobar
提供了FoobarConfig.cmake
,FoobarConfigVersion.cmake
和FoobarExports.cmake
,並且可以在沒有FindModule的情況下使用。在導出的構建樹中需要導出的CMake目標
代碼大致是這樣的:
### Top-Level CMakeLists.txt ###
cmake_minimum_required(VERSION 3.0.0)
project(Foobar)
add_library(X SHARED ${my_sources})
install(TARGETS X EXPORT FoobarExports
LIBRARY DESTINATION ${my_install_destination})
install(EXPORT FoobarExports DESTINATION ${my_install_destination})
# Create the FoobarExports.cmake for the local build tree
export(EXPORT FoobarExports) # the problematic command
# Setup FoobarConfig.cmake etc
# FoobarConfig.cmake includes FoobarExports.cmake
# ...
# Force find_package to FOOBAR_DIR
option(BUILD_EXAMPLES "Build examples" ON)
if(BUILD_EXAMPLES)
set(FOOBAR_DIR "${CMAKE_BINARY_DIR}")
add_subdirectory(examples)
endif()
### examples/CMakeLists.txt ###
cmake_minimum_required(VERSION 3.0.0)
project(FoobarExamples)
# Uses FOOBAR_DIR set above
find_package(Foobar NO_MODULE REQUIRED)
add_executable(my_exe ${some_sources})
# Use X from Foobar
target_link_library(my_exe X)
的問題是,export(EXPORT FoobarExports)
只會在生成時間結束創建FoobarExports.cmake
文件,以確保它具有完整的FoobarExports
出口集。
因此,這將失敗:
cmake . -DBUILD_EXAMPLES=ON
# Error: FoobarExports.cmake not found
什麼工作,卻是:
cmake .
cmake . -DBUILD_EXAMPLES=ON # rerun cmake with changed cache variable
我如何可以強制FoobarExports.cmake
文件,在通話的時候寫export
或如果文件尚未創建,強制CMake運行兩次?
我明白你來自哪裏。這有兩個方面的問題:它使CMakeLists.txt不必要地混亂,我不能只使用'X',因爲我使用命名空間導出目標。然後代碼會變得更加混亂。 – pmr
ALIAS目標旨在解決這個問題(自CMake 2.8.12以來)。 http://www.cmake.org/cmake/help/v3.0/manual/cmake-buildsystem.7.html#alias-targets – steveire
'它使CMakeLists.txt不必要地混亂'恕我直言,如果'命令不是凌亂 –