англійськафранцузькаіспанська

Ad


Значок OnWorks

makepp_functions - онлайн у хмарі

Запустіть makepp_functions у постачальника безкоштовного хостингу OnWorks через Ubuntu Online, Fedora Online, онлайн-емулятор Windows або онлайн-емулятор MAC OS

Це команда makepp_functions, яку можна запустити в постачальнику безкоштовного хостингу OnWorks за допомогою однієї з наших численних безкоштовних робочих станцій, таких як Ubuntu Online, Fedora Online, онлайн-емулятор Windows або онлайн-емулятор MAC OS.

ПРОГРАМА:

ІМ'Я


makepp_functions -- Функції в makepp

ОПИС


A: абсолютна_ім'я файлу,
абсолютне_ім'я_файлу_непосилання,
абспат,
addprefix,
додавання суфікса,
і, B: базова назва, C: дзвоніть, D: реж.,
dir_noslash, E: помилка, F: filesubst,
фільтр,
відфільтрувати,
filter_out_dirs,
файл пошуку,
find_first_upwards,
програма пошуку,
рядок пошуку,
знайти_вгору,
перший_доступний,
перше слово,
для кожного, I: якщо,
якщо правда,
infer_linker,
об'єкти висновку,
інформація, J: приєднатися, M: зробити,
Makemap,
makeperl,
карта,
"mktemp", N: notdir, O: only_generated,
тільки_нецілі,
only_phony_targets,
only_stale,
only_targets,
або,
походження, P: patsubst,
perl,
фальшивий,
попередньо побудувати,
друк, R: реальний шлях,
відносне_ім'я файлу,
щодо, S: оболонка,
сортувати,
смуга,
subst,
суфікс, T: тимчасовий, W: увага,
символ підстановки,
слово,
список слів,
слова, X: ксарг

Будь-який вираз формату "$(name)", де "name" не є ім'ям змінної, або
"$(ім'я arg1 arg2 arg3)" інтерпретується як виклик функції. Ім'я може містити літери,
символи підкреслення або дефіси; щоб уникнути плутанини, ви можете використовувати дефіси або підкреслення
взаємозамінні, оскільки внутрішні дефіси перетворюються на символи підкреслення. Оцінюючи таке
вираз просто викликає підпрограму Perl. Якщо перед "ім'ю" стоїть "&", він запускає
вбудовану команду або сценарій з цим ім'ям у процесі makepp і повертає стандарт
вихід. Для цього потрібно створити perl для PerlIO. Якщо ім’я не називає функцію
він перетворюється на виклик виклику.

