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

C Discussion :

Ajouter des fichers headers et/ou C à un makefile linux


Sujet :

C

  1. #1
    Membre confirmé
    Avatar de DjPoke
    Homme Profil pro
    Invalide temporaire
    Inscrit en
    Août 2005
    Messages
    93
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 52
    Localisation : France, Corse (Corse)

    Informations professionnelles :
    Activité : Invalide temporaire

    Informations forums :
    Inscription : Août 2005
    Messages : 93
    Billets dans le blog
    1
    Par défaut Ajouter des fichers headers et/ou C à un makefile linux
    Bonjour à tous/toutes,

    J'essaye de modifier une template C trouvée sur le web. De prendre un simple "hello world" pour Agon Light (programmé en sdcc), et d'en faire un programme à moi.
    Mais comme je ne comprend pas grand chose aux fichiers make linux, je requiers un peu d'aide.
    Merci d'avance.

    Voici le makefile en question:

    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
     
    rwildcard=$(foreach d,$(wildcard $(1:=/*)),$(call rwildcard,$d,$2) $(filter $(subst *,%,$2),$d))
     
    SRC=$(call rwildcard,src,*.h) src/main.c
    INC=$(call rwildcard,include,*.h) $(call rwildcard,src,*.h)
    MOSLIBSRC=$(call rwildcard,include,*.s)
     
    CRT=out/crt0.rel
    MOSLIB=out/mos.rel
     
    CC=sdcc
    LD=sdcc
    AS=sdasz80
    CLD=sdldz80
    OBJCPY=sdobjcopy
     
    ASFLAGS=-plosgff
    CFLAGS=-mez80_z80 -Iinclude/ -Isrc/include/ --reserve-regs-iy --std-c11 --fno-omit-frame-pointer
    CLINK=--no-std-crt0 -mez80_z80 --code-loc 100
     
    all: a.bin
     
    $(CRT): crt/crt0.s
    		$(AS) $(ASFLAGS) -o $(CRT) crt/crt0.s
     
    $(MOSLIB): $(MOSLIBSRC)
    		$(AS) $(ASFLAGS) -o $(MOSLIB) lib/mos.s
     
    a.bin: $(SRC) $(INC) $(CRT) $(MOSLIB) 
    		$(CC) $(CFLAGS) $(MOSLIB) src/main.c -o out/main.ihx
    		$(LD) $(CLINK) $(CRT) $(MOSLIB) out/main.rel -o out/a.ihx
    		$(CLD) -nf out/a.lk
    		$(OBJCPY) -I ihex -O binary out/a.ihx main.bin
     
    clean:
    		rm -rf out/*.* out/*  main.bin
    EDIT: Pour info, le message d'erreur qui me fait penser que je dois modifier le makefile...
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    ?ASlink-Warning-Undefined Global '_init' referenced by module 'main'
    make: *** [Makefile:29: a.bin] Error 1
    EDIT: J'ai modifié ceci, ce qui change le message d'erreur à ce qui suit.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    a.bin: $(SRC) $(INC) $(CRT) $(MOSLIB)
                    $(CC) $(CFLAGS) $(MOSLIB) src/main.c -o out/main.ihx
    		$(CC) $(CFLAGS) $(MOSLIB) src/func.c -o out/func.ihx
    		$(CC) $(CFLAGS) $(MOSLIB) src/vdu.c -o out/vdu.ihx
    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
     
    bruno@PC-Salon:~/C/miniGraf$ make all
    sdcc -mez80_z80 -Iinclude/ -Isrc/include/ --reserve-regs-iy --std-c11 --fno-omit-frame-pointer out/mos.rel src/main.c -o out/main.ihx
     
    ?ASlink-Warning-Undefined Global '_clear_text_area' referenced by module 'main'
     
    ?ASlink-Warning-Undefined Global '_VDU' referenced by module 'main'
     
    ?ASlink-Warning-Undefined Global '_init' referenced by module 'main'
     
    ?ASlink-Warning-Undefined Global '_change_pen' referenced by module 'main'
     
    ?ASlink-Warning-Undefined Global '_intro_screen' referenced by module 'main'
     
    ?ASlink-Warning-Undefined Global '_sleep' referenced by module 'main'
     
    ?ASlink-Warning-Undefined Global '_clear_all' referenced by module 'main'
     
    ?ASlink-Warning-Undefined Global '_inkey' referenced by module 'main'
    make: *** [Makefile:29: a.bin] Error 1

  2. #2
    Expert confirmé
    Homme Profil pro
    Analyste/ Programmeur
    Inscrit en
    Juillet 2013
    Messages
    4 760
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Analyste/ Programmeur

    Informations forums :
    Inscription : Juillet 2013
    Messages : 4 760
    Par défaut
    Pour répondre 1 peu, c'est la première fois que je vois 1 makefile avec 1 commande shell Linux avec 1 variable fonction anonyme/ lambda (*)

    Tu as plusieurs parties dans 1 make.

    Tu as des variables shell CC, LD, AS, CLD, OBJCPY qui définissent les commandes que tu vas utiliser
    Tu as des variables shell SRC, INC, MOSLIBSRC définissent les dossiers qui contiennent les sources (*)
    Tu as des variables shell CRT, MOSLIB qui définissent des fichiers
    Tu as des variables shell ASFLAGS, CFLAGS, CLINK qui définissent des bascules ("switches") pour les commandes

    En shell, 1 variable XXX s'utilise $(XXX).

    (*) Tu as la commande rwildcard qui semble rechercher des fichiers (paramètre 2, c'est 1 motif) dans 1 dossier (paramètre 1) et créer 1 liste avec les fichiers trouvés.
    C'est 1 programmation assez classique qui utilise des "alias" (je ne sais pas si c'est le bon terme) $1, $2, %, etc. avec laquelle je suis 1 peu perdu il faudrait 1 bon programmeur shell Linux pour l'expliquer
    On appelle rwildcard avec call, je ne sais pas trop pourquoi : peut-être parce qu'on est dans 1 makefile ?

    Ensuite tu as les cibles : $(CRT), $(MOSLIB), a.bin
    En gros, 1 cible c'est 1 fichier (nom à gauche) qui dépend de 1 ou plusieurs fichiers (liste à droite, après le : ). Lorsque tu exécutes make, si 1 fichier dans la liste des dépendances a été modifié, tu vas exécuter les règles (je ne sais pas si c'est le bon terme) pour regénérer la cible.
    Les règles sont les commandes Linux en dessous de la cible et dont les lignes commencent par tabulation.
    Exemple : dans ton makefile, le fichier out/crt0.rel dépend de crt/crt0.s, et si ce dernier a été modifié, make va exécuter sdasz80 -plosgff -o out/crt0.rel crt/crt0.s.

    Les cibles all et clean sont des cibles spéciales. Tu peux lancer ton make avec 1 cible. make all est l'équivalent de make. make clean permet de nettoyer les fichiers temporaires.

  3. #3
    Responsable Systèmes


    Homme Profil pro
    Gestion de parcs informatique
    Inscrit en
    Août 2011
    Messages
    18 236
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Gestion de parcs informatique
    Secteur : High Tech - Matériel informatique

    Informations forums :
    Inscription : Août 2011
    Messages : 18 236
    Par défaut
    Pour répondre 1 peu, c'est la première fois que je vois 1 makefile avec 1 commande shell Linux (*)
    et les blocs "make clean" et "make install" ?
    Ma page sur developpez.com : http://chrtophe.developpez.com/ (avec mes articles)
    Mon article sur le P2V, mon article sur le cloud
    Consultez nos FAQ : Windows, Linux, Virtualisation

  4. #4
    Expert confirmé
    Homme Profil pro
    Analyste/ Programmeur
    Inscrit en
    Juillet 2013
    Messages
    4 760
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Analyste/ Programmeur

    Informations forums :
    Inscription : Juillet 2013
    Messages : 4 760
    Par défaut
    Citation Envoyé par chrtophe Voir le message
    et les blocs "make clean" et "make install" ?
    rwildcard ressemble à 1 fonction anonyme/ lambda.

    Mais effectivement, ma formulation n'est pas vraiment bonne puisque effectivement, tu as 1 bloc de commandes par cible

  5. #5
    Membre prolifique
    Avatar de Sve@r
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Février 2006
    Messages
    12 829
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Oise (Picardie)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Février 2006
    Messages : 12 829
    Billets dans le blog
    1
    Par défaut
    Bonjour
    Citation Envoyé par foetus Voir le message
    Pour répondre 1 peu, c'est la première fois que je vois 1 makefile avec 1 commande shell Linux (*)
    Pourtant c'est le cas de tous les Makefile. Même "gcc" c'est une commande Linux. Alors si on peut faire appeler gcc, pourquoi ne pas faire appeler autre chose ?
    Le Makefile c'est une liste de règles disant "pour atteindre telle cible avec telle source il faut effectuer telle action. Fatalement les actions à effectuer, qui sont celles que tu effectuerais manuellement si toi tu devais créer la cible de toi-même, sont des commandes Linux, elles ne peuvent pas être autre chose (sous-entendu qu'on bosse sous Linux)

    Voici un exemple d'une de mes règles pour supprimer les exécutables, les ".o" et ".so" de mon dossier d'exemple. Non seulement j'y place des commandes shell mais en plus j'y place des boucles shell et des alternatives shell
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    clean:
    	@ls *.c |sed -e "s/\.c$$//" |while read f; do if test -f "$$f"; then echo "rm -f $$f"; rm -f "$$f"; fi; done
    	@ls *.c |sed -e "s/\.c$$/.o/" |while read f; do if test -f "$$f"; then echo "rm -f $$f"; rm -f "$$f"; fi; done
    	@ls *.c |sed -e "s/\.c$$/.so/" |while read f; do if test -f "$$f"; then echo "rm -f $$f"; rm -f "$$f"; fi; done
    PS: oups, "ls" dans un script... pourvu que N_Bah ne vienne jamais par ici...
    Mon Tutoriel sur la programmation «Python»
    Mon Tutoriel sur la programmation «Shell»
    Sinon il y en a pleins d'autres. N'oubliez pas non plus les différentes faq disponibles sur ce site
    Et on poste ses codes entre balises [code] et [/code]

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

Discussions similaires

  1. Réponses: 1
    Dernier message: 26/11/2014, 19h30
  2. argouml ajouter des headers
    Par takout dans le forum UML
    Réponses: 0
    Dernier message: 23/10/2014, 14h02
  3. plugin DataTable, ajouter des Colspans au header
    Par Palsajicoco dans le forum jQuery
    Réponses: 3
    Dernier message: 10/04/2011, 22h08
  4. Ajouter des header soap dans une WSDL
    Par ThomasParis dans le forum Services Web
    Réponses: 0
    Dernier message: 02/08/2010, 16h14
  5. [gcc] ajouter un chemin relatif a des fichiers header
    Par wodel dans le forum Autres éditeurs
    Réponses: 4
    Dernier message: 12/11/2007, 13h54

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