Portál AbcLinuxu, 12. května 2025 04:43
Zdravím,
mám následující strukturu adresářů:
a/
a/amd/
a/distrib/
V a/
mám Makefile:
vpath %.c ..
vpath %.h ..
vpath %.y ..
...
CFLAGS=-g -O0 -Wall -Werror -fPIC -DPIC -DNET_NO_IO -DNET_NO_LOG -fno-stack-protector
LDFLAGS=-lpthread
...
LIBSA +=./distrib/libdist.a
...
all: distr ...
...
distr:
make -C distrib all
...
z ktereho includuju (pravidlo distr) Makefile z a/distrib
:
MKDIR=mkdir
CP=cp
CCADMIN=CCadmin
RANLIB=ranlib
OBJ=net.o msg.o
HEAD=main.h
NAME = project
CFLAGS=-g -O0 -Wall -Wall -fPIC -fno-stack-protector
LDFLAGS=-lpthread
OPT=-Wall -pedantic -pthread
CC=gcc
# build
build: $(NAME)
$(NAME): ${OBJ}
ar cru libdist.a net.o msg.o
ranlib libdist.a
${OBJ}:${HEAD}
%.o : %.c
gcc $(CFLAGS) -c $<
# clean
clean:
rm -rf *.o libdist.a
# all
all: project
Pokud zadám 'make' v a/, pak se mi to zkompiluje v pořádku. Ale v adresáři a/amd/ je Makefile:
include ../Makefile
Pokud zadám make v tomto podadresáři, vypíše mi to:
make -C distrib all
make: *** distrib: No such file or directory. Stop.
make: *** [distr] Error 2
Vím, že by to mělo být něco s VPATH, ale nevím jak na to. Zkoušel jsem něco vygooglit, ale nezabralo nic. Díky
make -C distrib all
se bude chovat podobně jako cd distrib; make all; cd -
, a pokud v adresáři amd
není podadresář distrib
, tak to nefunguje. Podle manuálu totiž parametr -C adresář
říká, že před tím, než se načtou jakékoli soubory, přejde make
do zadaného adresáře.
No, to tusim. Ale jak cestu k adresari pridat?
Diky
a/amd
funguje make -f ../distrib/Makefile all
, půjde to udělat třeba tak, že se v a/Makefile
zavede nová proměnná BASE_PATH
:
ifndef BASE_PATH BASE_PATH = . endifPotom je třeba změnit pravidlo
distr
:
distr: make -f $(BASE_PATH)/distrib/Makefile allV
a/amd/Makefile
se potom na začátek přidá nahoru definice:
BASE_PATH = ..
Tiskni
Sdílej:
ISSN 1214-1267, (c) 1999-2007 Stickfish s.r.o.