Як і у випадку зі змінними, у вас є вибір: "$(name ...)" або "${name ...}". Якщо ти хочеш
вставити ту саму дужку, вона повинна бути парною, інша не має значення: "$(назва
...(){..." або "${name ...{}(...}". (Однак для map і perl перша закриваюча дужка закінчується
вираз.) Подвоєння дозволяє аргументам охоплювати кілька рядків. Новий рядок є
потім розглядається як пробіли, за винятком, можливо, в "define". Існує також синтаксис "$[name ...]"
або $[[name ...]], який оцінюється під час читання make-файлу, перш ніж правила grokking
та інші конструкції.

Makepp має ряд вбудованих функцій, які можуть бути корисними. Він підтримує майже всі
Текстові функції GNU make (докладніше дивіться в документації GNU make) та деякі з них
власний. Ви можете визначити підпрограми Perl, щоб робити все, що вам подобається. Дивіться заяву про "суб".
і розділ про розширення makepp для більш детальної інформації.

умовний Функції
та умова1[,умова2[,умова3...]]
Функція та забезпечує операцію "коротке замикання" І. Кожен аргумент є
розширено, по порядку. Якщо аргумент розгортається до порожнього рядка, обробка зупиняється і
результатом розширення є порожній рядок. Якщо всі аргументи розширюються до не-
порожній рядок, то результатом розширення є розширення останнього аргументу.

if струна, результат-якщо-рядок-не-пустий[, результат-якщо-рядок-порожній]
якщо правда струна, результат-якщо-рядок-істина[, результат-якщо-рядок-false]
Альтернатива висловлюванням «ifeq» тощо. Якщо рядок не порожній (тобто
умова істинна), повертається другий аргумент (речення "then") (після
змінне розширення); якщо рядок порожній, третій аргумент (пропозиція "else") є
повернувся.

Наприклад,

CFLAGS := $(якщо $(фільтр gcc egcc, $(CC)), -g -Стіна, -g)

визначає CFLAGS як "-g -Wall", якщо змінна CC є або "gcc" або "egcc", і "-g"
інакше. (Це те, що роблять правила збірки за замовчуванням.)

"iftrue" схожий на "if", за винятком того, що рядок 0 розглядається як порожній.

or умова1[,умова2[,умова3...]]
Функція або забезпечує операцію "короткого замикання" АБО. Кожен аргумент розгортається,
в порядку. Якщо аргумент розгортається до непустого рядка, обробка припиняється, і
результатом розширення є цей рядок. Якщо після розгортання всіх аргументів, усі з
вони хибні (порожні), то результатом розширення є порожній рядок.

філе та ім'я файлу Функції
абсолютне ім'я_файлу файли
абстрагуватися файли
Перетворює відносні імена файлів в абсолютні без . or .., Наприклад,
"$(absolute_filename xyz.c)" може повернути "/usr/src/our_project/subdir/xyz.c".

абсолютне_ім'я_файлу_непосилання файли
реальний шлях файли
Як і абсолютне_ім’я файлу, але гарантує, що символічні посилання будуть розв’язані.

базове ім'я імена файлів
Основне ім’я – це повне ім’я файлу (з каталогом) за вирахуванням тексту після і
включаючи останній період. Наприклад, "$(basename myfile/version-1.0-module.c)" - це
"мій файл/модуль версії 1.0"

реж імена файлів
Витягує частину каталогу кожного файлу в списку імен файлів, включаючи кінцеву частину
косою рискою. Повертає "./", якщо в імені файлу немає каталогу.

dir_noslash ім'я файлу
Те саме, що і "$(dir )", за винятком того, що він не повертає кінцеву косу риску.

filesubst малюнок, заміна, слова
Виконайте заміну шаблону для імен файлів. Це відрізняється від patsubst тим
він буде працювати правильно, якщо дано альтернативні імена каталогів (доки
вони передують знаку відсотка). Наприклад,

$(filesubst ./src/%.c, %.o, $(підстановка src/*.c))

працюватиме з filesubst, але не з patsubst.

filter_out_dirs імена файлів
Повертає всі імена файлів, які не посилаються на каталоги.

файл пошуку ім'я файлу, шлях
Знаходить файл за вказаним шляхом або у змінній середовища PATH, якщо нічого немає
вказано. Це може бути корисно для пошуку двійкових файлів або включаючих файлів. Наприклад,

TCL_INCLUDE := -I$(dir_noslash $(знайти файл tcl.h, \
/usr/local/stow/tcl-8.4.5-nothread/include \
/usr/include/tcl8.4 /usr/include/tcl \
/net/na1/tcl8.4a3/include /net/na1/tcl8.4a3/include))

Це шукає файл tcl.h шляхом пошуку в усіх вищезазначених каталогах. Абсолютний
повертається шлях до файлу. Потім "$(dir_noslash)" витягує цей каталог і його
поміщається в шлях включення.

find_program ім'я
Поверніть першу програму зі списку, яку можна знайти в PATH. Це корисно
коли є кілька еквівалентних програм, які можна використовувати, а ви просто хочете
виберіть одну з них. Наприклад, ось визначення за замовчуванням для кількох поширених
змінні, які надає makepp, якщо ви не помістили їх у свій make-файл:

CC = $(find_program gcc egcc pgcc c89 cc) # і більше, залежно від машини
F77 = $(find_program f77 g77 fort77)
CXX = $(find_program g++ c++ pg++ cxx CC aCC)

Якщо жодної з програм не знайдено, "$(find_program)" повертає рядок not-found, і
реєструє те, що не було знайдено. Зазвичай це не призведе до функціонального make-файлу, але він
буде мати тенденцію покращувати повідомлення про помилки. Наприклад, якщо ви робите щось подібне
це:

%.o : %.c
$(CC) $(входи) -o $(виходи)

і makepp не може знайти компілятор C у списку вище, він замінить not-found.
Інакше оболонка спробує виконати вихідний файл і виникне помилка
повідомлення може бути дуже дивним.

знайти_вгору ім'я файлу
Шукає файл із заданою назвою в каталозі ., .., ../ .., ../../..І т.д.
доки файл не буде знайдено, або не буде досягнуто кореневий каталог, або не буде знайдений каталог
в іншій файловій системі. (Ця остання вимога полягає в запобіганні проблем з
автоматичне монтування або підвішені мережеві файлові системи.) Якщо у вас є a RootMakeppфайл, тобто також
бар'єр, який заважає шукати вище.

Наприклад, якщо у вас є проект із багатьма рівнями підкаталогів, ви можете
включити цей загальний фрагмент до всіх make-файлів (наприклад, за допомогою "include"
заява):

TOP_LEVEL_INCLUDE_DIR := $(включає find_upwards)
# Шукає каталог, який містить файл
# включає підкаталог.

%.o : %.c
$(CC) $(CFLAGS) -I$(TOP_LEVEL_INCLUDE_DIR) -c $(вхід) -o $(вихід)

Інша проблема, яку "find_upwards" може допомогти вирішити, - це знайти каталог верхнього рівня
споруди. Часто корисно визначити змінну таким чином:

ТОП := ../../..

якщо у вас є важлива інформація, розташована лише в каталозі верхнього рівня. Але
це важко підтримувати, оскільки кількість «..» різна для різних рівнів
дерева каталогів. Замість цього ви можете використовувати "find_upwards", щоб знайти файл, який є
відомо, що він присутній лише в каталозі верхнього рівня. Припустимо, наприклад, що
файл «ЛІЦЕНЗІЯ» знаходиться тільки в каталозі верхнього рівня. Тоді ви можете зробити це:

TOP := $(dir_noslash $(find_upwards ЛІЦЕНЗІЯ))

"$(find_upwards LICENSE)" повертає повний шлях до файлу ліцензії;
"$(dir_noslash ...)" видаляє назву файлу, повертаючи лише каталог.

(Зверніть увагу, що оператор "include" автоматично шукає файли вгору, тому там
не потрібно робити щось подібне:

включити $(find_upwards top_level_rules.mk)

Натомість ви можете просто зробити

включити top_level_rules.mk

і це буде працювати так само добре.)

Якщо файл не знайдено, "find_upwards" перерве збірку з повідомленням про помилку.

Якщо ви вкажете більше одного файлу, find_upwards шукатиме перший
другий і так далі. Іншими словами,

$(find_upwards файл1 файл2)

еквівалентна

$(fild_upwards file1) $(find_upwards file2)

Якщо ви хочете шукати будь-який із файлів, замість цього використовуйте «find_first_upwards».

знайти_першим_вгору file1 file2 ...
Ця функція веде себе як "find_upwards", за винятком того, що вона повертає перший файл будь-якого
файлів у списку, який він знайде. Зокрема, він перевіряє поточний каталог
будь-який із файлів у списку, і повертає перший файл, який існує або може бути створений.
Якщо жоден із файлів не існує або не може бути вбудований у цей каталог, він перевіряє .., То
../ .., і т. д., поки не досягне кореневого каталогу або каталогу, який є
розташовані в іншій файловій системі.

перший_доступний file1 file2 ...
Поверніть перший файл у списку, який існує або може бути створений. Це може бути корисно для
адаптація ваших make-файлів для роботи на кількох різних машинах або мережах, де
важливі файли можуть бути розташовані в різних місцях. Наприклад, ось рядок з
один з моїх make-файлів:

TCL_LIB = $(перший_доступний \
/usr/local/stow/tcl-8.4.5-nothread/lib/libtcl8.4.so \
/usr/lib/libtcl8.4.so /usr/lib/libtcl.so \
/net/na1/tcl8.4a3/lib/libtcl8.4.a \
/net/na1/tcl8.4a3/lib/libtcl8.4.sl)

Цей рядок перевірить наявність бібліотеки Tcl у всіх перерахованих вище місцях, зупиняючись на
перший, який він знайде. Потім команда link включає $(TCL_LIB), тому ми отримуємо
відповідна бібліотека Tcl.

infer_linker file1 file2 ...
Отримавши список об’єктних файлів, спочатку створіть їх, якщо їх ще не було. Тоді знайдіть
чи залежать вони від джерела Fortran, C++ чи C і повертають відповідне
компілятор (який краще знає, як зв'язати, ніж "ld").

об'єкти_виведення file1 file2 ..., модель
$(infer_objects object1.o object2.o, *.o)

Якщо ви використовуєте стандартні угоди щодо імен заголовних файлів, makepp здатний
здогадатися, які файли ".o" або ".lo" потрібно зв'язати з вашою програмою. Я використовую це для
виберіть файли з каталогу бібліотеки, який містить модулі, що використовуються в багатьох різних
програми. Замість того, щоб створити файл бібліотеки ".a" і запропонувати компоновщику вибрати файл
відповідні модулі, makepp може вибрати для вас відповідні модулі. Тільки цим шляхом
відповідні модулі збираються.

Алгоритм Макеппа для визначення залежностей об’єктів залежить від конвенції, що
Реалізація всіх класів або функцій, визначених у файлі заголовка "xyz.h".
скомпільовано в об’єктний файл під назвою «xyz.o» (або «xyz.lo»). Отже, алгоритм makepp для
Висновок залежностей об’єктів починається з одного або кількох об’єктів, які, як ми знаємо, повинні бути
підключено до програми. Він перевіряє, які файли були включені з "#include".
ці джерела, і намагається знайти відповідні об’єктні файли для кожного з включених
файли.

"$(infer_objects)" потрібно згадати в списку залежностей програми, наприклад
це:

myprog: $(infer_objects main.o other_object.o, \
**/*.o /other/library/dirs/**/*.o)
$(CXX) $(входи) -o $(вихід) $(LIBS)

Функція "$(infer_objects)" приймає два аргументи (відокремлені комою, як показано).
Перший – це один або кілька об’єктних файлів, які, як відомо, потрібні (підстановкові знаки
тут допустимо). Другий - це список можливих об'єктів (зазвичай ви використовуєте a
підстановочний знак тут), який можна приєднати, якщо необхідно. Повертається значення з цього
функція - це список, який містить спочатку всі об'єкти в першому аргументі і
потім після них усі додаткові об'єкти, які містилися в другому аргументі
які потрібні об’єктам у першому аргументі.

Наприклад, припустимо, що "main.o" походить від "main.cpp", який включає "my_class.h".
"$(infer_objects)" шукає файли з назвою "my_class.o". Якщо саме один такий
файл знайдено, він додається до списку. (Якщо знайдено два об’єктних файли «my_class.o».
у різних каталогах друкується попередження.) "infer_objects" також
перевіряє "my_class.cpp", щоб побачити, що він містить і які додаткові об'єктні файли
мається на увазі.

mktemp
mktemp префікс
mktemp префіксXXX
mktemp /
Повертає непередбачуване тимчасове ім’я файлу, яке наразі не існує. Без назви
вказівка ​​на один і той же файл повертається двічі, навіть з різними відносними шляхами,
протягом одного запуску makepp (крім, можливо, традиційного рекурсивного make, або якщо Perl
код, що виконується в межах дії правила, що викликається "f_mktemp"). В кінці makepp запустіть все
файли, повернуті цією функцією, видаляються, якщо вони існують (знову ж таки, крім тих
повертається цією функцією в коді Perl, що виконується в межах правила).

Будь-яка кількість символів верхнього регістру «X» у кінці аргументу замінюється такою кількістю
випадкові літери та цифри. Чим більше їх, тим менше ймовірність зіткнення
з іншими процесами, тож якщо ви дасте префікс типу "/tmp/abc.", вам має бути достатньо
"X". Якщо існує більше одного X, перший символ походить із ідентифікатора процесу. Якщо
їх немає, ніби їх було десять, що нібито достатньо (8.4e17
можливості або 3.7e15 для Windows). Якщо аргументу немає, префікс за замовчуванням має значення
"tmp." в поточному каталозі.

Зауважте, що ви не хочете давати таке ім’я як цілі правила та залежності. The
результат буде правильним, але він буде відтворюватися щоразу, коли ви запускаєте makepp.

Крім того, оскільки це завжди різне, ви повинні використовувати це в дії правила, лише якщо ви використовуєте
":build_check ignore_action":

TMPFILE ;= $(mktemp) # 1 виклик; "=" означатиме 3 виклики: 3 файли
A-count B-count: :build_check ignore_action
product-As-and-Bs >$(TMPFILE)
&grep -c /A/ $(TMPFILE) -o A-count
&grep -c /B/ $(TMPFILE) -o B-count

Або вам слід експортувати його та дозволити Shell оцінити його:

експорт TMPFILE ;= $(mktemp)
А-рахунок Б-рахунок:
product-As-and-Bs >$$TMPFILE # makepp не бачить значення var
fgrep -c A $$TMPFILE >A-count
fgrep -c B $$TMPFILE >B-count

Остання форма повторює попереднє повернуто значення, тому ви можете використовувати його в шаблонному правилі:

%.x: %.y
&grep foo $(вхід) -o $(mktemp)
&sed bar $(mktemp /) -o $(output) # Оперувати з виводом &grep

notdir імена файлів
Повертає частину імен файлів, що не є каталогом, тобто все після останнього
косу риску, якщо вона є, або ціле ім’я файлу в іншому випадку.

only_generated імена файлів
Повертає лише ті імена файлів у списку, які були згенеровані makepp, а не з тих пір
змінено відповідно до інформаційного файлу збірки.

Ця функція корисна для чистих цільових правил (хоча, звичайно, «makeppclean» є
бажаний варіант):

$(фальшивий чистий):
&rm -f $(лише_генеровано **/*)

тільки_нецілі імена файлів
Повертає лише ті імена файлів у списку, які не є цілями жодного правила (або
явні або шаблонні правила). Ви можете вказати символ підстановки (див. "$(wildcard )"
функція для отримання додаткової інформації про шаблони підстановки makepp). Це можна використовувати для створення a
ціль розповсюдження, наприклад:

.PHONY: розповсюдження

розподіл:
&mkdir our_product-$(VERSION)
&cp $(filter-out %~, $(only_notargets *)) our_product-$(VERSION)
tar cf - our_product-$(VERSION) | gzip -9c > наш_продукт-$(VERSION).tar.gz

У цьому випадку "$(only_notargets *)" повертає кожен файл у поточному каталозі
це не є метою якогось правила. "$(filter_out %~, ...)" видаляє редактор
резервні копії.

Подібно до "only_targets" (див. вище), "only_notargets" знає лише про цілі, які
вже визначені. Це лише проблема, якщо ви використовуєте його для визначення змінних
із призначенням ":="; якщо ви використовуєте його в списку залежностей або в тілі a
правило, усі інші правила вже побачили.

only_stale імена файлів
Повертає лише ті імена файлів у списку, які були згенеровані makepp, а не з тих пір
змінені відповідно до інформаційного файлу збірки, але більше не є об’єктами жодного правила.

Ця функція корисна для забезпечення відсутності залежностей від таких файлів,
без форсування чистої збірки всіх цілей:

$(фальшивий флеш):
&rm -f $(тільки_застарілий **/*)

Насправді, мабуть, краще замість цього написати сценарій, який викликає makepp для створення
список застарілих файлів, а потім попросіть цей сценарій видалити всі перераховані файли
наразі не під контролем джерела, на випадок, якщо згенерований файл стане джерелом
файл. Makepp не має такої вбудованої функції, тому що makepp є (і ймовірно
має залишатися) агностиком щодо контролю джерел.

only_targets імена файлів
Повертає лише ті назви файлів у списку, які насправді є об’єктами певного правила
(або явні, або шаблонні правила). Ви можете вказати символи підстановки (включаючи makepp's
спеціальний символ підстановки "**") в іменах файлів. (Див. функцію "$(wildcard )", щоб дізнатися більше
деталі. Це можна використовувати для чистої цілі, наприклад:

.PHONY: чистий

чисто:
&rm -f $(only_targets *)

Тепер, якщо ви введете «makepp clean», він видалить все, що вміє створювати. Але
не створюйте чисту мету, замість цього використовуйте "makeppclean"!

Інше місце, де це може бути корисно, — уникати включення несвіжого .o файли у вашій
будувати. Наприклад, якщо ви створюєте бібліотеку так:

mylib.a: *.o
&rm -f $(вихід)
$(AR) cr $(вихід) $(входи)

а потім ви видаляєте деякі вихідні файли, але забуваєте видалити відповідні .o файли,
.o файли все ще будуть. Це означає, що вони все одно будуть включені
бібліотеку, незважаючи на те, що вони більше не корисні. Якщо ви модифікуєте свій
правило таке:

mylib.a: $(only_targets *.o)
&rm -f $(вихід)
$(AR) cr $(вихід) $(входи)

тоді цієї проблеми не виникне.

Зауважте, що це стосується лише файлів, які, як відомо, є цільовими at час ви
викликати «тільки цілі». Якщо "only_targets" з'являється у залежностях або діях a
правило, тоді всі можливі цілі будуть відомі, оскільки залежності та дії не є
оцінюється, поки правило не буде виконано. Однак, якщо ви оцінюєте, спробуйте оцінити це
раніше у make-файлі зі змінною ":=", наприклад:

ALL_TARGETS := $(only_targets *)

target1: залежність1
дії

target2: залежність2
дії

тоді "only_targets" не знатиме про наступні правила.

Аналогічно, "only_targets" не знає про цілі, створені в make-файлах
завантажений рекурсивним make. (Але ви все одно не повинні використовувати рекурсивний make; використовуйте
використовуйте оператор load_makefile або замість нього неявне завантаження make-файлу.)

відносне_ім'я файлу file1 file2 файл3[, коса частина]
Повертає назви цих файлів відносно поточного каталогу (той
makefile знаходиться в). Це також можна використовувати для очищення від непотрібного «./» та іншого сміття
Шлях:

DIR := .
СУБДІР := ..
FNAME := $(DIR)/../otherdir/$(SUBDIR)/файли
X := $(відносне_ім'я файлу $(FNAME))

If слеш true (зазвичай 1) повернуті імена файлів гарантовано містять косу риску
шляхом додавання "./", якщо необхідно, щоб ви могли використовувати його як ім'я виконуваного файлу без
турбуватися про те, що шлях пошуку команди перевизначає розташування каталогу.

Якщо шлях проходить через кореневий каталог, батьківський або ваш домашній каталог або
"$(ROOT)" вашої системи збірки або в Windows кореневий диск диска (залежно від
навколишнього середовища, це також відбувається для /cygdrive/c or /c), абсолютний шлях буде
натомість повернувся.

щодо file1 file2 файл3[, каталог]
Повертає назви цих файлів відносно вказаного каталогу. Це
зазвичай корисно, коли з будь-якої причини вам потрібно виконати команду з a
інший каталог (поточний каталог за замовчуванням):

source_backup.tar:
cd .. && tar cf $(відносно_до $(виведення), ..) $(відносно_до ., ..)

Суфікс імена...
Витягує суфікс кожного імені файлу в іменах. Якщо ім’я файлу містить крапку,
суфікс — це все, що починається з останньої крапки. В іншому випадку суфіксом є the
порожній рядок. Це часто означає, що результат буде порожнім, якщо назви немає,
і якщо назва містить кілька імен файлів, результат може містити менше імен файлів.

Наприклад,

$(суфікс src/foo.c src-1.0/bar.c хаки)

видає результат ".c .c".

тимчасовий слова
Повідомте makepp, що вказані цілі можуть бути видалені за допомогою правила, яке генерує
їх. Подібно до "фальшивого", за винятком того, що makepp очікує, що справжній файл з таким ім'ям
на волю може вплинути правило. Правило не виконується, якщо воно є тимчасовим
цілі застаріли.

шаблон модель
Повертає відсортовані імена всіх існуючих файлів, які відповідають заданому шаблону
файли, які ще не існують, але можуть бути створені на основі правил, які знає makepp
приблизно в той момент, коли він оцінює вираз. У цьому останньому пункті він відрізняється
із підстановочних знаків введення правил, які застосовуються навіть до файлів, створених за правилами, знайденими пізніше.

Makepp підтримує всі звичайні символи підстановки оболонки ("*", "?" і "[]"). Він також має a
символ "**", який відповідає будь-якій кількості проміжних каталогів. (Ця ідея була
вкрадено з zsh.) Наприклад, "**/*.c" відповідає всім .c файлів у всьому джерелі
дерево. "objects/**/*.o" відповідає всім .o файли, що містяться в будь-якому місці
підкаталог об'єкти або будь-який з його підкаталогів або будь-який з їх підкаталогів. The
"**" підстановка не буде переходити за програмними посиланнями на каталоги на будь-якому рівні, як і не буде
спробуйте ввести каталоги, які існують, але не можуть бути прочитані. Також файли і
каталоги, які існують, але не можуть бути прочитані, не повертатимуться "$(wildcard)".

рядок Функції
addprefix префікс, слова
Передує рядок префікса до кожного зі слів. Це в основному для GNU make
сумісність; Використовуючи розширення в стилі rc, це можна зробити більш зручним для читання
подобається це:

МОДУЛИ := abcd
X_OLD_STYLE := $(addprefix $(OBJDIR)/, $(addsuffix .o, $(MODULES)))
X_NEW_STYLE := $(OBJDIR)/$(MODULES).o # Хіба це не легше читати?

додавання суфікса суфікс, слова
Додає суфіксний рядок до кожного зі слів. Це переважно для GNU make
сумісність; Використовуючи розширення в стилі rc, це можна зробити більш зручним для читання
подобається це:

X_OLD_STYLE := $(addsuffix .o, $(MODULES))
X_NEW_STYLE := $(МОДУЛИ).o

call змінна[, слова]...
Функція «виклик» унікальна тим, що її можна використовувати для розгляду змінна як
параметризована функція. Ви можете призначити складний вираз змінна І використовувати
"виклик", щоб розширити його вміст до різних значень, параметризованих за допомогою слова в подальшому. в
інші системи make, змінна, яка використовується в основному з метою розширення за допомогою
«дзвінок», називається a макрос.

Під час розширення макросу тимчасові змінні $1, $2, "..." зверніться до
аргументи, наведені для «дзвінка» під час його виклику. Змінна $0 буде розширено до
ім'я макросу (тобто змінна) цей "дзвінок" зараз розширюється.

Немає обмежень, зі скількома аргументами можна «викликати» макрос або зі скількома
параметри, які може очікувати макрос. Якщо ви передасте більше аргументів, щоб "виклик" як макрос
потреба, усі аргументи, що перевищують значення, будуть відхилені. Якщо ви передаєте менше аргументів, ніж a
макрос очікує, усі перевищені параметри згортаються в порожній рядок.

Спочатку простий приклад:

відпочинок = $(список 2, $(слова $(1)),$(1))
список = ABCDE
butfirst := $(відпочинок виклику,$(список))

Тут змінна "$(butfirst)" міститиме список "BCDE".

А тепер більш складний приклад, щоб показати, що можливо:

відпочинок = $(список 2,$(слова $(1)),${1})
mymap = $(якщо $2,$(виклик $1,$(перше слово $2)) $(виклик $0,$1,$(виклик решта,$2)))
downcase = ${makeperl lc("$1")}

UCWORDS = ВСІ ЦІ СЛОВА В РЕГІСТРІ
DCWORDS := $(виклик mymap,downcase,$(UCWORDS))

Тепер "$(DCWORDS)" містить "всі ці слова є великими літерами". До речі: ні
різниця, чи ми отримуємо доступ до аргументів через $1, "${1}" or "$(1)" всередині макросу.

Ви можете безпосередньо використовувати змінну, як ніби це функція, якщо її немає
функція цієї назви. Це внутрішньо перетворюється на «дзвінок», отже
еквівалент:

обговорення = $0 перетворився на $1 $2.
прямий = $(обговорення, аргумент)
call = $(обговорення виклику, аргумент, аргумент)

Може здатися спірним, чи має "$[call]" також розширювати "$[]" макросу
вирази, або чи повинна функція завжди робити те саме, незалежно від того, як це відбувається
називається. Останнє було обрано, тому що при нормальному синтаксисі make це було б
неможливо отримати "$[1], $[2]..." у змінну (вони не будуть замінені нічим,
перед тим, як присвоєння навіть відбудеться.) Отже, якщо у вас є макрос для визначення a
правило, ви хочете, щоб вирази на кшталт "$(output)" відображалися під час аналізу правила
ви повинні захистити їх від «дзвінків»:

дайте визначення myrule
$2: $1
моя команда $$(вхід) -o $$(вихід)
endef
$[myrule myinput,myoutput]

фільтрувати візерунки, слова
Повертає всі слова зі списку, які відповідають шаблонам. Візерунки можуть бути просто іншими
слова або символи підстановки назв файлів (тобто "*", "?" і "[az]" розпізнаються), або вони можуть
мають символ "%", що означає відповідність будь-якому рядку в цій точці (так само, як "*").

відфільтрувати візерунки, слова
Повертає всі слова зі списку, які не відповідають шаблонам. Візерунки можуть бути просто
інші слова або символи підстановки назв файлів (тобто "*", "?" і "[az]" розпізнаються), або
вони можуть мати символ "%", що означає відповідність будь-якому рядку в цій точці (так само, як
"*").

Наприклад:

libproduction.a: $(filter_out test_*, $(підстановка *.o))

покладе все .o файли, які існують або можуть бути створені, за винятком тих, які починаються з тест_,
в libproduction.a.

рядок пошуку знайти, in
Повернення знаходити, якщо це підрядок in.

перше слово слова
Поверніть перше слово.

карта слова, perlcode
makemap слова, perlcode
Аналогічно карті Perl, застосовується perlcode до кожного слова по черзі і повертає
результати. Перший варіант є простим кодом Perl, тоді як другий варіант спочатку проходить
perlcode через розширення змінної в стилі Make. Слова розширені в обох
випадків.

Слова знаходяться в $_ і повертаються, якщо ви не скасуєте $_. Це призначено для
модифікації, які не легко обробляються "patsubst". Тільки перша кома є роздільником,
будь-які інші вважаються частиною perlcode.

# Переключіть слова. Подвійні дужки, щоб дозволити дужки в perlcode, або використовуйте ${}:
X = $((карта $(VALUES), s/(.+)-(.+)/$2-$1/))
# Ви можете використовувати вирази make, але тоді ви повинні використовувати $$ для Perl $:
Y = $(makemap $(VALUES), tr/$(OLDCHARS)/$(NEWCHARS)/ або $$_ = 'не вдалося')
# Ви можете усунути кандидатів:
Y = $(карта $(VALUES), undef $_ якщо /no_good/)

приєднатися слова1, слова2
Виконайте попарне з’єднання першого та другого слів.

пацубст малюнок, заміна, слова
Виконує заміну кожного слова у списку слів. Символ "%" відповідає будь-якому
рядок. Це найкраще проілюструвати на прикладі:

OBJS = $(patsubst %.c, object_dir/%.o, $(C_SOURCES))

приймає кожен файл у C_SOURCES і повертає ім’я об’єктного файлу в object_dir.
Іноді більш стисло використовувати посилання на заміну, наприклад, вищезазначене може
були написані як

OBJS = $(C_SOURCES:%.c=object_dir/%.o)

сортувати word1 word2 word3 ...
Сортує слова в лексичному порядку та видаляє повторювані слова.

роздягнутися рядок
Видаляє початкові та кінцеві пробіли з рядка та замінює кожен внутрішній
послідовність одного або кількох пробілів з одним пробілом. Таким чином, "$(strip ab
c )» призводить до «abc».

SUBST від,до,текст
Виконує текстову заміну тексту: замінюється кожне входження from
від до. Результат замінюється на виклик функції. Наприклад,

$(subst ee,EE,ноги на вулиці)

замінює рядок "fEEt on the strEEt".

слово n, текст
Повертає nго слово текст. Законні цінності n почніть з 1 на початку
або назад від -1 в кінці. Якщо n більше, ніж кількість слів у текст,
значення порожнє.

список слів список індексів, слова
список слів перший індекс, останній індекс, слова
У першій формі ви надаєте список індексів (рахуючи від 1 на початку або
назад від -1 в кінці), щоб вибрати потрібні слова. У другій формі ти
вкажіть діапазон слів, які ви хочете повернути.

слова текст
Повертає кількість слів у текст.

Різне Функції
для кожного var, список, текст
Перші два аргументи, було та список, розгортаються до виконання будь-яких інших завдань; Примітка
що останній аргумент, текст, не розгортається одночасно. Потім для кожного слова
розгорнутого значення list, змінна, названа розгорнутим значенням var встановлюється в
це слово, а текст розгортається. Імовірно, текст містить посилання на цю змінну,
тому його розширення кожного разу буде різним.

Цей простий приклад встановлює змінну файли до списку всіх файлів у
каталогів у списку диски:

каталоги := abcd
файли := $(foreach dir,$(dirs),$(підстановка $(dir)/*))

Тут текст "$(підстановка $(dir)/*)". Перше повторення знаходить значення "a" для dir,
тому він дає той самий результат, що й "$(підстановка a/*)"; виробляє друге повторення
результат "$(підстановка b/*)"; і третій, "$(підстановка c/*)".

Цей приклад має той самий результат (за винятком налаштування "dirs"), що й наступний приклад:

файли := $(підстановка a/* b/* c/* d/*)

Якщо текст складний, ви можете покращити його читабельність, давши йому ім’я з символом
додаткова змінна:

find_files = $(підстановка $(dir)/*)
каталоги := abcd
файли := $(foreach dir,$(dirs),$(find_files))

Тут ми використовуємо змінну find_files таким чином. Ми використовуємо звичайне "=" для визначення a
рекурсивно розширювана змінна, щоб її значення містило фактичний виклик функції
бути повторно розгорнутим під контролем foreach; просто розгорнута змінна не підійде,
оскільки символ підстановки буде викликаний лише один раз під час визначення find_files.

Примітка: не плутайте це зі спеціальною змінною "$(foreach)".

інформація текст
попередження текст
помилка текст
Вивести текст, який повертає нічого. Перший йде на STDOUT, другий на STDERR,
третій додатково припиняє обробку.

попередньо побудувати цілі
зробити цілі
Повертає аргумент дослівно, але спочатку створює всі перераховані файли. Це корисно
коли даний файл потрібен під час оцінки виразу make. Зазвичай таке трапляється
коли у вас є збірка, де набір залучених файлів обчислюється деякою оболонкою
команди. Наприклад,

список_файлів:
# команди оболонки для обчислення списку файлів для розміщення в програмі

my_program : $(&cat $(prebuild file_list))

Якщо вам потрібен список у кількох правилах, було б ефективніше використовувати an
розгорнути щонайбільше один раз змінну:

file_list ;= $(&cat $(prebuild file_list))

my_program1 : ao $(file_list)

my_program2 : bo $(file_list)

Якщо замість цього ви вказали просто "$(&cat file_list)", makepp не буде примусово
file_list, щоб бути оновленим, перш ніж він виконає команду оболонки. Використання "$(prebuild )"
це найкращий спосіб вирішити цю проблему. У вас може виникнути спокуса спробувати інші речі, наприклад
це:

my_program : file_list $(&cat file_list)

але це не спрацює, оскільки "$(&cat file_list)" оцінюється до того, як makepp спробує це зробити
побудувати "file_list".

only_phony_targets Імена
Повертає лише ті імена в списку, які є фальшивими цілями деякого правила (або
явні або шаблонні правила). Ви можете вказати символи підстановки (включаючи спец. makepp
символ підстановки, "**") в іменах файлів. (Див. функцію "$(wildcard )" для отримання додаткової інформації.
Це можна використовувати для групування цілей, наприклад:

$(фальшиві тести): $(only_phony_targets */**/тести)

походження змінна
Враховуючи назву змінної, вказує, звідки походить її значення.

Perl perlcode
makeperl perlcode
Оцінює perlcode у блоці та повертає результат. Перший варіант — звичайний Perl
коду, тоді як другий варіант спочатку передає perlcode через змінну стилю Make
розширення.

Зауважте, що, як і для всіх функцій, використовуваний роздільник функцій може не відображатися
perlcode за межами одинарних або подвійних лапок. Але ви можете подвоїти його, як в
останній приклад:

VAR = 1
VAR1 = ${perl ($VAR + 1) * 3}
VAR2 = $(perl do { $VAR *= 3; повертає $VAR + 1 }, якщо $VAR)
VAR3 = $(makeperl $(VAR1) * 3 + $$VAR) # один Make var і один Perl var
VAR = $((perl if( ... ) { ... }))

фальшивий слова
Вказує, що список слів насправді є фальшивими цілями, і повертає список
цілі. Він призначений для використання таким чином:

$(фальшиве все): my_program

$(фальшивий чистий):
&rm -f *.o моя_програма

Ви також можете оголосити одну або кілька цілей фальшивими за допомогою такого рядка в будь-якому місці
ваш make-файл:

.PHONY: все чисто

друк текст
Виводить текст і повертає його. Це в основному корисно для налагодження, коли ви цього не робите
зрозуміти, чому заміна змінної має такий результат. Наприклад,

XYZ := $(друк $(patsubst %.c, %o, $(SOURCE_FILES)))

роздрукує результат виклику "patsubst".

XYZ := $(patsubst %.c, %o, $(друк $(SOURCE_FILES)))

виведе останній аргумент виклику "patsubst".

оболонка оболонка-команда
Повертає результат даної команди оболонки із заміною нового рядка на пробіли.

Зауважте, що, як і для всіх функцій, використовуваний роздільник функцій може не відображатися
команду оболонки за межами одинарних або подвійних лапок. Але можна подвоїти
як у другому прикладі:

дата = $(дата оболонки) # краще: $(perl скаляр за місцевим часом)
VAR = ${{shell f() { echo hello; }; f}}

ксарг команда, аргументи[,суфікс[,довжина]]
Повертає розділений новим рядком список команд, кожна з яких починається з вказаного
команду та закінчуйте якомога більшою кількістю елементів списку, не переходячи
(за замовчуванням 1000) символів.

Мета цього – уникнути перевищення обмеження довжини команд у вашій системі.
Наприклад, якщо є багато згенерованих файлів, то вам, напевно, потрібен ваш
чистої мети (якої у вас не повинно бути, оскільки "makeppclean" ефективніший).
виглядати приблизно так:

$(фальшивий чистий):
$(xargs $(RM), $(only_targets **/*))

Це також має побічний ефект: у списку не генерується жодна команда
буває порожнім. Але в цьому випадку було б краще використовувати вбудований &rm,
оскільки аргументи вбудованих команд обмежені лише пам'яттю Perl:

$(фальшивий чистий):
&rm -f $(only_targets **/*)

Якщо вказано третій аргумент, то він використовується для постфіксації кожної команди. Це
корисно для визначення перенаправників, наприклад (хоча тут знову &echo допоможе):

проявляється:
&rm -f $@
&торкніться $@
$(xargs echo, $(only_notargets **/*), >> $@)

Частина цієї документації заснована на документації GNU make.

Зверніть увагу, що якщо функція викликається під час ініціалізації make-файлу, наприклад
розширення експортних змінних, повідомлення про помилку або попередження повідомлятимуть рядок номер 0.

Використовуйте makepp_functions онлайн за допомогою служб onworks.net


Безкоштовні сервери та робочі станції

Завантажте програми для Windows і Linux

Команди Linux

Ad