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
.