Gerando entidades IDL usando automóveis/makefile.am
-
26-09-2019 - |
Pergunta
Para aqueles que não estão familiarizados com o IDL (Idioma da Descrição da Interface), abstraia a descrição dos dados para uso entre plataformas (Java, C, C ++, etc). Meu projeto tem dependências foo.c, foo.h, foohelper.c e foohelper.h que são geradas a partir de foo.idl. Como faço para executar um comando arbitrário quando foo.idl muda, mas ainda inclua foo.c, foohelper.c, no processo de construção?
Minhas tentativas atuais adicionam uma regra ao makefile.am - a esperança é que a regra seja copiada para o makefile gerado.
Eu tentei:
Foo.idl : Foo.idl
${the_generate_command}
e depois adicionou foo.idl a my_program_sources, mas ele não executa o The_Generate_Command ao criar.
Eu tive sucesso em gerar a partir da IDL com
Foo.c Foo.h FooHelper.h FooHelper.c : Foo.idl
${the_generate_command}
Mas não adicionará foo.c, foohelper.c ao processo de compilação, para que eles nunca sejam construídos, apenas gerados pelo The_Generate_Command!
Todo o código (incluindo o IDL) está em $ Project_dir/SRC.
Solução
A resposta do RQ está quase correta, mas perde algumas sutilezas. Experimente isso:
bin_PROGRAMS = myprogram
myprogram_SOURCES = Foo.c Foo.h FooHelper.h FooHelper.c $(OTHER_SOURCES)
BUILT_SOURCES = Foo.c Foo.h FooHelper.h FooHelper.c
EXTRA_DIST = Foo.idl
MAINTAINERCLEANFILES = Foo.c Foo.h FooHelper.h FooHelper.c
Foo.c: Foo.idl
$(THE_GENERATE_COMMAND)
Foo.h FooHelper.h FooHelper.c: Foo.c
@if test -f $@; then \
touch $@; \
else \
## Recover from the removal of $@
rm -rf $<; \
$(MAKE) $(AM_MAKEFLAGS) $<; \
fi
As regras adicionais para "gerar" Foo.h
, FooHelper.h
e FooHelper.c
a partir de Foo.c
Verifique se as construções paralelas não tentarão correr $(THE_GENERATE_COMMAND)
duas vezes. É um idioma detalhado em o manual do automóvel que funcionará para construções paralelas. Ainda há um pouco de fragilidade aqui: se o usuário remover (digamos) FooHelper.h
e FooHelper.c
e inicia uma marca paralela, pode executar o $(MAKE) $(AM_MAKEFLAGS) $<
parte de recuperação da regra várias vezes em paralelo. Como diz o manual, essa raça só pode acontecer se o usuário mutilar manualmente a árvore de construção, e mesmo assim não é nada make clean; make
não pode consertar.
o BUILT_SOURCES
A linha garante isso Foo.c
, Foo.h
, FooHelper.h
e FooHelper.c
são construídos antes de tentar construir myprogram
(Vejo esta seção do manual do automóvel para ver por que apenas adicioná -los a myprog_SOURCES
é insuficiente). o EXTRA_DIST
A variável garante que o .idl
O arquivo será capturado por make dist
(referência).
MAINTAINERCLEANFILES
Especifica arquivos adicionais para excluir ao executar make maintainer-clean
; isso é para cumprir com o Padrões GNU makefile. Veja também a descrição da variável em o manual do automóvel.