Considere o seguinte fragmento Makefile:
FORTRAN = ifort -c
PATH_MOD = mod/
FILE_MOD = mod_constant.f90 mod_rot.f mod_test.f90
SOURCE_MOD = $(FILE_MOD:%=$(PATH_MOD)%)
OBJECT_MOD = $(FILE_MOD:%.f*=%.o)
$(OBJECT_MOD): $(SOURCE_MOD)
$(FORTRAN) $(SOURCE_MOD)
clean:
rm -f *.o
Este script executa o comando ifort -c mod_constant.f90 mod_rot.f mod_test.f90
.
No entanto, eu gostaria de garantir que todos os arquivos listados em $(FILE_MOD)
[mas nenhum dos outros arquivos no diretório $(PATH_MOD)$
] fossem compilados em linhas separadas , colocando os arquivos objeto no diretório lnk
. No presente caso, o script deve executar a seguinte sequência de comandos:
ifort -c mod_constant.f90 -o lnk/mod_constant.o
ifort -c mod_rot.f -o lnk/mod_rot.o
ifort -c mod_test.f90 -o lnk/mod_test.o
Há alguma maneira de fazer isso?
Esta regra ...
Diz que cada alvo na lista para o qual
$(OBJECT_MOD)
expande tem como pré-requisitos todos os arquivos da lista para o qual$(SOURCE_MOD)
expande, e deve ser construído pelo comando para o qual$(FORTRAN) $(SOURCE_MOD)
expande. Não é isso que você quer.Como você já parece comprometido com a versão do GNU
make
, a maneira natural de fazer isso é escrever uma regra padrão. Ou dois, na verdade, porque você tem dois padrões de nomes de fontes distintos. Se você quiser que os arquivos objeto entrem em um diretório diferente de suas fontes correspondentes, isso também será tratado nessas regras. Por exemplo,O
%
pode ser interpretado como um curinga, com a ressalva de que a aparência no destino da regra e aquelas em sua lista de pré-requisitos devem ser expandidas para a mesma sequência.The
$<
é uma variável automática que se expande para o primeiro elemento real da lista de pré-requisitos da regra, sujeita à expansão do%
. O$@
se expande para o destino real que está sendo construído.Além disso, observe bem que essas regras dizem como construir os arquivos desejados, mas você ainda precisa dizer de alguma forma
make
que eles precisam ser construídos. Isso normalmente seria tornando-os pré-requisitos de alguma regra, embora você pudesse confiar na solicitação explícita de um ou mais deles, namake
linha de comando.