8-900-374-94-44
[email protected]
Slide Image
Меню

Makefile wildcard: Using Makefile Wildcards — Earthly Blog

GNU Make — Wildcard Examples Подстановочные знаки можно использовать в рецепте правила, где они расширяются оболочкой.


Подстановочный знак функции Если вы хотите использовать подстановочный знак в таких местах, вам нужно использовать подстановочную функцию, например: $(шаблон подстановочного знака …) Эта строка, используемая в любом месте make-файла, заменяется списком, разделенным пробелами имен существующих файлов, которые соответствуют одному из заданных шаблонов имен файлов.

Использование подстановочных знаков в make-файле заключается в перечислении всех исходных файлов с определенным расширением. Например: program_C_SRCS:=$(*.c) // В этой переменной program_C_SRCS будут все файлы с расширением «.c».

Звездочка (*) и вопросительный знак (?) используются в качестве подстановочных знаков, как в MS-DOS и Windows. Звездочка соответствует любой последовательности символов, тогда как вопросительный знак соответствует любому одиночному символу.


Подстановочные знаки можно использовать в рецепте правила,где они расширяются оболочкой.Например,вот правило для удаления всех файлов объектов:

clean:
        rm -f *.o

Подстановочные знаки также полезны в предварительных условиях правила.Со следующим правилом в makefile,’make print‘ напечатает все ‘.c‘ файлы, которые изменились с момента последней печати:

print: *.c
        lpr -p $?
        touch print

Это правило используетprintкак пустой целевой файл; см. Пустые целевые файлы для записи событий . (Автоматическая переменная ‘$?‘ используется для печати только тех файлов, которые изменились; см. Автоматические переменные .)

Расширение подстановочных знаков не происходит,когда вы определяете переменную.Таким образом,если вы напишете следующее:

objects = *.o

тогда значение переменных objects является фактической строкой ‘*.o‘. Однако, если вы используете значение

objects в цели или предпосылке, там будет происходить расширение подстановочных знаков. Если вы используете значение objects в рецепте, оболочка может выполнять расширение подстановочных знаков при запуске рецепта. Чтобы установить objects для расширения, вместо этого используйте:

objects := $(wildcard *.o)

См . Функцию подстановочного знака .



GNU Make 4.4
  • Переменные делают Makefiles более простым

    В нашем примере нам пришлось дважды перечислить все объектные файлы для редактирования (повторяется здесь): Такое дублирование чревато ошибками; если новый объектный файл добавлен в

  • Передача переменных в подмакет

    Значения переменных make верхнего уровня могут быть переданы вложенному make через среду явным запросом.

  • Подстановочный знак функции

    Расширение подстановочных знаков происходит автоматически в правилах.

  • Подводные камни при использовании подстановочных знаков

    Теперь вот пример наивного способа использования подстановочного знака, который не соответствует вашим намерениям.

  • 1
  • 157
  • 158
  • 159
  • 160
  • 161
  • 163
  • Next

Что означает подстановочный знак в make-файле?

спросил

10 лет, 10 месяцев назад

Изменено 7 лет, 11 месяцев назад

Просмотрено 43к раз

Я нашел следующие строки в учебнике по make-файлу, но у меня возникли проблемы с жирными линиями.

В 1 строку, если написать

 программа_C_SRCS:=$(*.c)
 

не работает. Так что, пожалуйста, скажи мне, что подстановочное слово здесь. Это слово относится только к make-файлу?

В туториале написано, что вторая строка будет выполнять тестовую подстановку. Может ли кто-нибудь сказать мне что-нибудь об этой замене текста?

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

ссылка на учебник

 CC:=g++
имя_программы:=мояпрограмма
**program_C_SRCS:=$(подстановочный знак *.c)** # 1 строка
program_CXX_SRCS:=$(подстановочный знак *.cc)
**program_C_OBJ:=$(program_C_SRCS:.c=.o)** # 2 строка
программа_CXX_OBJ:=$(program_CXX_SRCS:.c=.o)
программа_OBJ:= $(программа_C_OBJ) $(программа_CXX_OBJ)
 
  • make-файл

1

Предположим, у вас есть два исходных файла. foo.c и bar.c .

 program_C_SRCS:=$(шаблон *. c) # 1 строка
 

Функция подстановочного знака — это создание синтаксиса. Переменная program_C_SRCS теперь будет иметь значение foo.c bar.c (возможно, не в таком порядке).

 program_C_OBJ:=$(program_C_SRCS:.c=.o) # 2 строка
 

Это ссылка на замену. Он преобразует текст, заменяя одну подстроку другой. Переменная program_C_OBJ теперь имеет значение foo.o bar.o

.

