2014-07-10 60 views
2

我有一個CMake項目Foobar,它包含一個子目錄examples,它也可以用作獨立的CMake構建。爲此,該子目錄執行find_package(Foobar)並使用導出的目標。 Foobar提供了FoobarConfig.cmake,FoobarConfigVersion.cmakeFoobarExports.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運行兩次?

回答

1

如果您將項目構建爲子項目,則不需要查找任何內容。只需檢查 目標是否存在,如果沒有,請嘗試找到它。類似的東西:

### examples/CMakeLists.txt ### 
cmake_minimum_required(VERSION 3.0.0) 
project(FoobarExamples) 

if(NOT TARGET X) 
    find_package(Foobar CONFIG REQUIRED) 
endif() 

# Use X from Foobar 
target_link_library(my_exe X) 
+0

我明白你來自哪裏。這有兩個方面的問題:它使CMakeLists.txt不必要地混亂,我不能只使用'X',因爲我使用命名空間導出目標。然後代碼會變得更加混亂。 – pmr

+2

ALIAS目標旨在解決這個問題(自CMake 2.8.12以來)。 http://www.cmake.org/cmake/help/v3.0/manual/cmake-buildsystem.7.html#alias-targets – steveire

+1

'它使CMakeLists.txt不必要地混亂'恕我直言,如果'命令不是凌亂 –

相關問題