Contenu | Rechercher | Menus

Annonce

Si vous avez des soucis pour rester connecté, déconnectez-vous puis reconnectez-vous depuis ce lien en cochant la case
Me connecter automatiquement lors de mes prochaines visites.

À propos de l'équipe du forum.

#1 Le 12/01/2008, à 14:59

s@mson

[Résolu] Makefile: gérer les cas

Bonjour à  chacun,

Je souhaiterai réaliser un Makefile, que je peux modifier rapidement en l'éditant ou que j'invoquerai avec make avec différentes options, afin de choisir une combinaison parmi les 8 possibles, entre :

1- Compilateur A ou compilateur B,
2- Simple ou double précision,
3- Comilation en mode debug ou release.

Que me conseiller vous comme technique pour arriver à  mes fins ?

Merci beaucoup

Dernière modification par s@mson (Le 12/01/2008, à 17:33)

Hors ligne

#2 Le 12/01/2008, à 15:52

slapierre

Re : [Résolu] Makefile: gérer les cas

Faire plusieurs Makefile, les appeler avec la commande :

make -f mymakefile

Simon


"Le spectre de la folie nous empêchera-t-il de hisser l'étendard de l'imagination?" - André Breton

Hors ligne

#3 Le 12/01/2008, à 16:25

slapierre

Re : [Résolu] Makefile: gérer les cas

Pour la simple ou double précision, je crois que ça dépend du code (float ou double) et non des options de compilation. J'ai modifié le Makefile que j'utilises toujours pour ajouter tes features, que je trouve par ailleurs très intéressantes!

#******************************************************************************
# AUTEURS       : simon.lapierre@gmail.com
# FICHIER       : Makefile
# COMPILATEUR   : POSIX-Compliant C++ Compiler
# TARGET        : out
# DATE          : 2007-05-25
# VERSION       : 1.0
# MODIFICATIONS : n/a
# DESCRIPTION   : Effectuer la compilation et l'édition des liens pour le projet
#******************************************************************************/

# Compilateur par défaut
# Modifier la macro CC à  l'appel : make "CC= g++"
CC = gcc

# Optimisation : http://developer.apple.com/documentation/DeveloperTools/gcc-3.3/gcc/Optimize-Options.html
CFLAGS = -Wall -O2

# GDB primer : http://www.ecs.syr.edu/faculty/oh/cis586-spring2007/GDB%20Primer.htm
CFLAGS_DBG = -Wall -O2 -g

# Inclusion de math.h (-lm)
LIBS = -lm

# Nom du programme :
TARGET = out

# Liste des fichiers sources :
SRC = main.cc

# Création des fichiers objets : portent même nom que les fichier sources
OBJ = $(SRC:.c=.o)

# Cible par défaut :
all: compile build

# Cible de debug :
dbg: compile_dbg build

compile:
	$(CC) -c $(CFLAGS) $(SRC)

compile_dbg:
	$(CC) -c $(CFLAGS_DBG) $(SRC)

build:
	$(CC) -o $(TARGET) $(LIBS) $(OBJ)

clean:
	rm -f *~ *.o *.gch $(TARGET)

le Makefile ci-dessus ne fonctionne pas directement, étant donné que le compilateur par défaut est gcc et que la SRC est un fichier C++, tu dois donc invoquer make de la façon suivante :

En mode release (cible all par défaut)

     $ make "CC= g++"

ou

     $ make "CC= g++" all

En mode debug : 

     $ make "CC= g++" dbg

Fichier de test (main.cc)

#include <iostream>
using namespace std;

int main (void)
{
	cout<<"allo"<<endl;
	return 0;
}

Simon


"Le spectre de la folie nous empêchera-t-il de hisser l'étendard de l'imagination?" - André Breton

Hors ligne

#4 Le 12/01/2008, à 16:39

s@mson

Re : [Résolu] Makefile: gérer les cas

Merci slapierre !

Que de bonnes idées pour résoudre mon pb! Moi je m'étais basé sur : http://gl.developpez.com/tutoriel/outil/makefile/ pour écrire mon Makefile. Avec l'aide que tu viens de me donner, je pense pouvoir écrire le Makefile de même rêves... Il faut d'abord que j'arrive a passer mon code en double précision, ce qui me pose par ailleurs des problèmes, et ensuite je posterai le Makefile que j'ai écrit. Le miens est pour le fortran, ça fera de la variété!

Dernière modification par s@mson (Le 12/01/2008, à 16:42)

Hors ligne

#5 Le 12/01/2008, à 17:24

slapierre

Re : [Résolu] Makefile: gérer les cas

Je ne comprend toujours pas ton histoire de "passer en double précision", mais bon...  Quand tout sera à  ton goût, modifie le titre du message et ajoute "résolu".

Tu peux aussi passer voir la discussion suivante :

>> [c] faire un makefile: http://forum.ubuntu-fr.org/viewtopic.php?id=177717

Simon


"Le spectre de la folie nous empêchera-t-il de hisser l'étendard de l'imagination?" - André Breton

Hors ligne

#6 Le 12/01/2008, à 17:33

s@mson

Re : [Résolu] Makefile: gérer les cas

