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

Ad


Значок OnWorks

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

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

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

ПРОГРАМА:

ІМ'Я


makepp_incompatibilities -- Несумісність між makepp та GNU make

ОПИС


Makepp був розроблений так, щоб бути максимально наближеним до GNU make
(<http://www.gnu.org/software/make/manual/make.html>). Автоінструменти GNU
(<http://www.gnu.org/software/automake/manual/automake.html>), CMake
(<http://www.cmake.org/>), премак (http://industriousone.com/premake> і див. зауваження
нижче) або застарілі системи збірки ручної роботи можна зібрати за допомогою makepp. Це так
Ви можете легко перенести проекти. Або якщо ви не хочете насолоджуватися всім
переваги makepp (наприклад, щоб інші могли створювати ваш проект за допомогою GNU make), а ви
отримати вигоду від переваги надійності для вашого розвитку.

Однак через різницю у філософії деякі з GNU make або POSIX make
(<http://pubs.opengroup.org/onlinepubs/009695399/utilities/make.html>) функцій не може бути
підтримується. Деякі з них не були реалізовані, тому що ми не встигли. Більшість з
Відмінності від GNU make досить технічні і лише рідко викликають проблеми. На жаль
обхідні шляхи для недоліків традиційного виробництва стають все складнішими,
і дають makepp важкі часи.

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

makepp --no-warn makepp_simple_concatenation=1 makepp_percent_subdirs=1 \
--build-check=target_newer --last-chance-rules --no-remake-makefiles

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

--traditional-recursive-make

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

Примус більше POSIX or GNU зробити сумісність


Ось деякі можливості командного рядка, щоб запустити роботу багатьох застарілих систем збірки
без модифікації. Вони змушують makepp точно емулювати поведінку GNU make.

Сумісність через опції: "--build-check=target_newer"
За замовчуванням makepp намагатиметься відновити всі цілі, якщо є якісь із залежностей
змінився з моменту останньої збірки, або якщо команда змінилася (див. makepp_build_check for
деталі). Зазвичай це те, чого ви хочете. Іноді, однак, ви не хочете, щоб ціль
бути перебудованим, якщо він був змінений, крім керування makepp (наприклад, шляхом редагування
або запустивши програму вручну, щоб створити файл). Ви можете змусити makepp використовувати
традиційний алгоритм make, який перебудовується лише в тому випадку, якщо будь-яка з цілей новіша
залежностей, додавши цю опцію до командного рядка.

Сумісність через опції: "--dont-build=config.status"
Існують пакунки, які намагаються автоматично налаштувати себе або виконувати інші дії, які gmake
ігнорує, якщо його не попросять, наприклад:

config.status : налаштувати
./config.status --перевірте

конфігурувати: configure.in aclocal.m4
автоконф

У більшості людей навіть не встановлено «autoconf», тому вони сумлінно все роблять
правила, як це робить makepp, не вдасться. Цей параметр запобігає цьому, якщо ви зрозумієте, що
не будувати.

Сумісність через опції: "--правила-останнього шансу"
Правила за замовчуванням (шаблонні правила без залежностей від шаблонів) зазвичай не підтримуються.
Makepp створює екземпляри всіх правил на основі наявних файлів, щоб він був у курсі кожного
файл, який можна створити. На жаль, таким чином він не знає, як створити екземпляр шаблону
правило без залежності від шаблону. Механізм :last_chance частково виправляє це.
Якщо цього достатньо для застарілих make-файлів, цей параметр дозволяє ввімкнути його глобально.

Сумісність через опції: "--ні-попереджати"
Це не покращує результат. Makepp видаватиме попереджувальні повідомлення для багатьох речей
що традиційний Unix приймає, не здригаючись. Це тому, що є
кращі способи зробити це за допомогою makepp. Якщо ці попередження вас дратують, ви можете їх вимкнути
за допомогою цієї опції.

Сумісність через опції: "--hybrid-recursive-make"
Рекурсивні виклики make часто вважаються небезпечною практикою (див. «Краще
система для ієрархічних побудов» у makepp для деталей), але вони надзвичайно поширені в
існуючі make-файли. Makepp підтримує рекурсивний make для зворотної сумісності; для нових
makefiles, набагато краще використовувати оператор load_makefile або неявний makepp
механізм завантаження make-файлу.

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

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

ціль: залежності
$(MAKE) -f цілі other_makefile

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

Примітка. Технічне завантаження кількох make-файлів не буде проблемою, але вони зазвичай є
ті самі фальшиві імена цілей. Залишити це окремо означатиме повну переробку makepp
внутрішні органи. Однак це спрацює, але це не еквівалентно:

ціль: залежності
підкаталог компакт-диска && $(MAKE) -f цілі other_makefile

Сумісність через опції: "--traditional-recursive-make"
Іноді попереднього варіанту недостатньо, особливо якщо використовуються рекурсивні виклики
суперечливі варіанти. Makepp використовує лише один набір глобальних параметрів, тому submake — ні
дозволено змінювати їх, оскільки це також стосуватиметься інших make-файлів.

Додавання цієї опції до командного рядка має такі небажані побічні ефекти:

· Рекурсивні make не виконуються внутрішньо паралельно, навіть якщо це робить батьківський.
На відміну від gmake, немає загальної координації кількості процесів. Це буде
не буде реалізовано, оскільки такий спосіб роботи не є метою дизайну makepp.

· Рекурсивні процеси make нічого не знають про репозиторії.

· Кожен рекурсивний процес створення створює свій власний файл журналу, у каталозі він викликається
замість створення одного файлу журналу для всієї збірки.

· Оскільки makepp зазвичай створює більше, ніж традиційний make вважає необхідним, і оскільки багато
Системи побудови забезпечують рекурсивні виклики в усіх напрямках, це може призвести до нескінченності
рекурсія. Makepp потягне гальмо після 50 раундів і підкаже, як збільшити
це, якщо у вас дійсно є таке глибоке вкладення.

Навіть із параметром "--traditional-recursive-make" змінні середовища
"MAKEOVERRIDES" і "MFLAGS" не налаштовані та ігноруються, тому make-файли, які залежать від
ті не працюватимуть.

A Премаке генерується Makefile є лише смішною обгорткою для виклику суб-make у тому самому
каталог. Якщо у вас є якісь цілі проекту XYZ він матиме рядок, як

@${MAKE} --no-print-directory -C . -f XYZ.зробити

У цьому випадку ви можете уникнути параметра "--traditional-recursive-make", безпосередньо викликавши його
makepp з цим "-f XYZ.make" варіант.

Сумісність без опції: "--jobs=n"
Застарілі make-файли іноді не перераховують усіх залежностей, покладаючись на порядок
виконання, щоб зробити їх вчасно. У цій ситуації makepp може встигнути викликати правило раніше
всі його залежності створені. Тоді результати можуть бути кращими з меншою кількістю або навіть ні
паралельне виконання.

Сумісність через змінна: "makepp_simple_concatenation=1"
Підстановка в стилі Rc — це стандартний спосіб, яким makepp виконує підстановку змінних у тексті
рядки, тому що він дуже рідко порушує застарілі файли make-файлів і часто корисний у нових
make-файли. Однак це вносить випадкові несумісності в заміні
змінні, не оточені пробілами. Наприклад,

INCLUDE_PREFIX := -I/some/include/dir -I
ВКЛЮЧИТЬ := $(INCLUDE_PREFIX)/other/include/dir

встановить "INCLUDES" на "-I/some/include/dir/other/include/dir -I/other/include/dir", якщо rc-
підміна стилів увімкнена, тоді як GNU make встановить її на
"-I/some/include/dir -I/other/include/dir". Наприклад, під час компіляції Redis 2.6.5 він намагається
запустити «printfgcc». Така кумедна конкатенація двох команд є вагомою ознакою цього
ця змінна потрібна для повернення, щоб створити семантику.

Також існує несумісність в обробці пробілів у змінній:

нуль :=
T := -o $(null) # T містить -o, за яким слідує один пробіл.
OUTFILE = вихідний файл $(T).

встановить "OUTFILE" на "-ooutfile", якщо ввімкнено заміну в стилі rc, тоді як GNU робить
встановив би для нього значення "-o outfile".

Обидві ці несумісності усуваються шляхом встановлення "makepp_simple_concatenation"
змінний. Однак зауважте, що навіть із «makepp_simple_concatenation», makepp все одно
трактує пробіли несумісно в деяких ситуаціях:

T := -o # Не видаляти цей коментар.

GNU встановлює "T", щоб містити "-o", за яким слідує пробіл, тоді як makepp видаляє
в будь-якому випадку задній простір. Якщо вам потрібен кінцевий простір, його потрібно встановити
"makepp_simple_concatenation", а також встановіть "T", використовуючи техніку з використанням манекена
змінна, наприклад "null", як показано вище.

обхідний шлях варіант "--no-remake-makefiles"
Типовий відкритий код вимагає виклику «configure» для створення make-файлів. Але потім ці
make-файли можуть містити правила для перероблення make-файлу шляхом виклику певної команди. Makepp буде
з радістю дотримуйтесь і оновлюйте його відповідно до правил. Але іноді це шкідливо, тому
просто пропустіть це.

Сумісність через змінна: "makepp_percent_subdirs=1"
За замовчуванням "%" у шаблонному правилі не відповідає каталогам. Це означає, що правило як
це:

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

не буде застосовано до таких файлів, як "../shared/xyz.c". Якщо ви хочете, щоб він збігав файли в
підкаталоги також, а потім встановіть змінну "makepp_percent_subdirs=1" у командному рядку
або біля початку make-файлу.

Сумісність через навколишнє середовище змінна: $MAKEPP_IGNORE_OPTS
Іноді застарілі рекурсивні виклики передають параметри, які makepp не розуміє.
Сподіваюся, цей параметр не важливий, але він заважає makepp працювати. З цим
змінної середовища ви можете попросити makepp мовчки ігнорувати певні параметри. Значення
має бути розділений пробілами список опцій, який може бути в 4 варіантах:

--довго=x
Довгий варіант, який очікує суперечки. Цей факт необхідно оголосити через рівних
Знак, хоча фактичне використання також може бути розділене пробілами, або "--long=bla" або
"--довго бла".

--довго
Довгий варіант без аргументів.

-sx Короткий варіант, який очікує аргумент. Цей факт необхідно оголосити шляхом додавання
щось безпосередньо після параметра, хоча фактичне використання також може бути розділене за допомогою
пробіли, «-sbla» або «-s bla».

-s Короткий варіант без аргументів.

Наприклад, замінити параметр makepp -R на один без аргументу та прийняти налагодження gmake
варіант з аргументом:

експорт MAKEPP_IGNORE_OPTS='-R --debug=x'

Несумісність Що вимагати Makefile зміни


· Make-файли, які явно викликають make, не дозволяють makepp створювати все самостійно.
На жаль, власний "ExtUtils::MakeMaker" Perl фіксує другу з наступних двох форм
ця помилка до версії 6.56 (Perl 5.12.1):

підкаталог:
підкаталог компакт-диска; зробити

ЗРОБИТИ = зробити

· Встановлення змінної "VPATH" на якесь значення неявно викликає "vpath % значення". "vpath"
оператори емулюються за допомогою механізму сховища. Отже, де замінює gmake
шлях до файлу, знайдений у vpath, makepp натомість символічно пов’язує його
де це потрібно. Таким чином makepp надасть незмінений рядок, що зазвичай є
не проблема.

Цілі в vpath не підтримуються. (Gmake розглядає їх, якщо вони новіші ніж
їхні залежності, але якщо ні, ціль буде відтворена в поточному каталозі
-- досить непослідовно.) Скасування vpaths не підтримується.

· Правило шаблону, наявне пізніше у make-файлі, замінює те, що було присутнє раніше.
Це назад від GNU make.

· Набір вбудованих неявних правил дещо відрізняється від правил для GNU make,
хоча імена змінних значною мірою сумісні. Вбудовані правила повинні
успішно компілювати програми C/C++/Fortran, і насправді, можливо, зможете вгадати
у деяких випадках також відповідні бібліотеки. Підтримка Modula-2 і RatFor та інших рідкісних
мови свідомо немає, тому що я постійно стикався з проблемами з GNU
правила make, коли я випадково повторно використав розширення для цих мов.

· Префікс дії «+» безшумно ігнорується.

· Члени архіву не підтримуються, а також пов'язані автоматичні змінні
$%, "$(%D)" і "$(%F)".

· Немає підтримки SCCS.

· Початковий і кінцевий пробіли в присвоюваннях змінних ігноруються (навіть якщо
за пробілом слід коментар). Щоб дізнатися більше про обробку пробілів
несумісності, див. «Пробіл у змінних» у makepp_variables.

· Makepp не намагається відновити файли, включені в оператор «include», якщо тільки
make-файл містить правило для їх побудови до того, як буде видно оператор include.
(Однак він спробує відновити сам make-файл.) Зазвичай це використовується для
обробка включати залежності файлів, і не настільки корисна з makepp, оскільки ви цього не робите
все одно потрібно це зробити.

· Змінна "SHELL" наразі частково ігнорується. Makepp завжди використовує / Бен / ш
якщо не /usr/xpg4/bin/sh or /sbin/xpg4/sh знайдено або якщо ви не експортуєте "SHELL"
змінної у вашому make-файлі. Але якщо ви це зробите, синтаксичний аналізатор команд може не повністю
зрозуміти, що робить ваша команда оболонки. У Windows Strawberry або ActiveState Perl
замість цього ви повинні встановити змінну SHELL перед тим виклик makepp.

· Залежності будь-чого від Makefile все ще працюють, але зазвичай не потрібні.
Зазвичай це використовується для примусової перебудови при зміні параметрів компіляції. Макепп знає
коли команди збірки змінилися без нічого особливого в make-файлі; воно зберігає
це на основі файл за файлом. Якщо ви зміните make-файл, він точно знає, який
файли потребують перекомпіляції.

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

· Єдина спеціальна ціль, яка підтримується, це ".PHONY" і частково ".SUFFIXES". The
решта просто вживаються.

Зокрема, GNU make має такі спеціальні цілі:

.СУФІКСИ
Makepp ігнорує ".SUFFIXES", за винятком особливого випадку ".SUFFIXES" з номером
залежності, наприклад:

.СУФІКСИ:

який повідомляє йому не завантажувати жодне зі своїх правил за замовчуванням.

.СЕРЕДНІЙ, .ВТОРИННИЙ, .ДОРОЖНИЙ
Проміжним файлам не надається особливий статус, тому ці цілі не мають
значущим.

.ігнорувати
Ця ціль ігнорується. Якщо ви хочете ігнорувати помилки, введіть слово "ignore_error"
(або знак мінус) перед командою, статус виходу якої слід ігнорувати.

.ТИХІ
Ця ціль ігнорується. Якщо ви хочете, щоб команди не лунали, введіть слово "noecho"
(або символ "@") перед командою, яка не повинна повторюватися,
або скористайтеся опцією "--silent", щоб makepp.

.DELETE_ON_ERROR
.EXPORT_ALL_VARIABLES
.NOEXPORT
.POSIX
.ЗАЛОЖЕННЯ
Ці цілі не підтримуються і просто ігноруються.

· Функції GNU make "eval", "flavor" і "value" наразі не підтримуються. ти
можна досягти того самого, що й eval, більш простим способом за допомогою "$[...]"
змінна або розширення функції.

· Правила подвійної двокрапки підтримуються не повністю. (Вони не можуть бути: у парадигмі Макеппа,
не може бути більше одного способу оновлення цілі.) Зараз кожен послідовний
Правило подвійної двокрапки для даної цілі просто додає її командний рядок і залежність
list до командного рядка та списку залежностей для цієї цілі. Наприклад, якщо ви
напиши це:

а :: б
&cat b -oa

# Пізніше у вашому make-файлі:
a :: c
&cat c -o >>a

Це є точно те саме, якби ти написав

а : до н.е
&cat b -oa
&cat c -o >>a

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

· Функція "$(wildcard )" відповідає не лише існуючим файлам, а й файлам, які
ще не існують, але які мають правило, яке makepp бачив у той час
Оцінюється функція "$(wildcard )".

· Оператор «define» підтримується, але обробка «@» перед ним виконується
по-різному. На даний момент у makepp «@» перед змінною, яка має багаторядковий рядок
значення лише придушить відлуння першого рядка. Наприклад,

визначити ехо-лінії
&echo line1 -o $@
&ехо рядок2 -o>>$@
endef

x:
@$(ехо-лінії)

не пригнічує друк "&echo line2", як це робиться в GNU make; це буде тільки
придушити друк "&echo line1".

· Makepp не підтримує наступні змінні середовища (він не встановлює їх,
і він їх просто ігнорує):

ЗАСОБИ
MFLAGS

Несумісність in порядок of вираз розширення
· У makepp дії правила розширюються до того, як будуть гарантовані всі залежності
були побудовані. Ви можете обійти це, змінивши такі правила:

foo: бар
genfoo < $(shell cat bar)

до цього:

foo: бар
genfoo < `cat bar`

або це, що зробить файл під час розширення:

foo: бар
genfoo < $(&cat $(make bar))

Тут краще, оскільки файл, зазначений у бар це також залежність від цього
правило, і makepp тепер може вловити його під час лексичного аналізу переспрямування.

· Хоча я не бачив, щоб це використовувалося, GNU make дозволяє наступне:

двокрапка =:
a$(двокрапка) b
луна $^

Makepp розгортає "$(двокрапка)" занадто пізно, щоб це спрацювало. Однак він пропонує
альтернативний синтаксис "$[двокрапка]", який може зробити набагато більше, ніж GNU, тому що він є
розширився дуже рано.

"$(ЗРОБИТИ)" може включати пробіли
У видаленому makepp або якщо платформа, здається, не підтримує запуск сценарію Perl
за магічним числом або з "--traditional-recursive-make" ця змінна буде включати щонайменше
один простір. Це не проблема при використанні його як команди. Але при передачі його як
параметр без лапок для сценарію (як це робить система збірки Perl 5.14.0), він розірве його
розділити на окремі параметри, що призводить до плутанини. Тому як параметр це безпечніше
процитуйте його як "$(MAKE)". що не порушує зворотну сумісність.

Цільові Призначення НЕ розповсюджувати
Цільові змінні Makepp дещо відрізняються від змінних GNU make тим, що вони
застосовувати лише до правила для одного згаданого файлу, а не до будь-якого з його попередників; побачити
Конкретні завдання.

Круглі дужки or фігурні дужки НЕ гніздо
Makepp закінчує вирази на першій відповідній дужці або дужці. Замість цього

$(somefunction ... ( ) ...) # Стиль створення GNU

ви повинні використовувати будь-яке з них

${somefunction ... ( ) ...} # GNU робить сумісним
$((somefunction ... ( ) ...)) # Розширення Makepp

Це, ймовірно, буде виправлено у версії 2.1, можливо, за бажанням.

Незначний точок
Залежності шаблонів не відповідають фальшивим цілям
%.a: %.b; ...
$(фальшивий xb): ; ... # не надає способу побудови xa

Коментарі не мають рядків продовження
# Це \
НЕ коментар у 2 рядки

Command лінія несумісності


Makepp підтримує кілька корисніших параметрів командного рядка make. Однак наступне
не підтримуються:

-d або --debug
-f -
Внутрішні об'єкти makefile Makepp пов'язані з файлами, тому він не може обробляти
stdin.

-i
-l або --load-everage або --max-load
-m Параметр "-m" Makepp пов'язаний з вибором методу підпису, тоді як GNU make
ігнорує -м.

-p або --print-data-base
-q або --question
-R або --без вбудованих змінних
Опція Makepp "-R" насправді робить щось зовсім інше.

-S --не продовжувати або --зупинитися
Опція "--stop" зупиняє (переводить у режим сну) makepp після вивчення всіх правил, тому ви
можна продовжити редагування.

-t або --touch
-w або --print-каталог
Це відбувається автоматично.

--warn-undefined-variables

Деякі з них можна легко підтримати, якщо комусь це цікаво.

Змінна несумісності


Makepp шукає в $PATH відповідну команду, щоб повернути такі змінні, як "$(CC)" або
"$(CXX)", тоді як GNU make має статичні значення за замовчуванням. Також makepp надає перевагу "gcc" і
"g++", тоді як GNU на диво повертає "cc" для першого, але те саме для
останнє. Ви можете змінити їх у файлі make-файлу, у командному рядку або експортуючи файл a
однойменна змінна перед викликом makepp.

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


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

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

Команди Linux

Ad