2013-09-03 19 views
6

Mam istniejący plik cmake, który generuje bibliotekę .so. Chcę go zmodyfikować, aby następnie utworzył kopię .so o nazwie coś innego. To jest mniej więcej to, co mam:cmake niestandardowe polecenie, aby skopiować i zmienić nazwę

CMAKE_MINIMUM_REQUIRED(VERSION 2.8.7) 
PROJECT(test1) 

SET(TEST_SOURCES f1.c) 
ADD_LIBRARY(test SHARED ${TEST_SOURCES}) 
ADD_CUSTOM_COMMAND(
    OUTPUT custom1 
    COMMAND cp libtest.so custom1 
    DEPENDS libtest.so) 

Zdaję sobie sprawę, że są lepsze sposoby niż hardcoding nazwę biblioteki, ja po prostu robi to, a ja spróbować dowiedzieć się, jak zrobić to działa w ogóle. Czego mi brakuje, co spowoduje, że moje niestandardowe polecenie kopiowania/zmiany nazwy zostanie uruchomione? Uwaga: nie jest to kwestia czasu instalacji. Dzięki

Odpowiedz

6
add_custom_target(CopyAndRename 
    COMMAND ${CMAKE_COMMAND} -E copy ${CMAKE_BINARY_DIR}/test.so ${CMAKE_BINARY_DIR}/SomeThingElse.so 
) 

add_custom_target wprowadza nowy cel nazwie CopyAndRename. Można uruchomić go z:

make CopyAndRename 
11

będę trzymać się pierwotnej idei wykorzystania add_custom_command. Zalecam jednak użycie formularza add_custom_command(TARGET ...), a nie add_custom_command(OUTPUT ...).

Wersja została zaprojektowana tak, aby plik wyjściowy był używany jako plik źródłowy w innym celu CMake w tym samym CMakeLists.txt. Komenda niestandardowa jest wywoływana, gdy ten cel jest zbudowany (od razu na początku), ponieważ cel potrzebuje pliku, aby istniał w tym momencie.

W twoim przypadku żaden cel nie zależy od twojego pliku - jest produktem procesu budowania.

Jeśli używasz add_custom_command(TARGET ...), gwarantuje to, że polecenie jest wykonywane za każdym razem, gdy cel zostanie odbudowany. Korzystanie z add_custom_target wymaga zapamiętania, aby to zbudować, jeśli pierwotny cel (test w tym przypadku) zostanie zaktualizowany. Niesprawnie dodaje się do listy celów - może nie jest to problem dla małego projektu, ale może to być dla większych projektów.

Oto jak bym skonfigurować polecenie:

SET(COPY_TO_PATH custom1) 
ADD_CUSTOM_COMMAND(TARGET test POST_BUILD 
        COMMAND ${CMAKE_COMMAND} -E copy 
         $<TARGET_FILE:test> 
         ${COPY_TO_PATH} 
        COMMENT "Copying 'test' library to '${COPY_TO_PATH}'") 

to dodaje komendy w przypadku post-build test wieku. Jak słusznie zauważyłeś, trudne nazwy bibliotek nie są świetne; stąd CMake zapewnia "wyrażeń generatora" do obsługi tego. Wyrażenie generatora $<TARGET_FILE:test> rozwiązuje pełną ścieżkę biblioteki utworzonej przez test, niezależnie od platformy lub kompilatora. Zauważ, że wyrażeń generatora można używać tylko w argumencie COMMAND; nie można ich używać na przykład w części COMMENT.

Rzeczywiste polecenie wywołuje samą CMake (${CMAKE_COMMAND}) z jej numerem -E command line option. Zapewnia to wieloplatformowy sposób uzyskania kopii, ponieważ cp nie jest poleceniem systemu Windows. Aby wyświetlić wszystkie opcje -E, uruchom cmake -E help.