web-dev-qa-db-fra.com

Ajout d'un répertoire pour les en-têtes dans un Makefile

Bonjour, je voudrais vous demander, si quelqu'un sait comment ajouter un répertoire pour les fichiers d'en-tête dans le Makefile pour éviter l'erreur * .h introuvable, j'ai essayé cette option mais ne fonctionne pas:

INC_PATH := -I /directory/to/add
23
Eduardo

Bien que l'objectif soit finalement d'affecter la valeur des CFLAGS (comme suggéré par @unwind), ce n'est souvent pas une bonne idée de simplement définir la valeur des CFLAGS car il est souvent construit à partir de nombreuses pièces. Vous devez comprendre la structure du makefile et l'ensemble des macros utilisées.

[ajouté:

Eduardo a demandé: pouvez-vous publier des macros pour faire de même?

Oui, mais leur utilité dépend de la structure de vos 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}

C'est un makefile pour un de mes programmes appelé sqlcmd (un nom choisi une décennie et plus avant que Microsoft ne crée une commande du même nom). Je suppose que le programme make a une règle pour compiler du code C en objet comme:

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

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

${CC} ${CFLAGS} -o $@ ${OBJECTS} ${LDFLAGS}

Comme vous pouvez le voir, il existe des macros configurables 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 en avoir beaucoup, selon la plate-forme), et des drapeaux d'optimiseur (OFLAGS), des drapeaux supplémentaires (CFLAGS), des drapeaux définis par l'utilisateur (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 ajoutez un indicateur 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 de bruit sur ma plateforme de développement, qui peut être Linux, Solaris ou MacOS X. Pour les consommateurs du programme, il existe un script configure généré par autoconf, donc ils n'ont pas à se soucier de bien faire ces bits. Cependant, cela a une forte ressemblance génétique avec ce code, y compris l'option UFLAGS.

Notez que de nombreux systèmes de création de makefile ont un mécanisme pour définir CFLAGS légèrement similaire à cela - et simplement assigner à CFLAGS annule le bon travail effectué par le système. Mais vous devez comprendre votre makefile pour pouvoir le modifier sainement.

]

15
Jonathan Leffler

Au moins pour GNU make, essayez la variable implicite CFLAGS, un péché:

CFLAGS=-I/directory/to/add
21
unwind