Выполнение действия над каждым исходным файлом с помощью make
Я создал Makefile, как это
CC = sdcc
SRCS = $(PNAME).c\
../../src/gpio.c
../../src/timers.c
../../src/i2c.c
$HDRS = -I../../headers
all:
mkdir -p ./output
$(CC) $(SRCS) -lstm8 -mstm8 $(HDRS)
Проблема в, sdcc
может компилировать только один источник за раз. Поэтому мне нужно выполнить что-то вроде foreach для каждого источника, который я определил в SRCS
переменная. Как это сделать в GNU-Make?
2 ответа
Согласно документации, вы должны скомпилировать файлы, отличные от того, который содержит main()
отдельно, чтобы произвести .rel
файлы, затем включите их в команду компиляции для основного файла. Есть несколько вариантов того, как вы можете это сделать. Следующее избегает функций, специфичных для GNU make:
# We're assuming POSIX conformance
.POSIX:
CC = sdcc
# In case you ever want a different name for the main source file
MAINSRC = $(PMAIN).c
# These are the sources that must be compiled to .rel files:
EXTRASRCS = \
../../src/gpio.c \
../../src/timers.c \
../../src/i2c.c
# The list of .rel files can be derived from the list of their source files
RELS = $(EXTRASRCS:.c=.rel)
INCLUDES = -I../../headers
CFLAGS = -mstm8
LIBS = -lstm8
# This just provides the conventional target name "all"; it is optional
# Note: I assume you set PNAME via some means not exhibited in your original file
all: $(PNAME)
# How to build the overall program
$(PNAME): $(MAINSRC) $(RELS)
$(CC) $(INCLUDES) $(CFLAGS) $(MAINSRC) $(RELS) $(LIBS)
# How to build any .rel file from its corresponding .c file
# GNU would have you use a pattern rule for this, but that's GNU-specific
.c.rel:
$(CC) -c $(INCLUDES) $(CFLAGS) $<
# Suffixes appearing in suffix rules we care about.
# Necessary because .rel is not one of the standard suffixes.
.SUFFIXES: .c .rel
Кстати, если вы посмотрите внимательно, то увидите, что файл явно не выполняет зацикливание исходных файлов или что-либо подобное. Он просто описывает, как построить каждую цель, включая промежуточные цели. make
самостоятельно выясняет, как объединить эти правила для перехода от источников к конечной программе (или к любой другой цели, которую вы укажете из числа тех, кого вы научили ее создавать).
Использование patsubst
, Обычно это что-то вроде:
SOURCES := $(wildcard *.c)
OBJECTS := $(patsubst %.c,%.o,${SOURCES})
prog: ${OBJECTS}
cc $^ -o $@
%.o: %.c
cc $< -c -o $@