Make me parece simplesmente um script de shell com manipulação um pouco mais fácil dos argumentos da linha de comando.
Por que é padrão executar make em vez de ./make.sh
Make me parece simplesmente um script de shell com manipulação um pouco mais fácil dos argumentos da linha de comando.
Por que é padrão executar make em vez de ./make.sh
Respostas:
A idéia geral é que make
suporta (razoavelmente) reconstruções mínimas - ou seja, você diz quais partes do seu programa dependem de quais outras partes. Quando você atualiza alguma parte do programa, ele reconstrói apenas as partes que dependem disso. Embora você possa fazer isso com um script de shell, seria muito mais trabalhoso (verificar explicitamente as datas da última modificação em todos os arquivos etc.) A única alternativa óbvia com um script de shell é reconstruir tudo sempre. Para pequenos projetos, essa é uma abordagem perfeitamente razoável, mas para um grande projeto, uma reconstrução completa pode demorar uma hora ou mais - usando make
, você pode realizar a mesma coisa em um ou dois minutos ...
Eu provavelmente também devo acrescentar que existem algumas alternativas a serem feitas que têm pelo menos recursos amplamente semelhantes. Especialmente nos casos em que apenas alguns arquivos em um projeto grande estão sendo reconstruídos, alguns deles (por exemplo, Ninja ) geralmente são consideravelmente mais rápidos que o make.
Existem várias coisas que são difíceis de fazer com scripts de shell ...
Make garante que apenas os arquivos necessários sejam recompilados quando você fizer alterações nos arquivos de origem.
Por exemplo:
final : 1.o 2.o
gcc -o final 1.o 2.o
1.o : 1.c 2.h
gcc -c 1.c
2.o : 2.c 2.h
gcc -c 2.c
Se eu alterar 2.h
apenas o arquivo e executar make
, ele executará todos os 3 comandos, na ordem inversa.
Se eu alterar 1.c
apenas o arquivo e executar make
, ele executará apenas os 2 primeiros comandos na ordem inversa.
Tentar fazer isso com seu próprio script de shell envolverá muita if/else
verificação.
rsync -r -c -I $SOURCE $DEST_DIR
com casca.
Assim como acima, Make é uma linguagem de programação paralela declarativa (-ish).
Digamos que você tenha 4.000 arquivos gráficos para converter e 4 CPUs. Tente escrever um shell script de 10 linhas (estou sendo generoso aqui) que fará isso de maneira confiável enquanto satura suas CPUs.
Talvez a verdadeira questão seja por que as pessoas se preocupam em escrever scripts shell.
make manipula dependências: o makefile as descreve: o binário depende dos arquivos de objeto, cada arquivo de objeto depende de um arquivo de origem e de cabeçalhos ... quando o make é executado, a data dos arquivos é comparada para determinar o que precisa ser recompilado .
Pode-se chamar diretamente um destino para não criar tudo descrito no Makefile.
Além disso, a sintaxe make fornece substituição, vpath
Tudo isso pode ser escrito em scripts de shell, com make você já o possui.