【问题标题】:Changing CMake files standard location更改 CMake 文件标准位置
【发布时间】:2012-11-22 14:48:30
【问题描述】:

我有一个源目录,其中包含一个名为“phantom-dir/”的文件夹,其中放置了所有不需要的生成文件。我想将 CMake 生成的所有文件放在这个幻像目录中(连同其他生成的和“丑陋”的文件)。

一个小例子:

$ mkdir cmake-test
$ cd cmake-test
$ echo 'message("Hello World!")' > CMakeLists.txt
$ cmake . | grep "Hello"
Hello World!
$ tree
.
├── CMakeCache.txt
├── CMakeFiles
│   ├── CMakeCCompiler.cmake
│   ├── cmake.check_cache
│   ├── CMakeCXXCompiler.cmake
│   ├── CMakeDetermineCompilerABI_C.bin
│   ├── CMakeDetermineCompilerABI_CXX.bin
│   ├── CMakeDirectoryInformation.cmake
│   ├── CMakeOutput.log
│   ├── CMakeSystem.cmake
│   ├── CMakeTmp
│   ├── CompilerIdC
│   │   ├── a.out
│   │   └── CMakeCCompilerId.c
│   ├── CompilerIdCXX
│   │   ├── a.out
│   │   └── CMakeCXXCompilerId.cpp
│   ├── Makefile2
│   ├── Makefile.cmake
│   ├── progress.marks
│   └── TargetDirectories.txt
├── cmake_install.cmake
├── CMakeLists.txt
└── Makefile

4 directories, 20 files

默认情况下,所有 CMake 文件(CMakeCache.txt、cmake_install.cmake、Makefile、CMakeFiles)都写入工作目录。但是,我想要这样的东西:

$ mkdir cmake-test
$ cd cmake-test
$ mkdir phantom-dir
$ echo 'message("Hello World!")' > CMakeLists.txt
$ // editing CMakeLists.txt to set some cmake variables.
$ cmake . | grep "Hello"
Hello World!
$ tree
.
├── phantom-dir
│   ├── CMakeCache.txt
│   ├── CMakeFiles
│   │   ├── CMakeCCompiler.cmake
│   │   ├── cmake.check_cache
│   │   ├── CMakeCXXCompiler.cmake
│   │   ├── CMakeDetermineCompilerABI_C.bin
│   │   ├── CMakeDetermineCompilerABI_CXX.bin
│   │   ├── CMakeDirectoryInformation.cmake
│   │   ├── CMakeOutput.log
│   │   ├── CMakeSystem.cmake
│   │   ├── CMakeTmp
│   │   ├── CompilerIdC
│   │   │   ├── a.out
│   │   │   └── CMakeCCompilerId.c
│   │   ├── CompilerIdCXX
│   │   │   ├── a.out
│   │   │   └── CMakeCXXCompilerId.cpp
│   │   ├── Makefile2
│   │   ├── Makefile.cmake
│   │   ├── progress.marks
│   │   └── TargetDirectories.txt
│   ├── cmake_install.cmake
├── CMakeLists.txt
└── Makefile

4 directories, 20 files

也就是说:Makefile在当前目录下(make, "cmake . && make"),而剩下的生成文件在"phantom"目录下。

我知道我可以做到:

$ cd phantom-dir/
$ cmake ../

但是每次我想重新编译或重新制作 cmake 时都这样做有点累,最重要的是考虑到我要多次修改我的 CMakeLists.txt。

为了实现它,我必须在 CMakeLists.txt 文件中设置哪些变量?

【问题讨论】:

  • 我们编写了一个脚本来为我们完成所有的目录更改。即:build.sh compilebuild.sh configure 将执行目录更改、make 或 cmake 以及 make 安装。
  • 您的方法的问题是:代码(构建过程)不再是跨平台的。然后,我需要每个已知平台的脚本。也许以脚本模式 (-D) 执行它的 CMake 文件将是一个等效的解决方案,但这个解决方案并不优雅(在我看来)。
  • 我们做了一个python脚本而不是bash脚本,所以它仍然是跨平台的。但这就是为什么它只是一个评论而不是一个答案,我知道它并没有完全解决你的问题:)
  • 我在问题的最后解释一下:这意味着每次我必须编译或重建项目时都要移入这个“构建目录”,当我必须多次这样做时,它变得有点累了。
  • +1 表示tree 命令...在 UNIX 的近二十年中,这是我第一次看到它 - 难以置信! :-)

标签: build cmake


【解决方案1】:

您可以使用未记录的 CMake 选项 -H-B 来避免离开您的源目录。 -H 指定主 CMakeLists.txt 文件的路径,-B 指定所需构建目录的路径。

cmake -H. -Bphantom-dir

请注意,这些都是无证的,所以我想 Kitware 人可以随时更改。

要在不离开源目录的情况下构建项目,您可以使用(官方)选项--build 这是调用您选择的构建工具的跨平台方式,您可以将任何您想要的标志传递给它工具。例如

cmake --build phantom-dir -- -j3

【讨论】:

  • 哦,谢谢!我想通过 CMakeLists.txt 文件中的“set”命令是不可能的,不是吗?
  • @Kenny 因为这就是 CMake 的意义所在,我猜(一个半记录的移动目标 12-ways-to-do-anything):)
  • -H 不再用于此目的(它会打印帮助)。我不确定-B 是否仍然存在。
  • 另请参阅 stackoverflow.com/questions/31090821/… 以获取有关 -H 选项的信息以及深入 CMake 源代码以找到它。
  • -H 选项的小提示:注意 cmake -Hcmake -H. 之间的区别 - 第一个将打印帮助,而第二个将主目录设置为当前工作目录
猜你喜欢
  • 1970-01-01
  • 2015-10-19
  • 2014-12-14
  • 1970-01-01
  • 2012-09-15
  • 1970-01-01
  • 1970-01-01
  • 2016-04-10
  • 2013-10-12
相关资源
最近更新 更多