2015-09-24 12 views
6

Esistono utility che utilizzano un compilatore esistente aggiungendo un comando come prefisso (quindi, anziché chiamare cc -c file.c, è possibile chiamare distcc cc -c file.c).Utilizzo dei comandi del prefisso del compilatore con CMake (distcc, ccache)

Quando si utilizza il comando CMake compilatore può essere cambiato, ma mi sono imbattuto in problemi cercando di utilizzare distcc, anche se questo sarebbe probabilmente applica a qualsiasi prefisso comando per il compilatore (ccache troppo).

  • CMake si aspetta che il compilatore di essere un percorso assoluto,
    quindi impostando CMAKE_C_COMPILER-/usr/bin/distcc /usr/bin/cc, dà un errore:

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

  • Impostazione del compilatore di /usr/bin/distcc e
    CMAKE_C_COMPILER_ARG1 o CMAKE_C_FLAGS per iniziare con /usr/bin/cc funziona in alcuni casi, ma fallisce con CHECK_C_SOURCE_COMPILES
    (controllato se C'era un modo per supportare questo, anche il prefisso CMAKE_REQUIRED_FLAGS non funzionava).

L'unico modo che ho trovato per farlo è quello di avvolgere i comandi in uno script di shell.

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

Anche se questo funziona, Sarebbe bello essere in grado di utilizzare gli helper del compilatore con CMake, senza dover andare anche se gli script di shell (dando qualche piccolo overhead quando il sistema di generazione potrebbe utilizzare un prefisso di comando).


Quindi la mia domanda è:

Può CMake utilizzare i comandi prefisso compilatore (come distcc) direttamente ?, senza wrapper script di shell?

+1

sta impostando i tuoi '/' variabili d'ambiente CXX' cc' quando si chiama cmake (ad esempio 'CC = "distcc gcc" cmake ..') insufficiente per qualche motivo? –

+0

@Iskar Jarak, Questo funziona! (quindi immagino che questa possa essere la risposta). È interessante notare che internamente utilizza 'CMAKE_C_COMPILER' per il primo comando e' CMAKE_C_COMPILER_ARG1' per il secondo. Non sono sicuro di cosa stia succedendo - perché ho provato ad impostarli già in cmake-gui e 'CMAKE_C_COMPILER_ARG1' è stato ignorato con' CHECK_C_SOURCE_COMPILES'. – ideasman42

+0

Felice che funzioni. L'impostazione della variabile d'ambiente probabilmente imposta anche altre cose, cose che usano 'CHECK_C_SOURCE_COMPILES' ... anche se non sono al 100% cosa ... ed è per questo che fare scherzi con le singole variabili in CMake è un tale dolore al collo. –

risposta

8

Dal CMake 3.4.0 c'è stata una variabile CMAKE_<LANG>_COMPILER_LAUNCHER e una destinazione corrispondente <LANG>_COMPILER_LAUNCHER. Così, se il progetto è C-solo si potrebbe fare qualcosa di simile:

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

Se si dispone di un progetto C++, utilizzare -DCMAKE_CXX_COMPILER_LAUNCHER=ccache.

Oppure, rendere il vostro CMakeLists.txt intelligente e usare ccache automaticamente se si può trovare:

#----------------------------------------------------------------------------- 
# 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

Secondo i documenti di CMake, la proprietà di destinazione ' _COMPILER_LAUNCHER' sarà onorata solo dai generatori Makefile e Ninja. Devi fare più lavoro per ottenere Xcode per usare il launcher. Vedere [questa risposta] (http://stackoverflow.com/a/36515503/1938798) per un metodo più generale che utilizza la variabile RULE_LAUNCH_COMPILE precedente e CMAKE_XCODE_ATTRIBUTE _..., ma presenta somiglianze con il proprio approccio. –

+0

Purtroppo, CMAKE_ _COMPILER_LAUNCHER viene ignorato in CHECK_ _SOURCE_COMPILES, anche con l'ultimo cmake (3.10.1). Ciò significa che il wrapper è ancora necessario se il risultato del test dipende dal programma di avvio. – proski