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