使用CMake生成独立的Makefile。

6
我们正在从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

所以,当它被复制时就会变得损坏。 有没有什么方法可以解决这个问题?

更新:我已经阅读了常见问题解答,但我的问题仍然存在,也许有人成功地绕过了这个问题?


你是否计划将Makefiles与你的库一起发送给第三方?在这种情况下,由CMake生成的Makefiles并不适合。也许你可以编写一个简单的Makefile生成器,专门适用于你的示例,这可以使用CMake命令或独立工具完成。 - Lindydancer
@Lindydancer,是的,这就是问题所在。当我们使用MPC时,我们不需要手动执行任何操作。问题是如何生成适合提供给第三方的Makefiles,而不使用任何独立工具。 - D_E
如果您想让它们都在标准格式上,那么我建议您查看CMake命令以写入文件,例如file()并自己编写一个,或者您可以使用configure()并让CMake填充空白。如果您编写自己的工具,它可以通过CMake使用add_custom_command()启动。这不是很好的解决方案,但在您的情况下它会起作用。 - Lindydancer
3个回答

3

为了解决这种情况,我写了一个小的Makefile包装器来包装cmake。我将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
CMake创建的makefile不是您源代码库的一部分。您作为CMake输入的CMakeLists.txt文件是您源代码库的一部分。当您将源代码复制到其他位置并希望在那里构建它时,请从源代码构建。这意味着重新运行CMake。(这是您的解决方法。)
我已经连续十年在一个项目上使用CMake。我们团队学到的一个方便的技巧是,您可以在一个开发主机上有多个副本的源代码库的一个部分,它们都共享源代码库的其余部分的同一份副本。试着用相对路径做到这一点吧!我们依赖于每次在新的构建目录中构建源代码时,CMake会找出所有源文件的正确路径,这些路径不一定与以前的构建相对路径相同。

0

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


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接