【问题标题】:Cmake generate independent makefilesCmake生成独立的makefile
【发布时间】:2014-08-16 13:56:46
【问题描述】:

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

【问题讨论】:

  • 您是否打算将您的库中的 Makefile 发送给第三方?在这种情况下,由 CMake 生成的 Makefile 不太适合。也许您可以编写一个专门适合您的示例的简单 Makefile 生成器,这可以使用 CMake 命令或独立工具来完成。
  • @Lindydancer,是的,这就是问题所在。使用 MPC 时,我们无需手动执行任何操作。问题是如何在不使用任何独立工具的情况下生成适合提供给第三方的 Makefile。
  • 如果您希望它们都采用标准格式,那么我建议您查看用于写入文件的 CMake 命令,例如file() 并自己写一个,或者您可以使用 configure() 并让 CMake 填空。如果您编写自己的工具,它可以通过 CMake 使用add_custom_command() 启动。不是很好的解决方案,但它适用于您的情况。

标签: c++ makefile cmake platform-independent


【解决方案1】:

我为解决这类问题所做的就是围绕 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】:

    CMake 创建的 makefile 不属于您的源代码库。您用作 CMake 输入的 CMakeLists.txt 文件源代码库的一部分。当您将源代码复制到不同的地方并想在那里构建它时,请从您的源代码构建。这意味着重新运行 CMake。 (这就是您的解决方法。)

    我已经在一个项目上连续使用 CMake 十多年了。我的团队学到的一个方便的技巧是,您可以在一台开发主机上拥有源代码库的一部分的多个副本,所有这些副本都共享您源代码库其余部分的相同副本。尝试使用相对路径来做到这一点!我们依赖每次我们在新的构建目录中构建源代码时,CMake 都会找出所有源文件的正确路径,相对于新的构建目录,这些路径不一定相同就像它们在以前的版本中一样。

    【讨论】:

      【解决方案3】:

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

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2014-05-24
        • 1970-01-01
        • 1970-01-01
        • 2012-04-25
        • 2017-12-28
        • 1970-01-01
        • 2011-10-23
        • 1970-01-01
        相关资源
        最近更新 更多