2010-01-18 4 views
5

Sono uno sviluppatore C++ di apprendimento che scrive inizialmente un gioco sulla piattaforma Mac utilizzando XCode, ma che ora passa a una piattaforma incrociata sfruttando CMake. Finora posso averlo compilato sul mio ickle linux netbook e sto mettendo insieme un ambiente di sviluppo su questa macchina per la codifica on the go. Comunque sto trovando che gcc ricompila ogni file ogni volta che apporto una modifica. Chiaramente ho bisogno di qualche configurazione aggiuntiva a CMakeLists.txt. Il mio attuale è molto semplice. Così;cmake & gcc compila ogni file ogni volta

cmake_minimum_required (VERSION 2.8) 
set (source 
Creature.cpp 
DisplayManager.cpp 
Engine.cpp 
EngineState.cpp 
Entity.cpp 
GameWorld.cpp 
GfxSFML.cpp 
Item.cpp 
Map.cpp 
Position.cpp 
Projectile.cpp 
ScreenTile.cpp 
SquadAI.cpp 
Terrain.cpp 
UIButton.cpp 
UICharPanel.cpp 
UIView.cpp 
Utility.cpp 
Weapon.cpp 
fov.cpp 
main.cpp 
) 

find_package (OpenAL) 
find_package (OpenGL) 
find_package (SFML) 

set(CMAKE_CXX_FLAGS "-g -Wall -pg") 
add_executable (tractionedge ${source}) 
target_link_libraries(tractionedge ${SFML_LIBRARY} ${OPENGL_LIBRARY} ${OPENAL_LIBRARY}) 

mi sono concentrato finora su C++ come linguaggio piuttosto che sistemi costruire da attaccare con XCode per tutto. La mia conoscenza di Autotools (make?) E Gcc è molto limitata. Come posso fare in modo che gcc ricompili solo la fonte cambiata?

risposta

3

Ricostruire solo le sorgenti modificate DOVREBBE essere il comportamento predefinito. Ovviamente se si modifica un'intestazione centrale inclusa da quasi tutti i file cpp dipendenti, verrà avviata una ricostruzione quasi completa. Guarda cosa succede se modifichi solo un file cpp (aggiungendo un commento o simili), se più di quella compilation è in fase di compilazione allora ti propongo di investire più tempo per investigarlo, dandoti il ​​mio EMail per dare un'occhiata più approfondita alla configurazione .

Un'altra possibilità è che si sta compilando sotto Windows e utilizzando un cmake 2.8 che ha un bug riguardo questo. Guardate un versione 2.9 per vedere se questo difetto è via allora: http://www.mail-archive.com/[email protected]/msg24876.html

0

vorrei riscrivere il CMakeLists.txt utilizzando glob (forse spostare i file in una directory "src" se si dispone di altri file * cpp in giro) e dare un nome al progetto (questo imposta alcune variabili importanti):

cmake_minimum_required (VERSION 2.8) 
project(TRACTION) 
file (GLOB TRACTION_SOURCES *.cpp) 
find_package (OpenAL) 
find_package (OpenGL) 
find_package (SFML) 

set(CMAKE_CXX_FLAGS "-g -Wall -pg") 
add_executable (tractionedge ${TRACTION_SOURCES}) 
target_link_libraries(tractionedge ${SFML_LIBRARY} ${OPENGL_LIBRARY} ${OPENAL_LIBRARY}) 
+2

Non si dovrebbe usare 'GLOB()' dal momento che se si aggiunge un nuovo file '.cpp', CMake non lo saprà e quindi non verrà eseguito di nuovo automaticamente. In questo caso dovresti eseguire di nuovo manualmente cmake, forzando una ricostruzione completa di tutto. – Milliams

+5

Non sono d'accordo. Guardate alcuni grandi progetti con tonnellate di file src (opencv), usano GLOB ovunque, e sì, rieseguono cmake quando vengono aggiunti nuovi file (ma è qualcosa che dovete fare comunque): "cmake" è meno di un peso quindi modificare le CMakeLists e ... eseguire cmake per aggiornare i makefile !! – gaspard

+1

Milliams, ti stai sbagliando, ho appena provato a eseguire "cmake" dopo una compilazione completa (e di grandi dimensioni): questo non contrassegna tutti i file come sporchi. – gaspard

6

State rieseguire cmake ogni volta? Se modifichi solo un file sorgente, dovresti essere in grado di rieseguire semplicemente make e dovrebbe ricostruire solo il file oggetto prima del collegamento. Se si esegue nuovamente cmake, potrebbe contrassegnare tutti i file di origine sporchi e ricostruire tutto.

Rieseguire solo cmake se si modifica l'elenco effettivo dei file di origine utilizzati o altre modifiche importanti come quella.

+0

In effetti si potrebbe ancora eseguire 'make' dato che controllerà se eventuali dipendenze sono state aggiornate. – Milliams

-2

Una soluzione semplice in molti di questi casi è quello di cancellare completamente l'albero di compilazione e rigenerarlo (e mi riferisco qualcosa lungo le linee di rm -rf build && mkdir build && cd build && cmake -G "Unix Makefiles" ../src, non solo make clean)