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.

Foi útil?

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.

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