Pergunta

Eu tenho um projeto muito grande C com muitos arquivos C separados e cabeçalhos e muitas dezenas de contribuidores. Muitos contribuintes não têm um forte conhecimento de makefiles e dependências, o que resulta no problema não é incomum onde você quase sempre tem que "make clean" antes que você pode confiar "make" para ter produzido saída correta.

Se make levou minutos, este não seria um problema, mas é quase 2 horas em uma máquina rápida, e as pessoas estão começando a verificar no código que funciona quando eles fazem, mas eles não devem ser limpos em primeiro lugar e sua em última análise, código quebra a compilação. Não pergunte por que estes não são capturados pelo gerente de construção antes de uma nova linha de base é cortada ...

Sim, não devemos ter deixá-lo ir tão longe.

Sim, estamos educando nossos desenvolvedores.

Como de costume, não temos tempo para parar tudo e corrigi-lo com a mão.

Estou pensando há ferramentas ao longo destas linhas:

  • Existem ferramentas para ajudar a construir informações de dependência correta automatizado para um projeto existente a partir dos arquivos C e H?
  • Existem ferramentas automatizadas para descrever informações de dependência de acordo com as makefiles?
  • Existe um santo graal de uma ferramenta para descrever as diferenças entre o acima árvores dois dependência?

Mas o que mais pode / deve ser feito para resolver esse problema?

Obrigado antecipadamente ...

-Adam

Foi útil?

Solução

Pode ser mais fácil de mudar de Marca de uma ferramenta que detecta automaticamente as dependências. Por exemplo, SCons não faz de você listar dependências, mas sim automaticamente analisa os arquivos que estão sendo compilados e procura inclui . Basta especificar quais arquivos devem ser compilados e quais arquivos vão nos quais executáveis. Alternando sistemas de compilação será mais fácil para o fato de que seus desenvolvedores não estão realmente fazer os especialistas.

Outra alternativa se você ficar com fazer é usar a opção gcc -M para detectar automaticamente as dependências. A resposta à descobrir automaticamente dependências C questão tem um exemplo de como fazer com que seus makefiles descobrir automaticamente dependências de modo que você não precisa especificá-los manualmente.

Outras dicas

Temos o mesmo problema no meu trabalho. O tronco foi sempre quebrado depois de fusões ou check-ins.

Montamos um contínua integation máquina de compilação que faz um make clean em cerca de 45 minutos em comparação com cerca de 2 horas em um dev machine.The urnas servidor de integração do SVN repositório a cada 2 horas para novos check-ins e inicia um make clean.

Assim, podemos monitorar exatamente quando a construção foi quebrado e corrigi-lo imediatamente. Usamos Hudson como o nosso servidor de integração contínua, sua fonte livre e aberta, o seu trabalho uma da arte e muito fácil para configurar. Além disso, a interface do usuário é muito intuitiva, todos os outros desenvolvedores amá-lo.

Cheers,

A forma canônica de resolver isso é deixar o compilador gerar automaticamente informações de dependência para você. Algo parecido com isto (gcc assumindo, você vai querer verificar seu compilador para opções semelhantes)

SOURCES=foo.c bar.c

%.d: %.c
    $(CC) $(CFLAGS) -MM $< >$@ 

include $(SOURCES:.c=.d)

O manual do make GNU tem um capítulo sobre geração automática de pré-requisitos .

EDIT: Eu costumo recomendar as pessoas a começar a usar CMake quando têm esse tipo de problema

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