更改cmake目录

时间:2012-10-09 14:04:45

标签: cmake fortran

我正在为具有以下结构的项目编写cmake文件

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

我的CMakeLists.txt文件目前位于project/,实际上只是

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变量(例如http://cmake.org/cmake/help/v2.8.8/cmake.html#command:set)。从一些答案中也不太清楚他们发布的解决方案是否特定于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 个答案:

答案 0 :(得分: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