2010-01-05 18 views
8

Zrozumiałem, że moje wcześniejsze pytanie było nieco zdezorientowane zasadami i zależnościami. Poniższy plik .pro generuje plik Makefile, który działa poprawnie, JEŻELI pliki źródłowe w katalogu 'generated' istnieją w czasie uruchamiania qmake.Zasady qmake dla wygenerowanego kodu

idl.target = generated/qmtest.h 
idl.commands = code_generator 
idl.config = no_link 
idl.depends = $$SOURCES $$HEADERS $$FORMS 

TEMPLATE  = app 
INCLUDEPATH += generated 
SOURCES  += generated/*.cpp 
PRE_TARGETDEPS += generated/qmtest.h 
QMAKE_EXTRA_UNIX_TARGETS += idl 

Ale kiedy QMake biegnie, jego tylko generowanie makefile i PRE_TARGETDEPS & QMAKE_EXTRA_UNIX_TARGETS mi nie pomoże. Jak mogę uzyskać polecenie qmake, aby wygenerować plik Makefile, który doda zawartość wygenerowanych/do SOURCES?

Odpowiedz

5

Być może będziesz musiał to zrobić w dwóch przejściach.

W pliku QMake, dodać następujący wiersz:

include(generated/generated.pri) 

Następnie na końcu skryptu code_generator, dodać źródła do pliku generated.pri (za pomocą bash na przykład, ale idea jest taka sama dla prawie wszystkich językach):

rm generated/generated.pri 
for file in $(ls generated/*.cpp); do 
    echo "SOURCES += ${file}" >> generated/generated.pri 
done 

Przy pierwszym uruchomieniu pliku QMake, generowany/generated.pri będzie prawdopodobnie pusta. Po uruchomieniu make zapełni plik generated.pri. Za drugim razem ponownie utworzy plik make (jako plik źródłowy .pri zmieniony), a następnie skompiluje ponownie. Możesz być w stanie bawić się z innymi komendami, które będą dla ciebie drugim etapem.

+0

Dzięki - skończyłem zmuszając generator do uruchomienia podczas qmake za pomocą systemu ($$ idl.commands). Plik makefile, który generuje, jest poprawny i ponieważ dodałem dane wyjściowe do celu, nic tak naprawdę nie zaszkodzi. – swarfrat

4

Miałem ten sam problem właśnie teraz, ale dla prostszego zastosowania pojedynczego wygenerowanego pliku. Za to znalazłem znacznie prostszy sposób, aby osiągnąć to za pomocą GENERATED_SOURCES zamiast Źródła:

 
dummyfile.target = dummy.cpp 
dummyfile.commands = touch $$dummyfile.target 
QMAKE_EXTRA_TARGETS += dummyfile 
GENERATED_SOURCES += $$dummyfile.target 

Prawdopodobnie można wcisnąć, że do pętli QMake i generować odpowiednie cele dla wielu plików, jak również.

+0

+ PRE_TARGET_DEPENDS + = dummyfile – arved

0

Wymyśliłem rozwiązanie, które uważam za solidne i ogólne, polegające na wygenerowaniu pliku Make Make GNU (qmake).

Say mamy wszystkie dodatkowe SOURCES i HEADERS zadania w pliku o nazwie Makefile.pri, który pobiera generowane przez wykonanie skryptu generate_Makefile.pri.sh który także generuje źródła i/lub nagłówków wymienionych w Makefile.pri.

Chcemy, aby ten plik był automatycznie i niezawodnie generowany przez sam system kompilacji, więc należy go dołączyć do pliku , aby qmake mógł wziąć pod uwagę jego zawartość i wygenerować plik Makefile z odpowiednimi zależnościami.

To jest to, co musimy umieścić w naszym pliku .pro.

Makefile_pri.target = Makefile.pri 
Makefile_pri.commands = generate_Makefile.pri.sh 
Makefile_pri.depends = FORCE 

Makefile.target = $$MAKEFILE 
Makefile.depends = Makefile_pri 

include($$Makefile_pri.target) 

QMAKE_EXTRA_TARGETS = Makefile Makefile_pri 

ten sposób:

  1. jeśli nie ma Makefile.pri, to zostanie utworzony;
  2. Jeśli Makefile.pri zostanie utworzony lub zaktualizowany, a następnie qmake biegnie ponownie i bierze pod uwagę jej treść, regenerując Makefile

Jak powiedział, to ma zależą qmake generującego GNU Makefile, ale samo podejście I sądzić, że można go przystosować do pracy również z innymi docelowymi systemami kompilacji.

Powiązane problemy