Portál AbcLinuxu, 8. prosince 2025 14:39
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 all
V 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.