Mam duże pliki danych, które muszą być skopiowane z folderów źródłowych, aby budować foldery podczas naszej budowy Qmake/QtCreator. Ponieważ są one duże, chcę tylko, aby kopia była dostępna dla nowych/zmienionych plików. Naprawdę chciałbym uniknąć umieszczenia ich wszystkich w pliku projektu. Oto, co próbowałem:Jak zmusić QMake do kopiowania dużych plików danych tylko wtedy, gdy są one aktualizowane
Ta próba kopiowania plików danych kończy się niepowodzeniem, ponieważ celem jest folder DemoData. Dlatego kopia nie zostanie wykonana, jeśli pliki w folderze zostaną dodane lub zmienione. Tylko jeśli folder nie istnieje.
DemoData.commands = $$COPY_CMD $${SRC_DATA_DIR}DemoData $${BLD_DATA_DIR}DemoData
DemoData.target += $${BLD_DATA_DIR}DemoData
PRE_TARGETDEPS += $${BLD_DATA_DIR}DemoData
QMAKE_EXTRA_TARGETS += DemoData
To podejście kończy się niepowodzeniem, ponieważ element DemoData.target nie powinien zawierać listy wielu elementów. QMake umieszcza listę w cudzysłowach w wygenerowanym pliku Makefile, dzięki czemu staje się jednym celem.
DemoData.commands = $$COPY_CMD $${SRC_DATA_DIR}DemoData $${BLD_DATA_DIR}DemoData
DEMO_DATA_FILES = $$files($${SRC_DATA_DIR}DemoData/*)
for(FILE, DEMO_DATA_FILES){
DemoData.target += $${BLD_DATA_DIR}DemoData\\$$basename(FILE)
PRE_TARGETDEPS += $${BLD_DATA_DIR}DemoData\\$$basename(FILE)
}
QMAKE_EXTRA_TARGETS += DemoData
Ta próba kończy się niepowodzeniem, ponieważ (AFAICT) QMake nie obsługuje nazw zmiennych zawartych w innych zmiennych. Wydaje się, że jest to więcej niż jeden poziom podstawienia. Plik Makefile jest generowany, ale wszystkie cele DemoDataX nie mają żadnych wierszy poleceń. Wszystkie próby wyświetlenia zawartości pola "poleceń" generują błędy składni.
DEMO_DATA_FILES = $$files($${SRC_DATA_DIR}DemoData/*)
DEMO_DATA_NAME = DemoData
for(FILE, DEMO_DATA_FILES){
$${DEMO_DATA_NAME}.target = $${FILE}
$${DEMO_DATA_NAME}.commands = $$COPY_CMD $${FILE} $${BLD_DATA_DIR}DemoData
PRE_TARGETDEPS += $${FILE}
QMAKE_EXTRA_TARGETS += $${DEMO_DATA_NAME}
DEMO_DATA_NAME = $${DEMO_DATA_NAME}X
}
To podejście działa, ale z dwoma niedociągnięciami. Mniejsza jest to, że należy wykonać oddzielny krok "make install". Najważniejsze jest to, że pliki są zawsze kopiowane bezwarunkowo. Ponieważ nasze pliki danych są duże, jest to niedopuszczalne czas.
DemoData.path = $${BLD_DATA_DIR}DemoData
DemoData.files = $${SRC_DATA_DIR}DemoData/*
INSTALLS += DemoData
Czy istnieje sposób, aby to zrobić, czy pozostawiłem jakiś zewnętrzny skrypt lub ręcznie wygenerowany/utrzymany plik Makefile?
Wygląda na dobrą opcję. Nie będzie miał okazji spróbować tego przez jakiś czas. –