Как изменить список файлов зависимостей Makefile в зависимости от цели - PullRequest
0 голосов
/ 15 апреля 2020

Мой Makefile составляет список файлов, но я хотел бы добавлять новые файлы в зависимости от цели. Настоящий make-файл может быть найден здесь

https://github.com/fangq/mmc/blob/v1.7.9/src/Makefile#L4 https://github.com/fangq/mmc/blob/v1.7.9/commons/Makefile_common.mk#L192 -L194

, но для иллюстрации проблемы ниже приведен упрощенный фрагмент

OBJDIR=build
OBJSUFFIX=.o
BINARY=proj
FILES:=file1 file2

OBJS:= $(addprefix $(OBJDIR)/, $(FILES))
OBJS:= $(addsuffix $(OBJSUFFIX), $(OBJS))

opt: FILES+=file3   # append a file for a target
opt: OBJS:= $(addprefix $(OBJDIR)/, $(FILES))
opt: OBJS:= $(addsuffix $(OBJSUFFIX), $(OBJS))

##  Link  ##
all opt: $(BINARY)

##  Compile .c files  ##
$(OBJDIR)/%$(OBJSUFFIX): %.c
    @$(ECHO) Building $@
    $(CC) $(CCFLAGS) $(USERCCFLAGS) -I$(INCLUDEDIR) -o $@  $<

$(BINARY): $(OBJS)
    @$(ECHO) Building $@
    # link file1.o file2.o         when make
    # link file1.o file2.o file3.o when make opt

моя цель - при наборе make я хочу скомпилировать и связать file1.o/file2.o, но при наборе "make opt" я хочу, чтобы make-файл компилировал file1.o/file2.o и file3.o вместо.

но мой приведенный фрагмент не может этого добиться. Он может изменить только OBJS, но при компиляции пропускает file3.

Есть ли исправление для этого?

Ответы [ 2 ]

1 голос
/ 16 апреля 2020

Переменная MAKECMDGOALS содержит цели, заданные в командной строке, вы можете использовать это в условных выражениях перед всеми целями, чтобы условно установить переменные так, как вы хотите.

1 голос
/ 15 апреля 2020

Во-первых, вы никогда не объявляли, что opt зависит от $(OBJS) где-либо.

Но, что более важно, вы не можете использовать переменные c, специфичные для цели, для изменения предварительных условий. Значение целевых переменных c доступно только для в рецепте . См. документы , где это обсуждается во втором абзаце.

К счастью, вы просто делаете это сложнее, чем нужно. Вместо этого:

opt: FILES+=file3   # append a file for a target
opt: OBJS:= $(addprefix $(OBJDIR)/, $(FILES))
opt: OBJS:= $(addsuffix $(OBJSUFFIX), $(OBJS))

все, что вам нужно сделать, это написать:

opt: $(OBJS) $(OBJDIR)/file3$(OBJSUFFIX)
...