2015-09-24 68 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