Cmake生成独立的makefile

时间:2014-06-25 20:47:08

标签: c++ makefile cmake platform-independent

我们正从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,但我的问题仍然存在,也许有人设法绕过?

3 个答案:

答案 0 :(得分:2)

CMake创建的makefile不是源代码库的一部分。用作CMake 输入的CMakeLists.txt文件是源代码库的一部分。将源代码复制到其他位置并希望在其中构建时,请从源代码构建。这意味着重新运行CMake。 (那就是你的解决方法。)

我一直在一个项目上使用CMake超过十年。我的团队学到的一个方便的技巧是,您可以在一个开发主机上拥有源代码的一部分的多个副本,这些主机都共享源代码库的其余部分的相同副本。尝试用相对路径做到这一点!我们依赖这个事实,每当我们在新的构建目录中构建源代码时,CMake将找出所有源文件的正确路径,这些路径不一定与新构建目录相同就像他们在之前的版本中一样。

答案 1 :(得分:2)

我为解决这类问题所做的是在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

答案 2 :(得分:0)

由cmake(makefile,ninja文件等)生成的构建文件将具有硬编码路径和其他不可移植的东西。没关系。将它们视为构建过程中的临时文件。您只会对CMakeLists.txt文件进行版本控制,然后在检出时在其他计算机或其他目录中生成新的makefile(或其他)。你甚至可以让团队中的不同人使用不同的构建文件 - 一个人使用makefile,一个人使用eclipse +忍者等等,都是由cmake生成的。