Я обновляю заголовок и содержание, чтобы прояснить, что этот конкретный вопрос задавал то, что я не видел, отвечал явно в другом месте. Ключевым понятием является понимание того, что нечто, похожее на одну цель, делающую несколько вещей в Makefile, на самом деле является множеством целей, выполняющих одну вещь.
Я также удалю некоторые посторонние материалы, поскольку они оказались неактуальными.
Исходный контент
Моя проблема в том, что у меня есть Makefile, который (очевидно) неправильно вызывает один из моих подкаталогов Makefile. У меня есть такая структура проекта:
quendor
src
cheap
cheap_init.c
Makefile
zmachine
main.c
Makefile
Makefile
Makefile в корневом каталоге проекта будет ссылаться на Makefile в отдельных каталогах. Вот этот основной Makefile:
CC ?= gcc
CFLAGS += -Wall -std=c99
CFLAGS += -D_POSIX_C_SOURCE=200809L
CFLAGS += -O2 -fomit-frame-pointer
RANLIB ?= $(shell which ranlib)
AR ?= $(shell which ar)
export CC
export AR
export CFLAGS
export RANLIB
SRC_DIR = src
ZMACHINE_DIR = $(SRC_DIR)/zmachine
ZMACHINE_LIB = $(ZMACHINE_DIR)/quendor_zmachine.a
CHEAP_DIR = $(SRC_DIR)/cheap
CHEAP_LIB = $(CHEAP_DIR)/quendor_cheap.a
SUB_DIRS = $(ZMACHINE_DIR) $(CHEAP_DIR)
SUB_CLEAN = $(SUB_DIRS:%=%-clean)
$(SUB_DIRS):
@echo $(SUB_DIRS) # src/zmachine src/cheap
@echo "DIR:"
@echo $@ # src/zmachine
$(MAKE) -C $@
$(SUB_CLEAN):
-$(MAKE) -C $(@:%-clean=%) clean
clean: $(SUB_CLEAN)
help:
@echo "Quendor"
.PHONY: $(SUB_DIRS) $(SUB_CLEAN) clean help
Ключевой проблемой для меня является этот бит из приведенного выше:
$(SUB_DIRS):
@echo $(SUB_DIRS) # src/zmachine src/cheap
@echo "DIR:"
@echo $@ # src/zmachine
$(MAKE) -C $@
Я вставил операторы echo
только для того, чтобы показать, что происходит. Обратите внимание, что $SUB_DIRS
правильно показывает оба каталога, но когда запускается Makefile, он показывает только src/zmachine
. (Комментарии там указывают, что я вижу во время выполнения.) Makefile (по-видимому) не обрабатывает src/cheap
.
Полный вывод запуска Makefile таков (первые три строки - мои эхо-операторы):
src/zmachine src/cheap
DIR:
src/zmachine
/Applications/Xcode.app/Contents/Developer/usr/bin/make -C src/zmachine
cc -Wall -std=c99 -D_POSIX_C_SOURCE=200809L -O2 -fomit-frame-pointer -fPIC -fpic -o main.o -c main.c
ar rc quendor_zmachine.a main.o
/usr/bin/ranlib quendor_zmachine.a
** Done with Quendor Z-Machine.
Первоначально я мог думать только о том, что, возможно, после запуска вспомогательного make-файла в src/zmachine
, процесс Make либо выдает ошибку, либо думает, что это было сделано. Но я бы подумал, что часть $ (SUB_DIRS) должна была бы проходить по обоим каталогам.
Так что я немного застрял в том, как действовать.
Дополнительное примечание: Часть "я бы подумал" в том, что я сказал, была ошибочной. $ (SUB_DIRS) не выполнялся так, как я думал; принятый ответ прояснил это.