Próbuję stworzyć prosty projekt na CLion. Używa CMake (jestem tutaj nowy) do generowania plików Makefile do budowania projektu (lub czegoś w tym rodzaju)
Wszystko, czego potrzebuję, to przenieść jakiś plik niebędący projektem (jakiś rodzaj pliku zasobów) do katalogu binarnego za każdym razem, gdy uruchamiam mój kod.
Ten plik zawiera dane testowe i aplikacja otwiera go, aby je odczytać. Próbowałem to zrobić na kilka sposobów:
Przez
file(COPY ...
file(COPY ${CMAKE_CURRENT_SOURCE_DIR}/input.txt DESTINATION ${CMAKE_CURRENT_BINARY_DIR}/input.txt
Wygląda dobrze, ale działa tylko raz i nie kopiuje ponownie pliku po następnym uruchomieniu.
Przez
add_custom_command
OUTPUT
wersjaadd_custom_command( OUTPUT ${CMAKE_CURRENT_BINARY_DIR}/input.txt COMMAND ${CMAKE_COMMAND} -E copy ${CMAKE_CURRENT_SOURCE_DIR}/input.txt ${CMAKE_CURRENT_BINARY_DIR}/input.txt)
TARGET
wersjaadd_custom_target(foo) add_custom_command( TARGET foo COMMAND ${CMAKE_COMMAND} copy ${CMAKE_CURRENT_BINARY_DIR}/test/input.txt ${CMAKE_SOURCE_DIR})
Ale nikt z tego nie działa.
Co ja robię źle?
configure_file
nie będzie działać z podkatalogami, nawet jeśli używasz GLOB do tworzenia listy plików.obie opcje są prawidłowe i dotyczą dwóch różnych etapów kompilacji:
file(COPY ...
kopiuje plik w kroku konfiguracji i tylko w tym kroku. Kiedy odbudujesz swój projekt bez zmiany konfiguracji cmake, to polecenie nie zostanie wykonane.add_custom_command
jest preferowanym wyborem, gdy chcesz kopiować plik na każdym kroku kompilacji.Odpowiednia wersja do Twojego zadania to:
można wybierać pomiędzy
PRE_BUILD
,PRE_LINK
,POST_BUILD
najlepiej jest zapoznać się z dokumentacją add_custom_commandprzykład użycia pierwszej wersji można znaleźć tutaj: Użyj CMake add_custom_command, aby wygenerować źródło dla innego celu
źródło
CMAKE_CURRENT_SOURCE_DIR
jeślitest/input.txt
plik jest względny w stosunku do bieżącegoCMakeLists.txt
pliku. Jeśli jest względny w stosunku do katalogu głównegoCMakeLists.txt
, użyjCMAKE_SOURCE_DIR
.libSomething.so
?Pierwsza wypróbowana opcja nie działa z dwóch powodów.
Po pierwsze, zapomniałeś zamknąć nawias.
Po drugie,
DESTINATION
powinien to być katalog, a nie nazwa pliku. Zakładając, że zamknąłeś nawias, plik trafiłby do folderu o nazwieinput.txt
.Aby to działało, po prostu zmień to na
źródło
Sugerowałbym,
TARGET_FILE_DIR
jeśli chcesz, aby plik został skopiowany do tego samego folderu, co plik .exe.W VS ten skrypt cmake skopiuje input.txt do tego samego pliku, co końcowy plik exe, bez względu na to, czy jest debugowany, czy wydany.
źródło
To jest to, czego użyłem do skopiowania niektórych plików zasobów: pliki kopii są pustym celem do ignorowania błędów
źródło
add_dependencies(MainTarget copy-files)
aby uruchamiał się automatycznie, gdy buduję MainTargetadd_dependencies(MainTarget copy-files)
głównegoCMakeLists.txt
oznacza, że można go używać w całym projekcie.jeśli chcesz skopiować folder z katalogu porzeczki do folderu binarnego (folder kompilacji)
to syntexe to:
źródło
Sugerowany plik configure_file jest prawdopodobnie najłatwiejszym rozwiązaniem. Jednak polecenie kopiowania nie zostanie ponownie uruchomione, jeśli ręcznie usuniesz plik z katalogu kompilacji. Aby obsłużyć również ten przypadek, działa dla mnie następujące rozwiązanie:
źródło