Использование подстановочных знаков в файле make позволяет вывести список всех исходных файлов с определенным расширением. Например:

 program_C_SRCS:=$(*.c) // В этой переменной program_C_SRCS будут все файлы с расширением ".c".
 

Предположим, вы хотите преобразовать файлы .c в .o файлов, может быть полезен следующий синтаксис:

 program_C_OBJS:=$(patsubst %.c,%.o,$(подстановочный знак *.c))
 

Зарегистрируйтесь или войдите в систему

Зарегистрируйтесь с помощью Google

Зарегистрироваться через Facebook

Зарегистрируйтесь, используя электронную почту и пароль

Опубликовать как гость

Электронная почта

Требуется, но никогда не отображается

Опубликовать как гость

Электронная почта

Требуется, но не отображается

makefile — Создать: подстановочный знак для использования всех объектных файлов

спросил

Изменено 5 лет, 1 месяц назад

Просмотрено 2к раз

У меня есть Makefile, который выглядит так:

 CC=cc
CFLAGS=-g -std=c99 -Wfatal-ошибки
OBJS=$(подстановочный знак *. o)
все: main.o cmdargs.o io.o
    $(CC) -o приложение $(OBJS)
основной.о: основной.с
    $(CC) -c main.c $(CFLAGS)
cmdargs.o: cmdargs.c
    $(CC) -c cmdargs.c $(CFLAGS)
ио.о: ио.с
    $(CC) -c io.c $(CFLAGS)
чистый:
    @rm -rf приложение $(OBJS)
 

Всякий раз, когда я запускаю , делаю все после очистки, появляется сообщение об ошибке

куб.см -о

неопределенная ссылка на `main’

Но когда я запускаю его во второй раз, все работает как положено. Что не так со скриптом и как это исправить?

  • makefile

Предыдущие респонденты дали хорошие ответы, но не полные. Так что позвольте мне опубликовать один тоже.

Прежде всего, это плохая идея использовать подстановочный знак в make-файлах. Гораздо лучше не лениться и явно указывать свои файлы.

Если вы должны быть ленивы, способ использовать подстановочный знак , как пишет Шонкори, использовать его для источников.

Также нет рецепта фальшивых целей типа all . В вашем примере рецепт для все будут работать всегда, что неэффективно.

 CC := gcc
SRCS := $(подстановочный знак *.c)
ОБЪЕКТЫ := $(SRCS:c=o)
.PHONY: все чисто
все: приложение
приложение: $(OBJS) Makefile
    $(CC) -o $@ $(OBJS)
$(OBJS): %.o: %.c Makefile
    $(CC) -c $< $(CFLAGS)
чистый:
    @rm -rf приложение $(OBJS)
 

Вы можете автоматически создавать имена файлов объектов, если внимательно относитесь к включению всех исходных файлов.

 # --------------------------------------
# перечислить все исходные файлы
CPP_SOURCES := $(подстановочный знак *.cpp)
C_SOURCES := $(подстановочный знак *.c)
# другие исходные файлы здесь
# объединить все источники
ИСТОЧНИКИ := $(CPP_SOURCES) $(C_SOURCES)
# --------------------------------------
# список всех объектных файлов
CPP_OBJECTS:= $(CPP_SOURCES:.cpp=.o)
C_OBJECTS := $(C_SOURCES:.c=.o)
# другие объектные файлы здесь
# объединить все объекты
ОБЪЕКТЫ: = $(CPP_OBJECTS) $(C_OBJECTS)
все:
    эхо $(ИСТОЧНИКИ)
    эхо $(ОБЪЕКТЫ)
 

PS : Более компактный файл makefile:

 # список всех исходных файлов
ИСТОЧНИКИ := $(подстановочный знак *. cpp) $(подстановочный знак *.c)
# определить все объектные файлы
ОБЪЕКТЫ := $(добавить суффикс .o, $(базовое имя $(не каталог $(ИСТОЧНИКИ))))
все:
    эхо $(ИСТОЧНИКИ)
    эхо $(ОБЪЕКТЫ)
 

Заявление

 OBJS=$(подстановочный знак *.o)
 

собирает все *.o файлы в настоящее время в файловой системе, но ничего не знает о каких-либо объектных файлах, которые могут быть созданы в будущем.

Когда вы запускаете make в первый раз, вокруг нет файлов .o , поэтому переменная OBJS будет пустой строкой, и последняя команда связывания не будет передана в команду, которая сообщит об этом какие объектные файлы использовать. Но все остальные шаги компиляции тем не менее выполняются. При втором вызове make пропустит этапы компиляции, потому что объектные файлы уже есть, но поскольку компоновка не удалась и окончательный двоичный файл отсутствует, он выполнит этот шаг, который теперь что-то произведет, потому что были файлы для собирать по подстановочному знаку.

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *