Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Changing CMake files standard location

Tags:

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?

like image 532
Peregring-lk Avatar asked Dec 04 '12 21:12

Peregring-lk


People also ask

Where do I put CMakeLists txt?

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.

Is there a CMake clean?

(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.

Can I delete CMake cache?

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.

What is the CMake folder?

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.


1 Answers

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 
like image 80
Fraser Avatar answered Sep 18 '22 21:09

Fraser