C++ Cmake生成独立的生成文件

C++ Cmake生成独立的生成文件,c++,makefile,cmake,platform-independent,C++,Makefile,Cmake,Platform Independent,我们正从一家搬到另一家。 我们提供了一个包含一些示例的库。这些示例随makefiles一起提供 问题在于,由cmake生成的makefiles包含绝对路径,但不包含相对路径: # The main all target all: cmake_check_build_system cd /.../Projects/cpp_trunk && $(CMAKE_COMMAND) -E cmake_progress_start /.../Projects/cpp_trunk/CMa

我们正从一家搬到另一家。 我们提供了一个包含一些示例的库。这些示例随makefiles一起提供

问题在于,由cmake生成的makefiles包含绝对路径,但不包含相对路径:

# 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:我已经读过了,但是我的问题还在继续,也许有人设法绕过了?

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

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


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

我所做的就是围绕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

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