Estou tentando construir duas bibliotecas diferentes a partir do código-fonte fortran, uma com suporte a OMP e a outra sem. Portanto, arquivos% .o da mesma fonte diferem dependendo dos sinalizadores do compilador. Ao alterar / recompilar um arquivo de origem, o ar ainda precisa de todos os arquivos o para reconstruir a biblioteca. Para evitar a recompilação de todos os arquivos de origem, quero armazenar os arquivos o de arquivos de origem não alterados em dois diretórios diferentes, um com o-files, incluindo o suporte omp, o outro com o out. Fico feliz em ter makefiles para isso nesse diretório onde as bibliotecas estão finalmente localizadas.
No entanto, não consigo reconstruir a biblioteca em um único comando devido ao comportamento da variável vpath. Aqui está o arquivo make:
SRC :=
FORTRAN = ifort
OPTSSEQ = -mkl=sequential -DThreadUnSafe -warn nounused -warn declarations -O3 -DTIMEDETAIL
DRVOPTS = $(OPTS)
NOOPT =
LOADER = ifort
LOADOPTS =
kernel=$(shell uname -r)
ARCH = ar
ARCHFLAGS= cr
RANLIB = ranlib
LibName=Lib_LM_$(FORTRAN)_$(kernel)_1.0.a
.SUFFIXES:
.SUFFIXES: .f90 .o
include Moduls.mk
vpath %.f90 src/
vpath %.o NoOMP/
OBJS = $(patsubst %.f90,%.o,$(SRC))
$(LibName): $(OBJS)
$(ARCH) $(ARCHFLAGS) $@ $?
$(RANLIB) $@
%.o : %.f90
$(FORTRAN) $(OPTSSEQ) -c $? -o $(addprefix NoOMP/,$@)
clean:
-rm *.mod
-rm NoOMP/*.o
-rm *.smod
-rm $(LibName)
Isso resulta na construção bem-sucedida de todos os arquivos% .o depois de "make clean", já que todos os arquivos% .f90 são lidos de src / e todos os arquivos% .o são gravados em NoOMP /. No entanto, a criação do archive falha porque o prefixo "NoOMP" nos arquivos% .o é descartado. Assim, ar reclama que não pode encontrar os arquivos%. Apenas se eu executar "make" novamente, o arquivo será construído porque, em seguida, os arquivos% .o terão o prefixo NoOMP. Adicionar um comando prefixo à linha de construção do arquivo funciona bem se for construído do zero. No entanto, se apenas um único arquivo foi alterado, os arquivos inalterados terão um prefixo "NoOMP / NoOMP /", resultando em uma interrupção novamente.
Embora isso seja terrivelmente chato, até onde eu entendi o manual é o comportamento padrão do GNU make. Se estou errado, como posso reparar o makefile, se estou certo como posso contornar este problema?