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