2012-10-09 163 views
0

我正在寫它具有以下結構更改cmake的目錄

project/ (root) 
    libraries/ (contains (precompiled) libraries 
    src/ 
    code/ (contains a set of fortran files) 

我的CMakeLists.txt文件正在project/一個項目cmake的文件,有效地只是

cmake_minimum_required(VERSION 2.6) 

enable_language(Fortran) 
project(project1) 

set(projsrc src/code) 

set(libdir lib/) 

find_library(PROJ_LIBRARY pr10 PATHS ${libdir}) 

add_executable (sc1 sc1.f90) 
target_link_libraries(sc1 ${PROJ_LIBRARY}) 

這將創建我的二進制文件與源代碼在同一個文件夾中,當我真的想要它在上面的級別(即在src文件夾 - 這個結構將被改變,所以我們最終有一個bin文件夾),但還沒有制定出如何做它。

一些關於SO的解釋說你必須在每個文件夾中都有一個CMakeLists.txt文件 - 這是正確的嗎?是否可以設置環境變量或使用CMake變量(例如)。從某些答案來看,他們發佈的解決方案是否是特定於C++的(因爲這是CMake最常用的語言),這一點也不是很清楚。

編輯

我發現我可以把它改成我想通過稍微修改它的行爲:

cmake_minimum_required(VERSION 2.6) 
enable_language(Fortran) 
project(project1) 

set(projsrc src/code) 

set(libdir lib/) 

find_library(PROJ_LIBRARY pr10 PATHS ${libdir}) 

add_executable (src/sc1 ${projsrc}/sc1.f90) 
target_link_libraries(src/sc1 ${PROJ_LIBRARY}) 

然而,這並不能解釋爲什麼行爲是不同的根據下面的arrowdodger,它應該如何。我還在努力研究如何顯示環境變量的值;我已經嘗試了以下,但沒有運氣:

message(${RUNTIME_OUTPUT_DIRECTORY}) 
message($ENV{RUNTIME_OUTPUT_DIRECTORY}) 
message(${CMAKE_RUNTIME_OUTPUT_DIRECTORY}) 
message($ENV{CMAKE_RUNTIME_OUTPUT_DIRECTORY}) 
+1

小心你的「bin」目錄的想法。這不是現代建築的工作方式,原因很多。您可能需要「源代碼構建」,請參閱此處:http://stackoverflow.com/a/12237398/587407 – Offirmo

+0

@Offirmo - 嗯,我使用的所有科學軟件似乎都有一個「src」和「 bin'dir結構 - 這個想法有什麼問題?任何進一步的閱讀你可以指向我? – ChrisW

+2

例如,如果您想使用不同的編譯器(我這樣做)或不同的選項(我也這樣做)製作相同的程序,那麼如何讓它們在bin目錄中共存?你將不得不復制整個結構。使用「源外」構建,您可以擁有儘可能多的「箱子」,您可以共享相同的來源。 cmake提倡它:http://www.cmake.org/Wiki/CMake_FAQ#Out-of-source_build_trees,例如,Wt庫的構建方式如下:http://www.webtoolkit。EU /重量/ DOC /參考/ HTML/InstallationUnix.html#建立。 – Offirmo

回答

0

默認情況下,二進制文件將出現在您的構建目錄的相應子目錄中。相應我的意思是包含CMakeLists.txtadd_executable()調用的目錄。

例如,如果您在根文件夾下面CMakeLists.txt

add_executable(tgt1 src1.f90) 
add_executable(tgt2 subdir/src2.f90) 

,你會在${CMAKE_BINARY_DIR}得到兩個二進制文件。因此,如果您希望tgt2位於${CMAKE_BINARY_DIR}/subdir,則需要在那裏添加CMakeLists.txt並從那裏撥打add_executable(tgt2 src2.f90)

你可以改變這種行爲:

CMAKE_LIBRARY_OUTPUT_DIRECTORYCMAKE_RUNTIME_OUTPUT_DIRECTORY等。您可以設置respective target properties

+0

感謝提示;儘管我的經驗似乎有些不同 - 二進制文件比我的'CMakeLists.txt'文件低2級(「CMakeLists.txt」在'root /'中,二進制文件在'root/src/code'中創建) - 有什麼我誤解?另外,你如何找出CMAKE_RUNTIME_OUTPUT_DIRECTORY目前設置爲什麼?我找不到它在文檔 – ChrisW

+0

嗯,奇怪。這可能是Fortran特有的。你能發佈實際的'CMakeLists.txt'嗎? – arrowd

+0

我已經更新了我的問題,並提供了一些更多信息 – ChrisW