I have a source directory with a folder called "phantom-dir/" where I put all generated files I don't need. I want to put all generated files by CMake inside this phantom directory (together with other generated and "ugly" files).
A mini example:
$ 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
By default, all CMake files (CMakeCache.txt, cmake_install.cmake, Makefile, CMakeFiles) are written in the working directory. But, I want something like that:
$ 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
That means: the Makefile in the current directory (to make, "cmake . && make"), but the remaining generated files inside the "phantom" directory.
I know I can make it with:
$ cd phantom-dir/ $ cmake ../
But it's a little tiresome for me to do it each time I want to re-compiling or remake cmake, above all taking into account that I'm modifying many times my CMakeLists.txt.
Which variables I have to set in the CMakeLists.txt file in order to achieve it?
CMakeLists. txt is placed at the root of the source tree of any application, library it will work for. If there are multiple modules, and each module can be compiled and built separately, CMakeLists. txt can be inserted into the sub folder.
(CMake does generate a "make clean" target to remove files generated by the compiler and linker.) A "make distclean" target is only necessary if the user performs an in-source build. CMake supports in-source builds, but we strongly encourage users to adopt the notion of an out-of-source build.
Deleting CMakeCache. txt should not affect any binaries, a full rebuild is not triggered. Otherwise you might have a local variable passed on before being cached which then leads to inconsistent runs. The regeneration of the project can trigger rebuilds if the configuration is different to the previous one.
CMake is designed to support complex directory hierarchies and applications dependent on several libraries. For example, CMake supports projects consisting of multiple toolkits (i.e., libraries), where each toolkit might contain several directories, and the application depends on the toolkits plus additional code.
You could make use of the undocumented CMake options -H
and -B
to avoid leaving your source dir. -H
specifies the path to the main CMakeLists.txt file, and -B
specifies the path to your desired build directory.
cmake -H. -Bphantom-dir
Note that these are undocumented and so I suppose could change at any time the Kitware guys feel like.
To build your project without leaving your source dir, you can make use of the (official) option --build
This is a cross-platform way to invoke your chosen build tool, and you can pass whatever flags you want to this tool. e.g.
cmake --build phantom-dir -- -j3
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With