Я учился создавать файлы make и понимать основной синтаксис.Используя несколько онлайн-руководств и руководств, я собрал рабочий файл, который мне больше всего понятен, однако одно целевое значение не дает мне понять, и я не могу найти руководство, которое использовал со строкой, подобной этой.Что меня смущает, так это то, что я не могу сказать, используется ли внутренний макрос, используемый для представления текущей цели $ @, в макросе замены?Это возможно?
Следующая строка вызывает у меня недоумение:
$(OBJ): $(@:=.o)
Чтобы добавить правильный контекст, я включаю мой make-файл.
# Include varialbes for make file acts like similar to the cpp directive
# (non standard to SUS)
include ../build/config.mk
# Define known suffixes
.SUFFIXES: .o .c
# Define include directory macro for header files
INCLUDE = -I../include
# Define source file macro list
SRC =\
base32.c\
base64.c\
change_file_own.c\
colorize-ls.c\
comma_list.c\
datetime.c\
defs.c\
error.c\
escape.c\
filebuffer.c\
fileinfo.c\
filestat.c\
format.c\
halt_getopt.c\
head_tail.c\
io.c\
line.c\
mv-rm.c\
numbers.c\
path.c\
perm.c\
printf_format.c\
progname.c\
signalinfo.c\
stack.c\
uuencode.c\
wrappers.c\
# move.c\
# Define object list to be everything in SRC macro with any instance
# of .c replaced with .o
OBJ = $(SRC:.c=.o)
# Define final product name
LIB = libutil.a
# Default target including $(LIB) (libutil.a) as a required component
all: $(LIB)
# ????
$(OBJ): $(@:=.o)
# SUFFIX rule to transform .c files to .o files
# Compile each precursor c file ($<) and output target object files ($@)
.c.o:
$(CC) $(CFLAGS) $(INCLUDES) -o $@ -c $<
# Target libutil with component object files
# Run archiver inserting newer than target component object files ($?)
# into and or creating the archive ($@)
$(LIB): $(OBJ)
$(AR) rcs $@ $?
# Clean up the object files
clean:
rm -f $(OBJ) $(LIB)
# define fake (non file) target names
# (also might be non-standard to SUS)
.PHONY:
all clean
Конфиг.Файл mk включает CFLAGS и правильные пути к архиватору и компилятору.