2015-09-24 66 views
6

有些实用程序通过将命令添加为前缀来使用现有编译器(因此不必调用cc -c file.c,您可以调用distcc cc -c file.c)。在CMake中使用编译器前缀命令(distcc,ccache)

使用CMake时,编译器命令可以改变,但是我遇到了试图使用distcc的问题,尽管这可能适用于编译器的任何命令前缀(ccache)。

  • CMake的预计编译器是绝对路径,
    所以设置CMAKE_C_COMPILER/usr/bin/distcc /usr/bin/cc,给出了一个错误:

    /usr/bin/distcc /usr/bin/cc is not a full path to an existing compiler tool.

  • 设置编译器/usr/bin/distcc
    CMAKE_C_COMPILER_ARG1CMAKE_C_FLAGS开始与/usr/bin/cc在某些情况下工作,但与CHECK_C_SOURCE_COMPILES
    失败(检查是否th有一些方法可以支持这一点,即使前缀CMAKE_REQUIRED_FLAGS没有工作)

我发现做到这一点的唯一方法是包装在一个shell脚本的命令。

#!/bin/sh 
exec /usr/bin/distcc /usr/bin/cc "[email protected]" 

虽然这个作品,这将是很好能够使用与CMake的编译器帮手,而不必去虽然shell脚本(给一些小的开销,当构建系统可以只使用一个命令前缀)。


所以我的问题是:

可以CMake的使用编译器前缀命令(如distcc的)直接?没有shell脚本包装?

+1

调用cmake的(如:'CC = “distcc的GCC” 当你设置'CC' /'CXX'环境变量cmake ..')由于某种原因不足? –

+0

@Iskar Jarak,这个作品! (所以我想这可能是答案)。 有趣的是,它在内部使用第一个命令的'CMAKE_C_COMPILER'和第二个'CMAKE_C_COMPILER_ARG1'。我不知道发生了什么 - 因为我已经尝试在cmake-gui中设置这些参数,并且'CMAKE_C_COMPILER_ARG1'被'CHECK_C_SOURCE_COMPILES'忽略。 – ideasman42

+0

很好用。设置环境变量可能也会设置一些其他的东西,CHECK_C_SOURCE_COMPILES使用的东西......尽管我不是100%......这就是为什么在CMake中混入单个变量的原因是如此痛苦。 –

回答

8

由于CMake 3.4.0已有一个CMAKE_<LANG>_COMPILER_LAUNCHER变量和相应的目标属性<LANG>_COMPILER_LAUNCHER。所以,如果你的项目是C-只有你会做这样的事情:如果你有一个C++项目

cmake -DCMAKE_C_COMPILER_LAUNCHER=ccache /path/to/source 
CCACHE_PREFIX=distcc make -j`distcc -j` 

,使用-DCMAKE_CXX_COMPILER_LAUNCHER=ccache

或者,让你的智能CMakeLists.txt并自动使用ccache的,如果它可以发现:

#----------------------------------------------------------------------------- 
# Enable ccache if not already enabled by symlink masquerading and if no other 
# CMake compiler launchers are already defined 
#----------------------------------------------------------------------------- 
find_program(CCACHE_EXECUTABLE ccache) 
mark_as_advanced(CCACHE_EXECUTABLE) 
if(CCACHE_EXECUTABLE) 
    foreach(LANG C CXX) 
    if(NOT DEFINED CMAKE_${LANG}_COMPILER_LAUNCHER AND NOT CMAKE_${LANG}_COMPILER MATCHES ".*/ccache$") 
     message(STATUS "Enabling ccache for ${LANG}") 
     set(CMAKE_${LANG}_COMPILER_LAUNCHER ${CCACHE_EXECUTABLE} CACHE STRING "") 
    endif() 
    endforeach() 
endif() 
+0

根据CMake的文档,' _COMPILER_LAUNCHER'目标属性只有Makefiles和Ninja生成器才会受到尊重。你必须做更多的工作才能让Xcode使用启动器。请参阅[本答案](http://stackoverflow.com/a/36515503/1938798)了解更常用的方法,该方法使用较旧的RULE_LAUNCH_COMPILE变量和CMAKE_XCODE_ATTRIBUTE _...,但与您的方法有相似之处。 –

+0

不幸的是,CMAKE_ _COMPILER_LAUNCHER在CHECK_ _SOURCE_COMPILES中被忽略,即使是最新的cmake(3.10.1)。这意味着如果测试结果取决于启动器,则仍然需要包装器。 – proski