ok, "passer en double précision" ca doit etre un mauvais jargon... Pour parler de la même chose : Il s'agit de dire si on code un réel sur 4 octet (simple précision) ou 8 octet (double précision). Pour cela, on peut le déclarer directement dans le code, ou passer une option au compilateur.
Par exemple, http://www.idris.fr/  -> support technique -> calcul vectoriel ->  Système de compilation fortran -> option principale du compilateur fortran

Hors ligne

#7 Le 12/01/2008, à 18:37

slapierre

Re : [Résolu] Makefile: gérer les cas

Très intéressant, vous utilisez F90 ou HPF pour le traitement en parallèle? J'ai entendu de très bonnes choses à  propos de fortran pour les architectures parallèle. Vous programmez avec la librairie MPI?

Tu dois dois soit modifier la variable CFLAGS, ou ajouter une macro PRECISION avec une valeur par défaut :

# taille d'un real : 4 octets
PRECISION = -Wf"-A dbl8"

...

$(CC) -c $(CFLAGS) $(PRECISION) $(SRC)

Pour ce qui est de l'invocation de make, il y aura peut-être des problèmes étant donné les guillements doubles, tu dois - sous toute réserve - donc utiliser des guillements simples :

# double précision pour les real? 
    $ make 'PRECISION = -Wf"-A dbl"'

Si tu es (vraiment) paresseux (comme moi), tu peux te faire une script avec un "menu" pour éviter de toujours saisir tes variables, voici un petit exemple :


#!/bin/sh

# http://crazedmonkey.com/blog/programming/multiple-expression-if-statement-in-bash.html

echo -n "Debug (1) ou Release (2) "
read a

echo -n "Précision simple (4) ou double (8)"
read b

if [ $a -eq 1 -a $b -eq 4 ]; then
    echo debug + simple
fi

if [ $a -eq 1 -a $b -eq 8 ]; then
    echo debug + double
fi

if [ $a -eq 2 -a $b -eq 4 ]; then
    echo release + simple
fi

if [ $a -eq 2 -a $b -eq 8 ]; then
    echo release + double
fi

Simon


"Le spectre de la folie nous empêchera-t-il de hisser l'étendard de l'imagination?" - André Breton

Hors ligne

#8 Le 12/01/2008, à 18:40

slapierre

Re : [Résolu] Makefile: gérer les cas

J'oubliais... pour exécuter le script :

    $ bash test.sh

ou rendre le script exécutable  (pour pouvoir faire $ ./test.sh)

    $ chmod +x test.sh

Aussi, tu remplaces "echo ..." par "make ..."

Simon


"Le spectre de la folie nous empêchera-t-il de hisser l'étendard de l'imagination?" - André Breton

Hors ligne

#9 Le 12/01/2008, à 19:29

JBF

Re : [Résolu] Makefile: gérer les cas

Bonjour,

voici un exemple de ce que j'ai fait pour produire une version linux ou une version win32 avec le même makefile :

#---------------------------------------------------------------------#
# Directories and Fortran compiler
#---------------------------------------------------------------------#
HOME	=/home/toto
SRCDIR	=$(HOME)/dev
tmp     =$(HOME)/zbin

#VERSION	=win32
VERSION	=Linux

ifeq ($(VERSION),Linux)
  # Version Linux 
  EXEDIR	=$(HOME)/Test/exec_dev
  BINDIR	=$(HOME)/zbin/dev
  FC	= g95
  #FC	= gf95
  #FC	= gfortran
  ligne1	="      CHARACTER(len=9),PARAMETER :: OS = 'Linux-x86'"
  ligne2	="      character(len=1), parameter :: slash = '/'"
else
  # Version win32
  EXEDIR	=$(HOME)/Test/win32
  BINDIR	=$(HOME)/zbin/win32
  FC	= wine g95
  ligne1	="      CHARACTER(len=9),PARAMETER :: OS = 'Win32'"
  ligne2	="      character(len=1), parameter :: slash = '\'"
endif


#---------------------------------------------------------------------#
# Fortran compiler flags
#---------------------------------------------------------------------#
ifeq ($(FC),gf95)
  FFLAGS	= -fno-automatic -O3 -fimplicit-none -fbacktrace -mtune=native -march=native 
  # options pour le linker
  LFLAGS	= -static-libgfortran 
  #module dirs
  MFLAGS	= -J$(BINDIR)/
else ifeq ($(FC),gfortran)
  FFLAGS	= -fimplicit-none -fno-automatic -O3 -malign-double
  # options pour le linker
  LFLAGS	= -static
  #module dirs
  #MFLAGS	= -J$(BINDIR)/  #option sans effet (bug)
else
  FFLAGS	= -O3 -malign-double -fimplicit-none -Wprecision-loss -ftrace=full -fstatic -Werror
  # options pour le linker
  LFLAGS	= -static
  #module dirs
  MFLAGS	= -fmod=$(BINDIR)/
endif

#include dirs
IFLAGS	= -I$(BINDIR)/
.........

Les variables ligne1 et ligne2 servent à  modifier le code source pour faire apparaà®tre l'OS dans l'entête du listing et définir le séparateur dans les chemins de fichier.

JBF


LibreOffice : https://fr.libreoffice.org/ (téléchargement, documentation, FAQ, assistance, contribuer, ...)
Aide pour LibreOffice par la communauté francophone : Ask LibreOffice

Hors ligne