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?

Foi útil?

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:

  1. Se não houver Makefile.pri, então é criado;
  2. Se Makefile.pri é criado ou atualizado, então qmake corre novamente e leva em consideração seu conteúdo, regenerando o Makefile

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.

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top