CMake输出/构建目录

时间:2013-09-16 11:26:02

标签: c++ build makefile cmake output

我对cmake很新,并阅读了一些关于如何使用它的教程,并编写了一些复杂的50行CMake脚本,以便为3个不同的编译器制作程序。这可能结束了我对cmake的所有了解。

现在我的问题是我有一些源代码,当我制作程序时,我不想触摸/弄乱它的文件夹。我希望所有的cmake和输出文件和文件夹进入../Compile/,所以我在我的cmake脚本中更改了一些变量,并且它在我的笔记本电脑上做了类似的事情时工作了一段时间:

Compile$ cmake ../src
Compile$ make

我在那里的文件夹里有一个干净的输出,这正是我正在寻找的。

现在我搬到了另一台电脑,并重新编译了CMake 2.8.11.2,我几乎回到原点!它总是将事物编译到我的CMakeLists.txt所在的src文件夹中。

我在cmake脚本中选择目录的部分是:

set(dir ${CMAKE_CURRENT_SOURCE_DIR}/../Compile/)
set(EXECUTABLE_OUTPUT_PATH ${dir} CACHE PATH "Build directory" FORCE)
set(LIBRARY_OUTPUT_PATH ${dir} CACHE PATH "Build directory" FORCE)
set(CMAKE_RUNTIME_OUTPUT_DIRECTORY ${dir})
set(CMAKE_BUILD_FILES_DIRECTORY ${dir})
set(CMAKE_BUILD_DIRECTORY ${dir})
set(CMAKE_BINARY_DIR  ${dir})
SET(EXECUTABLE_OUTPUT_PATH ${dir})
SET(LIBRARY_OUTPUT_PATH ${dir}lib)
SET(CMAKE_CACHEFILE_DIR ${dir})

现在它始终以:

结束
-- Build files have been written to: /.../src

我错过了什么吗?

5 个答案:

答案 0 :(得分:89)

听起来你想要out of source build。有两种方法可以创建源代码构建。

  1. 做你正在做的事,运行

    cd /path/to/my/build/folder
    cmake /path/to/my/source/folder
    

    将导致cmake在/path/to/my/build/folder中为/path/to/my/source/folder中的源树生成构建树

    一旦你创建了它,cmake会记住源文件夹的位置 - 所以你可以重新运行 使用

    在构建树上进行cmake
    cmake /path/to/my/build/folder
    

    甚至

    cmake .
    

    如果您当前的目录已经是构建文件夹。

  2. 使用一些undocumented options to set the source and build folders

    cmake -B/path/to/my/build/folder -H/path/to/my/source/folder
    

    与(1)完全相同,但不依赖当前的工作目录。

  3. 默认情况下,CMake将其所有输出放在构建树中,因此,除非您在cmake文件中使用${CMAKE_SOURCE_DIR}${CMAKE_CURRENT_SOURCE_DIR},否则它不应该'触摸源树

    最大的问题是,如果您之前在源代码树中生成了一个构建树(即您在源构建中有)。完成此操作后,上面(1)的第二部分就会启动,并且cmake不会对源或构建位置进行任何更改。因此,您无法使用源内构建为源目录创建源外构建。您可以通过从源目录中删除(至少)CMakeCache.txt来相当容易地解决此问题。 CMake生成的还有一些其他文件(主要在CMakeFiles目录中)也应删除,但这些文件不会导致cmake将源树视为构建树。

    由于源外构建通常比源内构建更令人满意,因此您可能希望将cmake修改为需要源代码构建:

    # Ensures that we do an out of source build
    
    MACRO(MACRO_ENSURE_OUT_OF_SOURCE_BUILD MSG)
         STRING(COMPARE EQUAL "${CMAKE_SOURCE_DIR}"
         "${CMAKE_BINARY_DIR}" insource)
         GET_FILENAME_COMPONENT(PARENTDIR ${CMAKE_SOURCE_DIR} PATH)
         STRING(COMPARE EQUAL "${CMAKE_SOURCE_DIR}"
         "${PARENTDIR}" insourcesubdir)
        IF(insource OR insourcesubdir)
            MESSAGE(FATAL_ERROR "${MSG}")
        ENDIF(insource OR insourcesubdir)
    ENDMACRO(MACRO_ENSURE_OUT_OF_SOURCE_BUILD)
    
    MACRO_ENSURE_OUT_OF_SOURCE_BUILD(
        "${CMAKE_PROJECT_NAME} requires an out of source build."
    )
    

    上面的宏来自一个名为MacroOutOfSourceBuild的常用模块。谷歌MacroOutOfSourceBuild.cmake有很多来源,但我似乎无法找到原文,而且它的篇幅很短,可以全部包含在这里。

    不幸的是,cmake通常会在调用宏时编写一些文件,因此虽然它会阻止您实际执行构建,但仍需要删除CMakeCache.txtCMakeFiles

    您可能会发现设置二进制文件,共享库和静态库的写入路径很有用 - 在这种情况下请参阅how do I make cmake output into a 'bin' dir?(免责声明,我对该问题有最高投票答案......但是&# 39;我是怎么知道的。)

答案 1 :(得分:50)

几乎不需要设置您正在设置的所有变量。 CMake将它们设置为合理的默认值。您绝对应该修改CMAKE_BINARY_DIRCMAKE_CACHEFILE_DIR。将它们视为只读。

首先从src目录中删除现有的有问题的缓存文件:

cd src
rm CMakeCache.txt
cd ..

然后删除所有set()命令并执行:

cd Compile
rm -rf *
cmake ../src

只要您在运行CMake时不在源目录之外,它就不会修改源目录,除非您的CMakeList明确告诉它。

一旦你有了这个工作,你可以看看CMake默认放置的地方,并且只有当你对默认位置(例如EXECUTABLE_OUTPUT_PATH的默认值)不满意时,才修改那些你需要。并尝试相对于CMAKE_BINARY_DIRCMAKE_CURRENT_BINARY_DIRPROJECT_BINARY_DIR等表达它们。

如果你看一下CMake文档,你会看到变量被划分为语义部分。除非常特殊情况外,您应将在“提供信息的变量”下列出的所有内容视为CMakeLists中的只读。

答案 2 :(得分:6)

截至CMake Wiki

  

CMAKE_BINARY_DIR       如果你在源代码中构建,这与CMAKE_SOURCE_DIR相同,否则这是你的顶级目录   构建树

比较这两个变量以确定是否已启动源外构建

答案 3 :(得分:5)

将我的评论转化为答案:

如果有人做了我做的事情,首先将所有构建文件放在源目录中:

cd src
cmake .

cmake会在CMakeCache.txt目录中放置一堆构建文件和缓存文件(CMakeFilescmake_install.cmakesrc等)。

要更改为源代码构建,我必须删除所有这些文件。然后我可以做@Agnew在他的回答中推荐的内容:

mkdir -p src/build
cd src/build
cmake ..

答案 4 :(得分:4)

首先,您不应该在脚本中继续构建目录名称。必须更改../Compile的行。

这是因为用户可以在哪里编译。

而不是使用预定义变量之一: http://www.cmake.org/Wiki/CMake_Useful_Variables (寻找CMAKE_BINARY_DIR和CMAKE_CURRENT_BINARY_DIR)