IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Linux Discussion :

problème Makefile pour projet fortran


Sujet :

Linux

  1. #1
    Membre à l'essai
    Profil pro
    Inscrit en
    Novembre 2011
    Messages
    15
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2011
    Messages : 15
    Points : 11
    Points
    11
    Par défaut problème Makefile pour projet fortran
    Salut,
    Je voudrais me faire un makefile pour mes programmes écrits en fortran 90. voici ce que j'ai écrit pour l'instant :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
     
    EXEC    = beem_ml.exe
    LIB     = libbeem.a
     
    FC      = ifort
    FFLAGS  = -real-size 128 -u
     
    SRC     = $(wildcard *.f90)
    SRC_77  = $(wildcard *.f)
    SRC_MOD = $(wildcard mod_*.f90)
     
    OBJS    = $(SRC:.f90=.o)
    OBJS_77 = $(SRC_77:.f=.o)
    OBJS_MOD = $(SRC_MOD:.f90=.o)
     
     
    all: $(EXEC)
     
     
    $(OBJS_MOD): $(SRC_MOD)
              $(FC) $(FFLAGS) -c $^
              touch $*.o
     
    $(OBJS_77) : $(SRC_77)
              $(FC) $(FFLAGS) -c $^
     
    $(OBJS)    : $(SRC) $(OBJS_MOD)
              $(FC) $(FFLAGS) -c $^
     
    $(LIB)     : $(OBJS) $(OBJS_77) $(OBJS_MOD)
              ar -rv $(LIB) $^
     
    $(EXEC)    : $(OBJ) $(LIB)
              $(FC) -o $@ $^
     
     
    # cleaning repertory. 
    # make new remove all *.dat. 
    # Needed to run a new calculation, in order to avoid erasing data
     
    .PHONY    : clean mrproper new
    new         :
               rm -f *.log *.dat
     
    clean       :
              rm -f *.o *.mod
     
    mrproper : clean new
              rm -f $(EXEC) $(LIB)
    En résumé voilà ce que je veux :
    - compiler les modules. Ils sont de la forme mod_toto.f90
    - compiler les subroutines f77 (écrites par qqun d'autre), qui sont de la forme *.f
    - compiler les subroutines f90, qui sont de la forme *.f90 et qui dépendent du module et des subroutines f77
    - archiver le tout dans une librairie
    - compiler le programme principal qui dépend de la librairie (et donc de tout ce petit monde)

    Voilà mon problème : les modules qui sont de la forme mod_*.f90 sont également de la forme *.f90, il y a donc une dépendance circulaire. comment faire pour obtenir un makefile générique?

    Merci !

  2. #2
    Membre à l'essai
    Profil pro
    Inscrit en
    Novembre 2011
    Messages
    15
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2011
    Messages : 15
    Points : 11
    Points
    11
    Par défaut
    finalement, j'ai simplifié en mettant les modules dans un dossier module. Maintenant mon soucis, c'est que si je compile mon module de cette façon :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
    $(OBJS_MOD): $(SRC_MOD)
    	          $(FC) $(FFLAGS) -c $^
    	          touch $*.o
    les autres routines ne trouvent pas le module

  3. #3
    Membre à l'essai
    Profil pro
    Inscrit en
    Novembre 2011
    Messages
    15
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2011
    Messages : 15
    Points : 11
    Points
    11
    Par défaut
    suite des hostilités :
    pour que les routines trouvent le module, j'ai rajouté l'option -module dir dans ma commande ifort. Le nouveau problème, c'est que cette commande :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
    $(OBJS)    : $(SRC) $(OBJS_MOD)
    				 $(FC) $(FFLAGS) -c -module $(PATH_MOD) $<
    ne fait pas ce que je pensais qu'elle ferait : je pensais qu'elle allait compiler chaque variable contenu dans src en .o, dans le même répertoire que la source. mais au lieu de ça, il me compile plein de fois la toute première source :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
    ifort -real-size 128 -u -c -module modules beem.f90
    ifort -real-size 128 -u -c -module modules beem.f90
    ifort -real-size 128 -u -c -module modules beem.f90
    ...

  4. #4
    Membre à l'essai
    Profil pro
    Inscrit en
    Novembre 2011
    Messages
    15
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2011
    Messages : 15
    Points : 11
    Points
    11
    Par défaut
    j'ai résolu mon pb. Voici un makefile qui fonctionne, si jamais quelqu'un en a besoin un jour :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    86
    87
    88
    89
    90
    91
    92
    93
    94
     
     
    # name of the executable and its library
    EXEC    = beem_ml.exe
    LIB     = libbeem.a
     
    # compiler parameters
    FC      = ifort
    FFLAGS  = -real-size 128 -u
     
    # subroutines' directories
    DIR_MULTI = multi_layers
    DIR_REST  = restsub
    DIR_HAM   = hamilton
    DIR_SURF  = surfham
    DIR_GREEN = green
    DIR_MOD   = modules
    DIR_77    = hamilton/fortran77
    DIR_OBJ   = objects
     
    SRC_MAIN  = $(wildcard *.f90)
    SRC_MULTI = $(wildcard $(DIR_MULTI)/*.f90)
    SRC_REST  = $(wildcard $(DIR_REST)/*.f90)
    SRC_HAM   = $(wildcard $(DIR_HAM)/*.f90)
    SRC_SURF  = $(wildcard $(DIR_SURF)/*.f90)
    SRC_GREEN = $(wildcard $(DIR_GREEN)/*.f90)
    SRC_77    = $(wildcard $(DIR_77)/*.f)
    SRC_MOD   = $(wildcard $(DIR_MOD)/*.f90)
     
    OBJ_MULTI = $(patsubst $(DIR_MULTI)/%.f90,$(DIR_OBJ)/%.o,$(SRC_MULTI))
    OBJ_REST  = $(patsubst $(DIR_REST)/%.f90,$(DIR_OBJ)/%.o,$(SRC_REST))
    OBJ_HAM   = $(patsubst $(DIR_HAM)/%.f90,$(DIR_OBJ)/%.o,$(SRC_HAM))
    OBJ_SURF  = $(patsubst $(DIR_SURF)/%.f90,$(DIR_OBJ)/%.o,$(SRC_SURF))
    OBJ_GREEN = $(patsubst $(DIR_GREEN)/%.f90,$(DIR_OBJ)/%.o,$(SRC_GREEN))
    OBJ_MOD   = $(patsubst $(DIR_MOD)/%.f90,$(DIR_OBJ)/%.o,$(SRC_MOD))
    OBJ_77    = $(patsubst $(DIR_77)/%.f,$(DIR_OBJ)/%.o,$(SRC_77))
     
     
    ALL         : $(EXEC)
     
    # the module is linked to .o but the real file is .mod.
    # It has to be move in object directories. Always delete both at the same time.
    $(OBJ_MOD)  : $(DIR_OBJ)/%.o   : $(DIR_MOD)/%.f90
    				  $(FC) $(FFLAGS) -o $@ -c $<
    				  mv *.mod $(DIR_OBJ)/
     
    # f77 routine
    $(OBJ_77)   : $(DIR_OBJ)/%.o   : $(DIR_77)/%.f
    				  $(FC) $(FFLAGS) -o $@ -c $<
     
    # all f90 routines (depend on module and f77)
    $(OBJ_MULTI): $(DIR_OBJ)/%.o   : $(DIR_MULTI)/%.f90 $(OBJ_MOD) $(OBJ_77) 
    				  $(FC) $(FFLAGS) -o $@ -module $(DIR_OBJ)/ -c $<
     
    $(OBJ_REST) : $(DIR_OBJ)/%.o   : $(DIR_REST)/%.f90 $(OBJ_MOD) $(OBJ_77) 
    				  $(FC) $(FFLAGS) -o $@ -module $(DIR_OBJ)/ -c $<
     
    $(OBJ_HAM)  : $(DIR_OBJ)/%.o   : $(DIR_HAM)/%.f90 $(OBJ_MOD) $(OBJ_77) 
    				  $(FC) $(FFLAGS) -o $@ -module $(DIR_OBJ)/ -c $<
     
    $(OBJ_SURF) : $(DIR_OBJ)/%.o   : $(DIR_SURF)/%.f90 $(OBJ_MOD) $(OBJ_77) 
    				  $(FC) $(FFLAGS) -o $@ -module $(DIR_OBJ)/ -c $<
     
    $(OBJ_GREEN): $(DIR_OBJ)/%.o   : $(DIR_GREEN)/%.f90 $(OBJ_MOD) $(OBJ_77) 
    				  $(FC) $(FFLAGS) -o $@ -module $(DIR_OBJ)/ -c $<
     
     
    # all object are stored in libbeem.a
    $(LIB)      : $(OBJ_GREEN) $(OBJ_SURF) $(OBJ_HAM) $(OBJ_REST) $(OBJ_MULTI) $(OBJ_77) $(OBJ_MOD)
    				  xiar -rv $@ $?
     
    # executable is built				  
    $(EXEC)     : $(LIB)
    				  $(FC) $(FFLAGS) -o $@ -module $(DIR_OBJ)/ $(SRC_MAIN) -L. $(LIB)
     
     
     
     
    # cleaning :
    # make new remove all *.dat
    # Needed to run a new calculation, in order to avoid erasing data
    .PHONY                : clean mrproper new
    new                   :
    	                     @echo 'removing *.log and *.dat files:-----------------'
    	                     rm -f *.log *.dat
     
    clean                 :
    	                     @echo 'removing *.o and *.mod:-------------------------'
    								rm -f $(DIR_OBJ)/*.o $(DIR_OBJ)/*.mod
     
     
    mrproper              : clean new
    	                     @echo 'removing *.exe and *.a files:-------------------'
    	                     rm -f $(EXEC) $(LIB)
    Le truc un peu relou est au niveau du module. je n'ai pas trouvé de solution pour qu'il le compile bien comme il faut dans le répertoire "objet". du coup je fais un mv pour le placer au bon endroit.

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. [AC-2007] Problème et question sur zone liste pour projet
    Par amartik dans le forum IHM
    Réponses: 1
    Dernier message: 20/01/2010, 20h32
  2. Problème intellisense avec projets "makefile"
    Par doudounico dans le forum Visual Studio
    Réponses: 0
    Dernier message: 22/12/2009, 09h40
  3. Makefile pour projet c++, plusieurs fichiers, classes
    Par thhomas dans le forum Systèmes de compilation
    Réponses: 2
    Dernier message: 04/08/2009, 16h42
  4. Faire un Makefile pour mon projet perl
    Par rvfranck dans le forum Langage
    Réponses: 9
    Dernier message: 06/11/2008, 05h37
  5. un problème majeur pour notre projet
    Par elfugu dans le forum Flash
    Réponses: 7
    Dernier message: 12/08/2006, 02h18

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo