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

Systèmes de compilation Discussion :

Makefile : variable ignorée et traitement de chaine de caractères


Sujet :

Systèmes de compilation

  1. #1
    Membre régulier
    Profil pro
    Inscrit en
    Juin 2007
    Messages
    104
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2007
    Messages : 104
    Points : 84
    Points
    84
    Par défaut Makefile : variable ignorée et traitement de chaine de caractères
    Bonjour,

    Je cherche à faire un makefile assez générique pour éviter d'avoir à répéter certaines règles mais je rencontre quelques soucis sur la mise en place de celui-ci.

    Pour commencer je cherche à gérer deux types de fichier source. Le premier des sources C, le second des sources Cuda (un C pas très joli). Je possède trois répertoires à la racine de mon projet inc, src, et obj. J'aimerais que les fichiers objets créés à la compilation apparaissent dans obj pour ne pas salir le reste.

    Je vous montre mon Makefile actuel et ensuite fais part des problèmes.

    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
    CC = gcc
    CuC = nvcc
     
    CFLAGS = -Wall -g
    CuFLAGS =
     
    LDFLAGS =
     
    SRCDIR = src/
    SRC = $(wildcard $(SRCDIR)/*.c) $(wildcard $(SRCDIR)/*.cu)
     
    INCDIRS = -I ../inc/ -I inc/ -I .
     
    OBJDIR = obj/
    OBJ = $(SRC:.c=.o) $(SRC:.cu=.o)
     
    EXEC = program
     
    all: $(EXEC)
     
    $(EXEC): $(OBJ)
    	$(CuC) $(LDFLAGS) -o $@ $^
     
    $(OBJDIR)/%.o: $(SRC)/%.c
    	echo $(INCDIRS)
    	$(CC) $(CFLAGS) $(INCDIRS) -o $@ -c $<
     
    $(OBJDIR)/%.o: $(SRC)/%.cu
    	$(CuC) $(INCDIRS) -o $@ -c $<
    Le premier soucis concerne la forme des valeurs au sein de la variable OBJ. Elles sont de la forme $(SRC)/fichier.o or je souhaite $(OBJ)/fichier.o mais l'utilisation du raccourci que je ne maîtrise me forme la première instance (je voudrais faire un cut -d / -f 2 sur chaque élément en fait, ce que m'intéresse est juste fichier.o).

    Le second souci vient de la variable INCDIRS qui est tout simplement ignorée et n'apparait par exemple pour la compilation d'un de mes premiers fichiers :

    make -B
    gcc -Wall -g -c -o src//complex.o src//complex.c
    Si quelqu'un connait un moyen d'éviter ces désagréments, je l'en remercie ;-)

    Merci à vous !

    sperca

  2. #2
    Membre éprouvé
    Profil pro
    Inscrit en
    Mars 2005
    Messages
    865
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2005
    Messages : 865
    Points : 1 069
    Points
    1 069
    Par défaut
    Bonjour,

    Désolé de faire de la pub mais je perds tellement moins de temps avec CMake pour gérer tes petits problèmes que je ne peux m'empêcher de faire une petite pub. Désolé de ne pas répondre à tes questions. J'aurais pu y répondre à une époque mais ça fait trop longtemps que je ne fais plus de Makefile à la main.

    Donc, avec CMake (http://www.cmake.org/), ton projet se réduirait à

    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
     
    cmake_minimum_required(VERSION 2.8)
    project(MyProject)
     
    find_package(CUDA)
     
    file(GLOB_RECURSE sources src/*.c)
    file(GLOB_RECURSE cuSources src/*.cu)
     
    if(CMAKE_COMPILER_IS_GNUCC)
      set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -Wall")
    endif()
     
    # ../inc est-il réellement un répertoire accessible par le dessus ?
    include_directories(../inc inc)
     
    cuda_add_executable(program ${sources} ${cuSources})
    Il suffit de placer ce code dans un fichier qui s'appelle CMakeLists.txt et de lancer CMake.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
    cd <BUILD_DIR>
    cmake <SOURCE_DIR>
    make
    cmake est un exécutable en ligne de commande mais il y aussi une GUI (cmake-gui ou ccmake en ncurses). Pour passer en Debug, il faut positionner CMAKE_BUILD_TYPE à Debug dans la GUI ou en ligne de commande
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    cmake -D CMAKE_BUILD_TYPE=Debug <SOURCE_DIR>
    Que des avantages:
    • Tu n'écris plus les règles de compilation
      éviter d'avoir à répéter certaines règles
    • Séparation nette entre les sources et les produits de compilation
      J'aimerais que les fichiers objets créés à la compilation apparaissent dans obj pour ne pas salir le reste.
    • C'est beaucoup plus facile à lire.
    • C'est multiplateforme. On peut générer des Makefiles mais aussi des projets VisualStudio, Eclipse...

Discussions similaires

  1. [RegEx] Traitement de chaines de caractères
    Par ctrl+z dans le forum Langage
    Réponses: 17
    Dernier message: 09/02/2009, 15h11
  2. Traitement de chaine de caractère
    Par kroax dans le forum Général JavaScript
    Réponses: 2
    Dernier message: 22/06/2007, 15h09
  3. [VB6]Traitement de chaine de caractère + conversion
    Par kboo dans le forum VB 6 et antérieur
    Réponses: 4
    Dernier message: 24/04/2006, 09h23
  4. [XSL] Optimisation d'un traitement de chaines de caractères
    Par mathieu dans le forum XSL/XSLT/XPATH
    Réponses: 2
    Dernier message: 05/02/2006, 18h57
  5. Traitement de chaine de caractères
    Par lapartdombre dans le forum Langage
    Réponses: 9
    Dernier message: 03/02/2006, 09h29

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