Можно ли использовать внутренние макросы makefile в макросах замены - PullRequest
0 голосов
/ 26 сентября 2018

Я учился создавать файлы 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 и правильные пути к архиватору и компилятору.

1 Ответ

0 голосов
/ 26 сентября 2018

В вашем $(OBJ): $(@:=.o) замена $(@:=.o) будет расширяться до нуля.

См. Руководство 10.5.3 Автоматические переменные

Очень важно, чтобы вы распознали ограниченную область, в которой доступны значения автоматических переменных: они имеют только значенияв рецепте.В частности, вы не можете использовать их где-либо в целевом списке правила;там они не имеют значения и будут расширяться до пустой строки.Кроме того, они не могут быть доступны непосредственно в списке обязательных правил.Распространенной ошибкой является попытка использовать $ @ в списке предварительных условий;Это не будет работать.Однако есть особенность GNU make - вторичное расширение (см. Secondary Expansion), которое позволяет использовать автоматические значения переменных в списках предварительных требований.

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