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 :

cmake et les fichiers .o


Sujet :

Systèmes de compilation

  1. #1
    Futur Membre du Club
    Profil pro
    Inscrit en
    Octobre 2005
    Messages
    12
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2005
    Messages : 12
    Points : 7
    Points
    7
    Par défaut cmake et les fichiers .o
    Bonjour.
    Si je ne suis pas dans la bonne section des forums veuillez m'en excuser.

    Je développe actuellement une application en c++ sous linux et je voudrais la porter sous windows. J'ai donc opter pour cmake pour ma gestion de projet cross-platform. Or je souhaiterais avoir une version de mon application en Debug et une autre en Release.
    Actuellement je sais generer mon executable dans le repertoire de mon choix grace à la commande set(EXECUTABLE_OUTPUT_PATH bin/${CMAKE_BUILD_TYPE}) ; mon exécutable en Debug est donc générerer dans le repertoire bin/Debug, et l'exécutable Release dans le repertoire bin/Release.
    Dans la même optique je voudrais générer les fichiers .o intermédiaire dans le répertoire de mon choix. Actuellement les .o sont générés dans le repertoire CMakeFiles/Template.dir/src ; or est il possible de generer mes .o en debug dans le repertoire obj/Debug et mes .o release dans le repertoire obj/Release ?

    J'espère que j'ai été assez clair et je vous remercie d'avance de vos réponse

    koubykoub

  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
    Je te retourne la question.
    Pourquoi veux-tu spécifier le répertoire de génération des .o ?

    Je comprends que CMake fournisse une variable pour spécifier le répertoire de sortie des exécutables et des librairies. Je ne vois pas l'intérêt d'une telle variable pour les objets (et à ma connaissance, il n'en existe pas) car c'est de la cuisine interne de CMake.

    Je vois peut-être un moyen mais c'est à tes risques et périls : surcharger la règle de compilation CMAKE_<LANG>_COMPILE_OBJECT.

    Au passage, depuis CMake 2.6, EXECUTABLE_OUTPUT_PATH est déprécié au profit de RUNTIME_OUTPUT_DIRECTORY.

  3. #3
    Futur Membre du Club
    Profil pro
    Inscrit en
    Octobre 2005
    Messages
    12
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2005
    Messages : 12
    Points : 7
    Points
    7
    Par défaut
    tout d'abord, merci de ta réponse rapide aoyou.

    Si je veux séparer mes .o Debug et mes .o Release c'est que je n'ai pas envie de tout recompiler à chaque foi que je passe de Debug à Release ou vice versa. Mon projet est relativement important et la compilation est plutot longue, or parfois j'aime bien comparer mes version Debug et Release rapidement.

    sinon j'ai essayer la regle de comilation CMAKE_CXX_COMPILE_OBJECT en faisant ceci :
    set(CMAKE_CXX_COMPILE_OBJECT obj/${CMAKE_BUILD_TYPE})
    mais ca ne marche pas ; comment utiliser cette règle (désolé, je suis totalement débutant avec cmake) ?

    J'ai aussi essayer d'utiliser RUNTIME_OUTPUT_DIRECTORY à la place de EXECUTABLE_OUTPUT_DIRECTORY en faisant ceci :
    set(RUNTIME_OUTPUT_DIRECTORY bin/${CMAKE_BUILD_TYPE})
    Mais ça me génère mon executable à la racine au lieu de bin/Debug ou bin/Release. Quel est la bonne façon de l'utiliser ?

    Merci.
    Koubykoub

  4. #4
    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
    Hum... je n'avais pas compris. Comme tu as parlé de Windows, j'ai cru que tu voulais avoir des répertoires séparés pour Debug et Release. Or, c'est le cas sous Visual Studio. Je croyais que tu voulais juste changer les noms.

    Il faut voir que CMake s'adapte aux outils en respectant leur philosophie d'utilisation. Dans Visual Studio, un projet comprend différentes configurations de build (debug, release), donc tu auras bien des répertoires séparés. Pour les Makefiles, ce n'est généralement pas le cas. Le choix de CMake a donc été de ne fournir qu'une seule configuration par build.

    Par conséquent, si tu veux deux builds, un en Debug, un en Release, tu dois les faire dans des répertoires de build séparés. Tu pourras ensuite passer de l'un à l'autre sans tout recompiler.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
     
    cd src
    mkdir build-debug
    cd build-debug
    cmake -D CMAKE_BUILD_TYPE=Debug ..
    make # Compilation en Debug
    cd ..
    mkdir build-release
    cd build-release
    cmake -D CMAKE_BUILD_TYPE=Release ..
    make # Compilation en Release
    Pour la variable CMAKE_CXX_COMPILE_OBJECT, oublie la. Elle est réservée à une utilisation experte de CMake.

    Erreur de ma part. RUNTIME_OUTPUT_DIRECTORY est le nom de la propriété pour une cible. La variable générale est CMAKE_RUNTIME_OUTPUT_DIRECTORY. Avec les Makefiles, l'exécutable sera produit dans bin/. Sous Visual Studio, il sera produit dans bin/Debug, bin/Release...
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    set(CMAKE_RUNTIME_OUTPUT_DIRECTORY bin)

  5. #5
    Futur Membre du Club
    Profil pro
    Inscrit en
    Octobre 2005
    Messages
    12
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2005
    Messages : 12
    Points : 7
    Points
    7
    Par défaut
    Merci pour la variable CMAKE_RUNTIME_OUTPUT_DIRECTORY ; ca marche.

    En ce qui concerne les deux builds séparés, je ne suis pas sûr d'avoir compris. Veux tu dire qu'il faut faire par exemple un repertoire buidDebug et un repertoire buidRelease a la racine de mon projet avec deux CMakeLists.txt differents générant chacun deux makefile different ?

    Merci
    Koubykoub

  6. #6
    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
    Veux tu dire qu'il faut faire par exemple un repertoire buidDebug et un repertoire buidRelease a la racine de mon projet avec deux CMakeLists.txt differents générant chacun deux makefile different ?
    Non, un seul CMakeLists.txt mais oui deux répertoires build. C'est le principe de l'out-of-source. Tu as d'un côté tes sources avec un CMakeLists.txt de l'autre autant de builds que tu veux. De manière simpliste, ça ressemble à ceci.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     
    <Répertoire des sources>
    - CMakeLists.txt
    - include/lib.h
    - src/lib.c
    - src/main.c
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
     
    <Répertoire des builds>
      <Debug>
      - CMakeCache.txt
      - Makefile
      - main
      <Release>
      - CMakeCache.txt
      - Makefile
      - main
    Tu peux compiler tes sources d'où tu veux et dans autant de répertoires de build que tu veux. C'est beaucoup mieux que de compiler dans les sources. Si ce n'est pas clair, dis-moi comment tu utilises cmake (ligne de commande ou IHM) et je te donnerai plus d'explications.

  7. #7
    Futur Membre du Club
    Profil pro
    Inscrit en
    Octobre 2005
    Messages
    12
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2005
    Messages : 12
    Points : 7
    Points
    7
    Par défaut
    Bon, j'ai fait un projet minimal contenant un seul fichier source

    voici a quoi ressemble la racine de mon projet :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
    <.>
    - CMakeLists.txt
      <src>
      - main.cpp
    voici le contenue de CMakeLists.txt :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
     
    cmake_minimum_required(VERSION 2.6)
     
    # output
    set(CMAKE_RUNTIME_OUTPUT_DIRECTORY bin/${CMAKE_BUILD_TYPE})
     
    # project
    project(Hello CXX)
     
    # files
    add_executable(
                    Hello
                    src/main.cpp
    )
    Puis j'ouvre un terminal à la racine de mon projet et je tape la commande :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    cmake -G"Unix Makefiles" -DCMAKE_BUILD_TYPE:STRING=Debug
    voici a quoi ressemble maintenant la racine de mon projet :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
     
    <.>
    - CMakeLists.txt
    - CMakeCache.txt
    - cmake_install.cmake
    - Makefile
      <src>
      - main.cpp
      <CMakeFiles>
      - <tout plein de repertoires et de fichiers>
      <bin>
        <Debug>
    Maintenant je tape :
    Et j'obtiens :
    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
     
    <.>
    - CMakeLists.txt
    - CMakeCache.txt
    - cmake_install.cmake
    - Makefile
      <src>
      - main.cpp
      <CMakeFiles>
      - <tout plein de repertoires et de fichiers>
        <Hello.dir>
          <src>
          - main.cpp.o
      <bin>
        <Debug>
        - Hello
    Si je comprends bien il faudrait que cmake génere le Makefile, CMakeCache.txt ainsi que le repertoire <CMakeFiles> dans un sous repertoire de mon choix, seulement je ne sais pas comment faire. Pourrais tu m'indiquer la marche à suivre pour arriver à ce résultat ?
    Pour information, je suis sous linux (ubuntu 9.10 - karmic koala), j'utilise cmake 2.8 et je compile en ligne de commande.

    Merci d'avance.
    Koubykoub

  8. #8
    Futur Membre du Club
    Profil pro
    Inscrit en
    Octobre 2005
    Messages
    12
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2005
    Messages : 12
    Points : 7
    Points
    7
    Par défaut
    Ca y est, j'ai trouvé comment faire : il suffit de taper la commande cmake dans le repertoire de build de notre choix en indiquant a cmake le chemin de CMakeLists.txt.

    Je te remercie infiniment aoyou, ton aide m'a été précieuse.

    Je marque ce topic comme résolu.

    A+
    Koubykoub

  9. #9
    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
    Oui exactement. C'est ce que je voulais indiquer dans mon second post mais j'ai oublié d'écrire les cd pour se placer dans le répertoire de build.

    C'est maintenant rectifié dans le post.

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

Discussions similaires

  1. CMake projet C/C++, problème de liens entre les fichiers
    Par LaMainSurLeKatana dans le forum C++
    Réponses: 1
    Dernier message: 16/08/2010, 15h53
  2. Réponses: 4
    Dernier message: 16/08/2003, 13h21
  3. Problème avec les fichiers .JPG
    Par cprogil dans le forum Langage
    Réponses: 5
    Dernier message: 10/06/2003, 15h44
  4. [TP]Lister les fichiers d'un répertoire
    Par nvtitan dans le forum Turbo Pascal
    Réponses: 4
    Dernier message: 21/06/2002, 11h22
  5. Les fichiers d'un projet
    Par Manolo dans le forum C++Builder
    Réponses: 4
    Dernier message: 07/05/2002, 17h51

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