Несколько целей не выполняются Makefile - PullRequest
0 голосов
/ 19 января 2019

Я обновляю заголовок и содержание, чтобы прояснить, что этот конкретный вопрос задавал то, что я не видел, отвечал явно в другом месте. Ключевым понятием является понимание того, что нечто, похожее на одну цель, делающую несколько вещей в 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) не выполнялся так, как я думал; принятый ответ прояснил это.

1 Ответ

0 голосов
/ 19 января 2019

Способ make работает так: если вы не предоставите аргумент, он начнёт со сканирования Makefile в поисках «цели по умолчанию» .Целью по умолчанию является просто первая цель, с которой она сталкивается (обратите внимание, что это первая цель , а не цели ).

В вашем случае правило:

$(SUB_DIRS):
    $(MAKE) -C $@

Эквивалентно:

src/zmachine src/cheap:
    $(MAKE) -C $@

Что эквивалентно:

src/zmachine:
    $(MAKE) -C $@
src/cheap:
    $(MAKE) -C $@

Итак, первая цель при встречах - src/zmachine, и это ее цель по умолчанию итот, который обрабатывается.Способ исправить это, как сказал пользователь 657267 в комментариях, добавить одну цель, которая, как вы знаете, будет обработана первой, и у которой будут другие цели (которые вы действительно хотите построить) в качестве предварительных условий.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...