Sembra che tu voglia una build fuori dal codice sorgente . Ci sono un paio di modi per creare una build fuori dal codice sorgente.
Fai quello che stavi facendo, corri
cd /path/to/my/build/folder
cmake /path/to/my/source/folder
che farà sì che CMake per generare un albero di compilazione in /path/to/my/build/folder
per la struttura di origine in /path/to/my/source/folder
.
Dopo averlo creato, cmake ricorda dove si trova la cartella sorgente, quindi puoi rieseguire cmake nell'albero di compilazione con
cmake /path/to/my/build/folder
o anche
cmake .
se la tua directory corrente è già la cartella build.
Per CMake 3.13 o versioni successive, utilizza queste opzioni per impostare l'origine e le cartelle di compilazione
cmake -B/path/to/my/build/folder -S/path/to/my/source/folder
Per le versioni precedenti di CMake, utilizza alcune opzioni non documentate per impostare l'origine e creare le cartelle :
cmake -B/path/to/my/build/folder -H/path/to/my/source/folder
che farà esattamente la stessa cosa di (1), ma senza fare affidamento sulla directory di lavoro corrente.
CMake inserisce tutti i suoi output nell'albero di compilazione per impostazione predefinita, quindi a meno che tu non stia usando liberamente ${CMAKE_SOURCE_DIR}
o ${CMAKE_CURRENT_SOURCE_DIR}
nei tuoi file cmake, non dovrebbe toccare il tuo albero dei sorgenti .
La cosa più grande che può andare storta è se hai precedentemente generato un albero di compilazione nel tuo albero dei sorgenti (cioè hai un build nel codice sorgente ). Una volta fatto ciò, la seconda parte di (1) sopra entra in gioco e cmake non apporta alcuna modifica alla sorgente o alle posizioni di build. Pertanto, non è possibile creare una build out-of-source per una directory di origine con una build in-source . Puoi risolvere questo problema abbastanza facilmente rimuovendo (almeno) CMakeCache.txt
dalla directory di origine. Ci sono alcuni altri file (principalmente inCMakeFiles
directory) generati da CMake che dovresti rimuovere, ma questi non faranno sì che cmake tratti l'albero dei sorgenti come un albero di compilazione.
Poiché le build out-of-source sono spesso più desiderabili delle build in-source, potresti voler modificare il tuo cmake per richiedere build fuori dal sorgente:
# Ensures that we do an out of source build
MACRO(MACRO_ENSURE_OUT_OF_SOURCE_BUILD MSG)
STRING(COMPARE EQUAL "${CMAKE_SOURCE_DIR}"
"${CMAKE_BINARY_DIR}" insource)
GET_FILENAME_COMPONENT(PARENTDIR ${CMAKE_SOURCE_DIR} PATH)
STRING(COMPARE EQUAL "${CMAKE_SOURCE_DIR}"
"${PARENTDIR}" insourcesubdir)
IF(insource OR insourcesubdir)
MESSAGE(FATAL_ERROR "${MSG}")
ENDIF(insource OR insourcesubdir)
ENDMACRO(MACRO_ENSURE_OUT_OF_SOURCE_BUILD)
MACRO_ENSURE_OUT_OF_SOURCE_BUILD(
"${CMAKE_PROJECT_NAME} requires an out of source build."
)
La macro sopra proviene da un modulo comunemente usato chiamato MacroOutOfSourceBuild
. Ci sono numerose fonti per MacroOutOfSourceBuild.cmake
su Google ma non riesco a trovare l'originale ed è abbastanza breve da includerlo qui per intero.
Sfortunatamente cmake di solito ha scritto alcuni file nel momento in cui viene richiamata la macro, quindi anche se ti impedirà di eseguire effettivamente la compilazione, dovrai comunque eliminare CMakeCache.txt
e CMakeFiles
.
Potresti trovare utile impostare i percorsi in cui vengono scritti i binari, le librerie condivise e statiche - nel qual caso vedi come faccio a creare l'output di cmake in una directory 'bin'? (disclaimer, ho la risposta più votata su questa domanda ... ma è così che lo so).
CMAKE_BINARY_DIR
oCMAKE_CACHEFILE_DIR
. Cosa succede se rimuovi tutte questeset()
chiamate e lo faicd Compile; rm -rf *; cmake ../src
?