生成独立的makefile
Cmake generate independent makefiles
我们正在从MPC转向CMake。我们提供了一个带有一些示例的库。这些示例附带了makefile。
问题是由cmake生成的makefile文件包含绝对路径,而不是相对路径:
# The main all target
all: cmake_check_build_system
cd /.../Projects/cpp_trunk && $(CMAKE_COMMAND) -E cmake_progress_start /.../Projects/cpp_trunk/CMakeFiles /.../Projects/cpp_trunk/samples/CMakeFiles/progress.make
cd /.../Projects/cpp_trunk && $(MAKE) -f CMakeFiles/Makefile2 samples/all
$(CMAKE_COMMAND) -E cmake_progress_start /.../cpp_trunk/CMakeFiles 0
因此,当它被复制时,它就被破坏了。有什么变通的办法吗?
UPD:我已经阅读了FAQ,但是我的问题仍然在发生,也许有人设法绕过了?
我所做的是围绕cmake编写一个小包装Makefile来解决这类问题。我将Makefile放在项目根目录下,其内容如下:
all: cmake
cmake:
[ -f build/CMakeCache.txt ] && [ "$$(pwd)" != "$$(grep 'CMAKE_HOME_DIRECTORY:INTERNAL' build/CMakeCache.txt | cut -d '=' -f 2)" ]
&& rm -rf build || true
mkdir -p build && cd build && cmake ..
make -C build
clean:
rm -rf build
可能有一种更干净的方法,但它对我来说很有效:
make # build in one directory
cd ..
olddir=$(basename $OLDPWD) && rsync -ravz $olddir ${olddir}-test && cd ${olddir}-test # copy to another directory
make # running make in the new dir triggers a full rebuild
make # running make a second time in the new dir does not rebuild
CMake创建的makefile不是你的源代码库的一部分。作为CMake 输入的CMakeLists.txt文件是源代码库的部分。当您将源代码复制到另一个地方并希望在那里构建它时,请从源代码构建。这意味着重新运行CMake。(这是你的变通办法。)
我已经在一个项目中连续使用CMake超过十年了。我的团队学到的一个方便的技巧是,您可以在一个开发主机上拥有源代码库的一个部分的多个副本,所有这些副本都共享源代码库的其余部分的相同副本。试着用相对路径来做!我们依赖于这样一个事实:每次我们在一个新的构建目录中构建源代码时,CMake会找出所有源文件的正确路径,这些路径与新构建目录中的路径不一定相同,因为它们在以前的构建中。
由cmake生成的构建文件(makefiles, ninja文件等)将包含硬编码路径和其他不可移植的内容。没关系。将它们视为构建过程的一部分的临时文件。您将只版本CMakeLists.txt文件,然后在其他机器上或其他目录中生成新的makelists .txt文件(或其他文件)。你甚至可以让团队中不同的人使用不同的构建文件——一个人使用makefiles,一个人使用eclipse+ninja,等等,所有这些都是由cmake生成的。
- 如何使用OpenCV将RBG图像转换为HSV,并将H、S和V值保存为C++中的3个独立图像
- 独立读取-修改-写入顺序
- 带有多个独立参数的C++For循环
- 针对遗留库的链接:来自预制makefile的-lgfortranbegin
- 使用 Makefile 中的头文件编译 Pybind (不使用 cmake)
- 如何在使用Makefile构建后在cmd中运行该程序?
- Makefile g++ 使用命令行中的 -D 变量进行编译,默认值
- @CPPFLAGS@在 Makefile.in 中意味着什么?
- 通过命令行在Visual Studio中编译单个独立文件
- 如何在macOS上使用Makefile?
- 如何将独立的 c 应用程序组合到 c++ 应用程序中?
- 我们能否在stm32f中使用硬件定时器控制两个独立的进程
- Makefile 创建两个库 - 一个依赖于另一个
- antlr 规则上下文是否可以独立于目标
- 我将 Makefile 更改为 C++11 版本,但仍然收到列表初始值设定项错误
- 查找存储在二叉搜索树的所有非叶子中的数据总和?(返回整数的独立递归函数
- Arduino-Makefile:编译器无法编译用户库 cpp 文件
- Makefile by ocaml 和 cpp 扩展名
- 多个 rocksdb 实例:使用单个共享缓存还是多个独立缓存?
- 生成独立的makefile