Pergunta
Percebi que minha pergunta anterior estava um pouco confusa sobre as regras e dependências. O arquivo .Pro seguinte gera um makefile que funciona corretamente se os arquivos de origem no diretório 'gerados' existirem no momento em que o QMake é executado.
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
Mas quando o QMake é executado, ele só gera um makefile e pre_targetDeps & qmake_extra_unix_targets não me ajudam. Como posso obter o QMake para gerar um makefile que adicionará o conteúdo de fontes geradas/ às fontes?
Solução
Pode ser necessário fazer isso em dois passes.
No seu arquivo QMake, adicione a seguinte linha:
include( generated/generated.pri )
Então, no final do seu script code_generator, adicione as fontes ao arquivo gerado.pri (usando o Bash para o exemplo, mas a ideia é a mesma para quase todos os idiomas):
rm generated/generated.pri
for file in $( ls generated/*.cpp ); do
echo "SOURCES += ${file}" >> generated/generated.pri
done
A primeira vez que você executa o arquivo QMake, gerado/gerado.PRI, presumivelmente estará vazio. Quando você é executado, ele preencherá o arquivo gerado.pri. Na segunda vez, ele recriará o arquivo Make (como um arquivo .PRI de origem alterado) e depois compilará novamente. Você poderá mexer com outros comandos que fariam o segundo estágio para você.
Outras dicas
Eu tive o mesmo problema agora, mas para uma USECASE mais simples de apenas um único arquivo gerado. Para isso, encontrei uma maneira muito mais simples de conseguir isso usando o gerado_sources em vez de fontes:
dummyfile.target = dummy.cpp dummyfile.commands = touch $$dummyfile.target QMAKE_EXTRA_TARGETS += dummyfile GENERATED_SOURCES += $$dummyfile.target
Provavelmente, alguém poderia empurrar isso em um loop QMake e gerar os alvos adequados para vários arquivos também.
Eu cheguei a uma solução que acredito ser robusta e geral, que depende qmake
gerando um gNU makefile.
Diga que temos tudo extra SOURCES
e HEADERS
tarefas em um arquivo nomeado Makefile.pri
, que é gerado executando o script generate_Makefile.pri.sh
que também gera as fontes e/ou cabeçalhos mencionados em Makefile.pri
.
Queremos esse arquivo gerado automaticamente e confiável pelo próprio sistema de construção, para ser incluído no .pro
arquivo, para que qmake
pode levar em consideração seu conteúdo e gerar o makefile com as dependências adequadas.
Isso é então o que temos que colocar em nosso .pro
Arquivo.
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
Deste jeito:
- Se não houver
Makefile.pri
, então é criado; - Se
Makefile.pri
é criado ou atualizado, entãoqmake
corre novamente e leva em consideração seu conteúdo, regenerando oMakefile
Como dito, este faz depender qmake
Gerando um GNU Makefile, mas a mesma abordagem que acredito poder ser adaptada para funcionar também com outros sistemas de construção de destino.