Por que 'make' reclama de uma regra ausente quando tento criar um programa a partir do código-fonte?

2

Eu sou um novato em Linux e estou tentando compilar um software científico chamado DL_POLY_Classic . Eu baixei o arquivo zip dl_class_1.6.tar.gz e o descompactei usando o comando tar xvzf dl_class_1.6.tar.gz . Dá-me uma série de pastas contendo vários arquivos para a operação do programa, que são descritos no programa manual . Um desses diretórios, chamado source , contém muitos arquivos .f , entre outras coisas. O manual diz que para compilar o código, é necessário usar um dos Makefiles de exemplo / modelo e modificar os caminhos nele para direcionar o programa make para o diretório apropriado que contém o compilador. (Este programa DL_POLY_Classic está escrito, e deve ser compilado com Fortran [Fortran 90, eu acredito].)

Com base na recomendação de um colega, estou tentando compilar esse código usando um compilador Intel Fortran (ifort) que temos em nosso cluster. Eu modifiquei um dos alvos no modelo Makefile; este alvo agora tem o seguinte texto no Makefile:

#========== mpich-c2
mpich-c2: dpp
    cp /opt/mpich/ch-p4/include/mpif.h mpif.h
    $(MAKE) LD="/opt/mpich_intel/ch-p4/bin/mpif90 -O3 -o" \
    LDFLAGS="-L/opt/mpich_intel/ch-p4/lib64 -lmpich" \
    TIMER="" \
    FC=/opt/intel_fc_80/bin/ifort \
    FFLAGS="-c " \
    MPICH_F90="/opt/mpich_intel/ch-p4/bin/mpif90" \
    CPFLAGS="-D$(STRESS) -DMPI -P -D'pointer=integer'\
    -I/opt/mpich_intel/ch-p4/include" \
    EX=$(EX) BINROOT=$(BINROOT) $(TYPE)

Eu coloco o Makefile no diretório source , como o manual direciona. Então, enquanto no diretório source , eu digito o comando:

make mpich-c2

No entanto, recebo a seguinte mensagem de erro:

cp /opt/mpich/ch-p4/include/mpif.h mpif.h
make LD="/opt/mpich_intel/ch-p4/bin/mpif90 -O3 -o" \
        LDFLAGS="-L/opt/mpich_intel/ch-p4/lib64 -lmpich" \
        TIMER="" \
        FC=/opt/intel_fc_80/bin/ifort \
        FFLAGS="-c " \
        MPICH_F90="/opt/mpich_intel/ch-p4/bin/mpif90" \
        CPFLAGS="-DSTRESS -DMPI -P -D'pointer=integer'\
        -I/opt/mpich_intel/ch-p4/include" \
        EX=D.X BINROOT=./ 3pt
make[1]: Entering directory '/export/home/myusername/dlc1_16/dl_class_1.6/source'
make[1]: *** No rule to make target 'dl_params.inc', needed by 'angfrc.o'.  Stop.
make[1]: Leaving directory '/export/home/myusername/dlc1_16/dl_class_1.6/source'
make: *** [mpich-c2] Error 2

Então, o programa make está me dizendo que existe No rule to make target dl_params.inc, needed by angfrc.o.

Minha pergunta é: o que o software está me dizendo? É provável que ele não consiga encontrar um arquivo dl_params.inc , ou é provável que esteja dizendo que não pode encontrar um arquivo angfrc.o ? Ou está dizendo que eu deveria ter algum tipo de comando no meu Makefile para criar um arquivo chamado dl_params.inc ?

Quando eu pesquiso no meu Makefile (que, como mencionei, é essencialmente o modelo fornecido pelos autores, mas apenas com os diretórios nas entradas mpich-c2 target modificadas para o compilador Fortran específico ao qual tenho acesso) , Vejo apenas estas menções de dl_params.inc :

# Declare dependency on parameters file

