cmake force parallel.在链接之前进行编译

Lau*_*tti 6 c++ linux makefile cmake

我有一个包含5个库的项目,每个库来自10个C++源文件,然后是10个依赖于库的可执行文件.每个库也取决于前一个库.在48核Ubuntu机器上使用CMake然后'make -j 50',我首先要等待每个库在10个或更少的内核上构建(大多数更少,因为一个.C文件需要几分钟才能编译),然后我的可执行文件并行构建.

我想首先在所有.C源文件上并行运行所有.Co编译(我知道如何将该列表放入CMake变量中),然后按依赖项指定的顺序仅运行链接器.

有没有办法用CMake做到这一点,例如通过设置虚假的目标或类似的东西?(我只想重新编译已修改的.C文件).

Jas*_*son 1

实现此目的的一种方法是添加一个错误目标,其中包含 CMake 中每个库目标的所有源。一个示例 CMakeLists.txt 可能是...

set(ONE_SRC one/a.c one/b.c)
set(TWO_SRC two/a.c two/b.c)

# pre-compile
add_library(all ${ONE_SRC} ${TWO_SRC})

add_library(one ${ONE_SRC})
add_library(two ${TWO_SRC})

add_dependencies(one all)
add_dependencies(two one)
Run Code Online (Sandbox Code Playgroud)

liball.so目标将编译所有其他库所需的所有源,并且当您运行、等时,它应该打破libone.solibtwo.so源文件之间的错误依赖关系...它将最大化编译并行性跨目标。makeninja

CMake可能不够智能,无法${ONE_SRC} ${TWO_SRC}仅编译一次文件。但是,可以使用ccache来修复此问题,它将缓存预处理的文件。它的另一个好处是减少任何相同的重新编译时间。

ccache 的一个简单配置是将符号链接添加到本地 .ccache 中的 ccache 二进制文件$PATH

jason@io ~ $ ll ~/bin/ccache
total 0
lrwxrwxrwx 1 jason jason 15 May 12  2013 c++ -> /usr/bin/ccache*
lrwxrwxrwx 1 jason jason 15 May 12  2013 cc -> /usr/bin/ccache*
lrwxrwxrwx 1 jason jason 15 Apr 27 21:38 clang -> /usr/bin/ccache*
lrwxrwxrwx 1 jason jason 15 Apr 27 21:38 clang++ -> /usr/bin/ccache*
lrwxrwxrwx 1 jason jason 15 May 12  2013 g++ -> /usr/bin/ccache*
lrwxrwxrwx 1 jason jason 15 Oct  6  2013 gcc -> /usr/bin/ccache*
lrwxrwxrwx 1 jason jason 15 May 12  2013 x86_64-pc-linux-gnu-c++ -> /usr/bin/ccache*
lrwxrwxrwx 1 jason jason 15 May 12  2013 x86_64-pc-linux-gnu-g++ -> /usr/bin/ccache*
lrwxrwxrwx 1 jason jason 15 May 12  2013 x86_64-pc-linux-gnu-gcc -> /usr/bin/ccache*
Run Code Online (Sandbox Code Playgroud)

ccache 环境变量相对简单。

# ccache

export CCACHE_DIR="/var/ccache/${USER}"
export CCACHE_SIZE="4G"
export CCACHE_COMPRESS="1"
Run Code Online (Sandbox Code Playgroud)