生成独立的makefile

Cmake generate independent makefiles

本文关键字:makefile 独立      更新时间:2023-10-16

我们正在从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生成的。