$(OBJ_ALL): dl_params.inc
$(OBJ_RRR): dl_params.inc
$(OBJ_4PT): dl_params.inc
$(OBJ_RSQ): dl_params.inc
$(OBJ_NEU): dl_params.inc
$(OBJ_RIG): dl_params.inc
$(OBJ_EXT): dl_params.inc
$(OBJ_SPME): dl_params.inc
$(OBJ_HKE): dl_params.inc

Não tenho certeza do que isso significa.

Por outro lado, quando eu pesquiso no meu Makefile para angfrc.o , vejo apenas uma menção, na primeira linha do seguinte (após OBJ_ALL ):

# Define object files

#=====================================================================

OBJ_ALL = angfrc.o bndfrc.o cfgscan.o corshl.o coul0.o coul4.o \
    coul2.o coul3.o conscan.o dblstr.o dcell.o diffsn0.o \
    diffsn1.o dlpoly.o duni.o error.o ewald1.o ewald3.o \
    exclude.o exclude_atom.o fldscan.o exclude_link.o forces.o\
    exitcomms.o extnfld.o fbpfrc.o fcap.o freeze.o gauss.o \
    gdsum.o getrec.o gimax.o gisum.o gstate.o images.o initcomms.o \
    intlist.o intstr.o invert.o invfrc.o jacobi.o lowcase.o lrcmetal.o \
    lrcorrect.o machine.o merge.o merge1.o merge4.o \
    npt_b1.o npt_b3.o parset.o npt_h1.o npt_h3.o nve_1.o \
    nvt_b1.o nvt_e1.o nvt_h1.o parlst_nsq.o parlink.o parlst.o passcon.o \
    passpmf.o pmf_1.o pmf_shake.o primlst.o quench.o rdf0.o rdf1.o \
    rdshake_1.o result.o revive.o scdens.o shellsort.o shlfrc.o \
    shlmerge.o shlqnch.o shmove.o simdef.o splice.o static.o strip.o \
    strucopt.o sysdef.o sysgen.o systemp.o sysbook.o sysinit.o \
    tethfrc.o thbfrc.o timchk.o traject.o vertest.o vscaleg.o \
    warning.o xscale.o zden0.o zden1.o \

Eu não tenho certeza do que isso significa também.

Curiosamente, quando eu uso o comando find para pesquisar por nome - por exemplo, find -name angfrc.o , find -name *.o e find -name dl_params.inc - não consigo encontrar nada em nenhum lugar nos diretórios do programa com esses nomes. Quando tento find -name *.inc , descubro que existe um arquivo comms.inc no diretório source . Este arquivo em particular diz em seu cabeçalho que é o "arquivo de inclusão dl_poly para MPI, PVM e SHMEM". É um arquivo relativamente curto (com apenas 42 linhas de comprimento), e parece que ele contém tanto "parâmetros para tags de mensagem" quanto "tags de MPI" - embora, eu não tenha a menor idéia do que eu deveria estar procurando lá dentro.

Se você tiver tempo, por favor me dê conselhos sobre o que devo tentar em seguida? Não tenho tanta certeza do que a mensagem de erro No rule to make target dl_params.inc, needed by angfrc.o. está me dizendo; você tem alguma ideia? Muito obrigado pelo seu tempo.

    
por Andrew 10.08.2011 / 23:29

1 resposta

6

A mensagem de erro No rule to make target dl_params.inc, needed by angfrc.o. significa que o Makefile especifica o arquivo dl_params.inc como uma dependência para a construção do arquivo angfrc.o . Então você tem que encontrar ou criar o arquivo dl_params.inc .

A pesquisa na documentação indica que esse arquivo deve conter os parâmetros FORTRAN exigidos por DL_POLY. O manual do usuário na seção 7.1.1 explica que deve haver uma subpasta utility contendo o programa PARSET , que pode ser usado para gerar esse arquivo de parâmetro (chamado new_params.inc por padrão). Você provavelmente só precisa renomear o arquivo new_params.inc para dl_params.inc e colocá-lo na pasta-fonte principal.

Se o erro persistir, o Makefile obviamente espera que o arquivo dl_params.inc esteja em outro lugar e você teria que dar uma olhada mais de perto no Makefile.

    
por 11.08.2011 / 00:18