2008-12-04 8 views

Répondre

14

Bien que l'objectif ultime est d'affecter la valeur de CFLAGS (comme le suggère @unwind), il n'est souvent pas judicieux de définir simplement la valeur de CFLAGS dix construit de nombreuses pièces. Vous devez comprendre la structure du makefile et l'ensemble des macros utilisées.

[Ajouté:

Eduardo a demandé: Pouvez-vous poster des macros pour faire la même chose?

Oui, mais leur utilité dépend de la structure de vos fichiers makefiles. Voici un exemple modérément complexe d'un de mes makefiles.

CC  = gcc -g 
XFLAGS = -Wall -Wshadow -Wstrict-prototypes -Wmissing-prototypes \ 
      -DDEBUG -Wredundant-decls 
#CC  = cc -g 
#XFLAGS = 
UFLAGS = # Always overrideable on the command line 

DEPEND.mk = sqlcmd-depend.mk 
INSTALL.mk = sqlcmd-install.mk 

ESQLC_VERSION = `esqlcver` 
OFLAGS = # -DDEBUG_MALLOC -g 
OFLAGS = -g -DDEBUG -O4 
PFLAGS = -DHAVE_CONFIG_H 
OFILES.o = # rfnmanip.o # malloc.o # strdup.o # memmove.o 
VERSION = -DESQLC_VERSION=${ESQLC_VERSION} 
#INC1  = <defined in sqlcmd-depend.mk> 
#INC2  = <defined in sqlcmd-depend.mk> 
INC3  = /usr/gnu/include 
INC4  = ${INFORMIXDIR}/incl/esql 
INC5  = . #${INFORMIXDIR}/incl 
INCDIRS = -I${INC3} -I${INC1} -I${INC2} -I${INC4} -I${INC5} 
LIBSQLCMD = libsqlcmd.a 
STRIP  = #-s 
LIBC  = #-lc_s 
LIBMALLOC = #-lefence 
LIBRDLN = -lreadline 
LIBCURSES = -lcurses 
LIBPOSIX4 = -lposix4 
LIBG  = #-lg 
LIBDIR1 = ${HOME}/lib 
LIBDIR2 = /usr/gnu/lib 
LIBJL1 = ${LIBDIR1}/libjl.a 
LIBJL2 = ${LIBDIR1}/libjlss-${ESQLC_VERSION}.a 
LIBTOOLS = ${LIBJL2} ${LIBJL1} 
LDFLAGS = ${LIBSQLCMD} ${LIBTOOLS} -L${LIBDIR2} ${LIBG} ${LIBMALLOC} \ 
      ${LIBPOSIX4} ${LIBC} ${STRIP} 
CFLAGS = ${VERSION} ${INCDIRS} ${OFLAGS} ${XFLAGS} ${PFLAGS} ${UFLAGS} 

Ce makefile pour un programme appelé de mes sqlcmd (un nom choisi une dizaine d'années et plus avant que Microsoft a créé une commande du même nom). Je suppose que le programme make a une règle pour la compilation du code C pour objet comme:

${CC} ${CFLAGS} -c $*.c 

et que la règle pour relier un programme à partir d'un ensemble de fichiers d'objets répertoriés dans les objets macro ressemble à:

${CC} ${CFLAGS} -o [email protected] ${OBJECTS} ${LDFLAGS} 

Comme vous pouvez le voir, il existe des macros paramétrables séparément pour ESQLC_VERSION (la version d'Informix ESQL/C utilisée, dérivée par défaut en exécutant un script esqlcver), puis les répertoires include via INC1 à INC5 et INCFLAGS (il peut y avoir être beaucoup de ceux-ci, selon la plate-forme), et les indicateurs d'optimiseur (OFLAGS), les drapeaux supplémentaires (CFLAGS), définis par l'utilisateur ed flags (UFLAGS - un idiome que j'utilise dans la plupart de mes makefiles; il permet à l'utilisateur de définir UFLAGS sur la ligne de commande make et ajouter un drapeau supplémentaire à la construction), et un tas de macros liées à la bibliothèque. C'est ce qu'il faut pour que mon makefile de développement soit ajustable avec un minimum d'effort sur ma plateforme de développement, qui peut être Linux, Solaris ou MacOS X. Pour les utilisateurs du programme, il y a un configure généré par autoconf, donc ils ne le font pas avoir à s'inquiéter d'obtenir ces bits à droite. Cependant, cela a une forte ressemblance génétique avec ce code, y compris l'option UFLAGS.

Notez que de nombreux systèmes pour la construction de fichier makefile ont un mécanisme pour paramétrer CFLAGS légèrement similaire à ceci - et simplement assigner à CFLAGS annule le bon travail effectué par le système. Mais vous devez comprendre votre makefile pour pouvoir le modifier sainement.

]

18

au moins pour GNU make, essayez la variable CFLAGS implicite, comme dans:

CFLAGS=-I/directory/to/add