2011-01-06 6 views
4

Ich habe vor kurzem Prüfungen durch CMake zu einem meiner Projekte hinzugefügt. Ich habe dies getan, indem ich eine andere ausführbare Datei erstellt habe, die meine Testfälle ausführt. Die Testfälle in meinem Projekt verwenden den Code aus meiner Hauptanwendung. Jedes Mal, wenn ich eine Quelldatei ändere, die zwischen der Hauptanwendung und dem Test-Runner freigegeben ist, kompiliert sie dieses Objekt zweimal neu. Einmal für die Hauptanwendung und ein zweites Mal für den Testläufer.Neucompilierung häufiger Objektdateien mit CMake vermeiden?

Gibt es eine Möglichkeit, die gleichen Objektdateien für beide zu teilen?

Meine CMakeLists Datei sieht in etwa so aus.

AUX_SOURCE_DIRECTORY(${SRC_DIR}/game game_SRC) 
AUX_SOURCE_DIRECTORY(${SRC_DIR}/framework/ framework_SRC) 

ADD_EXECUTABLE(${CMAKE_PROJECT_NAME} 
       ${game_SRC} ${framework_SRC}) 

# --- Testing --- 
ENABLE_TESTING() 
AUX_SOURCE_DIRECTORY(${TEST_DIR} test_SRC) 

ADD_EXECUTABLE(${TEST_RUNNER_NAME} 
       ${test_SRC} 
       ${framework_SRC} 
) 

Antwort

13

Ja, indem Sie Ihr Framework zu einer separaten Bibliothek machen. Wie es jetzt ist, geben Sie framework_SRCS als Quellen für Ihre ausführbare Projektdatei an, und Sie geben dann dieselben Quellen für die test-runner-ausführbare Datei an. Und CMake erstellt einfach beide ausführbaren Dateien aus den angegebenen Quellen.

Noch schlimmer, CMake kann nicht leicht davon ausgehen, dass die gleiche Quelldatei für beide ausführbare Dateien identisch verwendet wird. Was ist, wenn Sie zwischen Ihrem Test und Ihrer App ein paar verschiedene Kompilierungsflags haben?

Der einfachste Ansatz ist, dass Sie framework_SRCS in eine Bibliothek zu verknüpfen und dann einen Link Abhängigkeit angeben.

ADD_LIBRARY(MyFramework STATIC ${framework_SRCS}) 

ADD_EXECUTABLE(${CMAKE_PROJECT_NAME} 
       ${game_SRC}) 
TARGET_LINK_LIBRARIES(${CMAKE_PROJECT_NAME} MyFramework) 

# --- Testing --- 
ENABLE_TESTING() 
AUX_SOURCE_DIRECTORY(${TEST_DIR} test_SRC) 

ADD_EXECUTABLE(${TEST_RUNNER_NAME} 
       ${test_SRC} 

TARGET_LINK_LIBRARIES(${TEST_RUNNER_NAME} MyFramework) 

(Beachten Sie, dass ich explizit die Bibliothek statisch bauen wählte Natürlich könnten Sie sich entscheiden, es zu verlassen bis zu cmake oder Erzwingen eines gemeinsamen Build)

Grüße, André