gnu make, vpath, diretório de arquivos extra o, confusão

2

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?

    
por user1407220 23.09.2016 / 09:46

1 resposta

2

Resolvido

os exemplos funcionam quando se muda a linha

    $(ARCH) $(ARCHFLAGS) $@ $?

para

    $(ARCH) $(ARCHFLAGS) $@ $(addprefix NoOMP/,$?)

Acima, descartei essa solução, mas meu teste foi baseado em $^ em vez de $? . Enquanto o primeiro irá reconstruir todo o arquivo dos arquivos% .o antigos e novos, o último só atualizará o arquivo existente com os novos arquivos% .o. Ao reconstruir todo o arquivo dos arquivos% .o antigos e antigos, os arquivos% .o antigos terão o prefixo errado, novo o direito. Assim, excluir arquivos% .o antigos atualizando o arquivo com arquivos% .o recém-compilados contorna esse problema.

Felicidades

    
por 23.09.2016 / 11:03