انگلیسیفرانسویاسپانیایی

Ad


فاویکون OnWorks

makepp_rules - آنلاین در ابر

makepp_rules را در ارائه دهنده هاست رایگان OnWorks از طریق Ubuntu Online، Fedora Online، شبیه ساز آنلاین ویندوز یا شبیه ساز آنلاین MAC OS اجرا کنید.

این دستور makepp_rules است که می تواند در ارائه دهنده هاست رایگان OnWorks با استفاده از یکی از چندین ایستگاه کاری آنلاین رایگان ما مانند Ubuntu Online، Fedora Online، شبیه ساز آنلاین ویندوز یا شبیه ساز آنلاین MAC OS اجرا شود.

برنامه:

نام


makepp_rules -- چگونه به makepp بگوییم که چیزی بسازد

شرح


?: &,
-,
@, B: :build_cache,
:build_check، D: :ارسال، E: : env, I: "نادیده_اشتباه"،
:عبارتند از، L: :آخرین شانس، M: میپرل، N: "noecho", P: : تجزیه کننده،
"پرل"، S: :امضا

یک قانون چیزی است که به makepp می گوید که چگونه یک فایل یا دسته ای از فایل ها را بسازد. Makepp پشتیبانی می کند
همان نحو قوانین مانند سایر پیاده سازی های make، به علاوه برخی از اضافات خودش.

یک قانون دارای قالب کلی است

target_expression: dependency_expression [: آرگومان‌های اختیاری]
اقدامات

لیست اهداف ممکن است حاوی هیچ متغیر خودکار نباشد (به جز "$(foreach)"). در
لیست وابستگی ممکن است فقط شامل متغیرهای خودکار اشاره به هدف باشد (یعنی
"$(خروجی)"، "$(خروجی ها)"، یا مترادف آنها). عمل ممکن است شامل هر خودکار باشد
متغیرها

اگر makepp تصمیم بگیرد که قانون باید اجرا شود، هر خط از قانون اجرا می شود
به طور متوالی، و اگر هر یک وضعیت غیر صفر برگرداند، بقیه اجرا نمی شوند (و
makepp با یک خطا سقط می شود مگر اینکه گزینه "-k" را در خط فرمان مشخص کرده باشید.)
هر عمل باید فقط یک خط باشد. اگر عملی برای نوشتن راحت روی a خیلی طولانی باشد
تک خط، می توانید آن را به چند خط تقسیم کنید و یک بک اسلش قرار دهید تا نشان دهد که
چندین خط باید در یک خط ترکیب شوند.

برای تشخیص افعال از قانون بعدی، عمل باید بیشتر تورفتگی داشته باشد
از خط حاوی اهداف و وابستگی ها. بر خلاف دیگر پیاده سازی های
make, makepp واقعاً اهمیتی نمی دهد که چقدر آن را تورفتگی می کنید یا از کاراکترهای تب استفاده می کنید
به جای فضاها برای حفظ سازگاری با ساخت سنتی، قوانین
makepp برای تصمیم گیری زمانی که اقدامات به پایان می رسد و قانون بعدی شروع می شود تا حدودی پیچیده است:

· اولین خط عمل باید بیشتر از خط حاوی هدف تورفتگی داشته باشد.

· اگر یک خط با یک کاراکتر تب یا 8 فاصله یا بیشتر تورفتگی داشته باشد، در نظر گرفته می شود
یک خط عمل

· یک خط خالی یا یک خط نظر با کاراکتر "#" در حاشیه سمت راست به پایان می رسد
قانون، مگر اینکه خط غیر خالی بعدی بیش از 8 فاصله (یا بیش از یک) تورفتگی داشته باشد
برگه)

· اگر یک خط به اندازه یا بیشتر از اولین خط عمل تورفتگی داشته باشد، آنوقت است
یک خط اقدام اضافی در نظر گرفته شده است.

چند آیتم اقدام ویژه وجود دارد:

& این نماد باید با نام فرمان و هر تعداد آرگومان دنبال شود. پوسته
نحو در اینجا به طور کامل درک نمی شود، فقط نقل قول های تکی و دوگانه و بک اسلش هستند
شخصیت های درون، مانند سراسر makepp. نام فرمان یا به یک تابع منتهی می شود
"ج_نام" با رشته های باقی مانده به عنوان آرگومان فراخوانی شود. اگر چنین تابعی می تواند
یافت نشد، این شبیه به فراخوانی "run" از یک بلوک "perl" است.

این اجازه می دهد تا به طور موثر یک دستور داخلی، ارائه شده توسط فایل ساخته شده یا خارجی را فراخوانی کنید.
پیشوند "&" انتخاب شده است زیرا فراخوان تابع در Perl است و به این دلیل
در ابتدا در شل غیرقانونی است.

$(ROOT)/include/%.h: %.h
&ln $(ورودی) $(خروجی)

noecho
@ به طور معمول، هر دستور پوسته هنگام اجرا چاپ می شود. با این حال، اگر اولین کلمه
از عمل "noecho" است (یا اگر با کاراکتر "@" شروع می شود)، سپس دستور
چاپ نمی شود مثلا،

%.o: %.cxx
noecho $(LIBTOOL) --mode=کامپایل $(CC) -c $(ورودی)

به این معنی که وقتی دستور libtool اجرا می شود، چاپ نمی شود. (Libtool
خود معمولاً دستور تغییر یافته ای را که اجرا می کند چاپ می کند، بنابراین اضافی است
دوبار چاپ کنید.)

ignore_error
- به طور معمول، اگر دستور shell وضعیت غیر صفر را برگرداند، makepp لغو می شود زیرا
فرمان شکست خورد با این حال، برخی از برنامه ها به اشتباه وضعیت را در هنگام خروج تنظیم می کنند، یا
ممکن است خطایی وجود داشته باشد که واقعاً کشنده نباشد و نباید کل آن را لغو کند
تلفیقی. می توانید با مشخص کردن، باعث شوید makepp وضعیت بازگشت را نادیده بگیرد
"ignore_error" به عنوان اولین کلمه خط فرمان (یا "-" به عنوان اولین کاراکتر).
به عنوان مثال،

$ (توزیع ساختگی):
ignore_error rm -r my_program-$(VERSION) # از شر بلاهای قبلی خلاص شوید.
&mkdir my_program-$(VERSION)
&cp $(FILES) my_program-$(VERSION)
tar cf my_program-$(VERSION).tar my_program-$(VERSION)

این دستور یک دایرکتوری ایجاد می کند، یک دسته از فایل ها را در آن کپی می کند و سپس قرار می دهد
همه چیز را در یک فایل tar برای توزیع. این ایده خوبی است که آن را تمیز کنید
محتویات قبلی دایرکتوری، اگر قبلاً چیزی در آن وجود داشت، و این است
کاری که خط اول انجام می دهد ممکن است "rm" شکست بخورد، اما وضعیت بازگشت آن نادیده گرفته می شود.

پرل
makeperl
این در اصل همان دستور perl است، اما هر بار که انجام می شود
اجرای قانون، نه هنگام خواندن makefile. اولین نوع پرل ساده است
کد، در حالی که نوع دوم ابتدا عبارت را از طریق متغیر Make-style عبور می دهد
به گسترش است.

برای دو امکان قرار دادن پرانتز بدن به توضیحات مراجعه کنید
"perl_perlcode" در makepp_statements. توجه داشته باشید که نوع سوم در آنجا توضیح داده شده است
در اینجا معنایی ندارد، زیرا تمام خطوط عمل باید تورفتگی داشته باشند. باید سیگنال بدی
شکست در عبارات پرل، با فراخوانی "بمیر".

بر اساس قانون، عبارات پرل در حال حاضر در یک فرآیند فرعی مشترک ارزیابی می شوند، به جز در
پنجره ها. این بدان معناست که آنها فقط به هر متغیر makefile دسترسی خواندن دارند. همچنین است
فرآیندی که اقدامات غیر پرل را اجرا می کند. بنابراین فراخوانی exec یا exit باعث سردرگمی خواهد شد
makepp. اما این ممکن است در آینده تغییر کند. برای یک راه کارآمد برای تماس با پرل
اسکریپت ها، آیتم قبلی "&" یا "run" را ببینید.

$ (نسخه ساختگی):
noecho perl {{ # $(target) & $(VERSION) از Perl:
چاپ "This is ".f_target()." $VERSION\n";
}}
echo می توانید این را با دستورات شل ترکیب کنید
-makeperl { print "This is $(target) $(VERSION)\n" }

چندین نوع قانون وجود دارد که هر کدام اهداف متفاوتی دارند.

صریح قوانین
target1 target2: dependency1 dependency2 ...
اقداماتی که باید انجام شود

این نحو مشخص می کند که به منظور ایجاد هر کدام target1 or target2، تمام فایل ها
وابستگی 1, وابستگی 2و غیره باید قبلا ساخته شده باشد. سپس اقدامات داده شده هستند
توسط پوسته برای ساخت اهداف اجرا می شود.

اولین قانون صریح در یک فایل، هدف پیش‌فرض است و در صورتی که شما مشخص نکنید، ایجاد می‌شود
هر هدفی در خط فرمان

برخلاف برنامه‌های ساخت سنتی، makepp معمولاً یک فراخوانی از عمل را فرض می‌کند
همه اهداف را ایجاد می کند (مگر اینکه هیچ وابستگی وجود نداشته باشد). به عنوان مثال، یک فراخوان
yacc هر دو فایل خروجی را برای این قانون ایجاد می کند:

y.tab.c y.tab.h : parser.y
$(YACC) -d parser.y

توجه داشته باشید که سایر پیاده سازی های make مفهومی از یک فرمان واحد ندارند
تولید چندین فایل خروجی، و بنابراین وقتی چندین هدف را مشخص می‌کنید، این کار را انجام خواهند داد
قانون را یک بار برای هر هدف اجرا کنید. Makepp اگر به نظر می رسد به این رفتار باز می گردد
این یک فایل آرایشی به سبک قدیمی است. به طور خاص، این قانون را یک بار در هر هدف اجرا می کند،
در صورتی که همه موارد زیر درست باشد، به جای یک بار به طور کلی:

· عمل قانون به متغیر خودکار $@ اشاره می کند. (مترادف "$(خروجی)" یا
"$(target)" این رفتار را تحریک نکنید.)

· عمل قانون به متغیر خودکار "$(outputs)" (یا مترادف آن) اشاره نمی کند
"$(هدف ها)").

· این یک قانون الگو نیست و هیچ بند foreach وجود ندارد.

به عنوان مثال،

نصب تمام تست:
برای subdir در $(SUBDIRS); cd $$subdir && $(MAKE) $@; سی دی ..; انجام شده

یک اصطلاح رایج در makefiles است و makepp از آن پشتیبانی می کند. (توجه داشته باشید که هرگز استفاده نکنید
ساخت بازگشتی در هر makefiles جدیدی که می نویسید - از عبارت "load_makefile" استفاده کنید، یا
در عوض بارگیری ضمنی فایل ساخت.)

اگر می خواهید همان قانون یک بار برای هر هدف اجرا شود (مثلاً چون اهداف
دستورات مشابهی داشته باشید)، ترجیحاً از یک قانون الگو (به زیر مراجعه کنید) یا a استفاده کنید
بند "foreach". به عنوان مثال، اگر با یک برنامه ساخت سنتی بنویسید:

آ ب پ ت:
do_something برای ساخت $@ > $@

در makepp، احتمالاً می خواهید آن را اینگونه بنویسید:

$(foreach) : : foreach abcd
do_something برای ساخت $(output) > $(output)

صداقت اهداف

A جعلی هدف هدفی است که هرگز در سیستم فایل وجود نخواهد داشت. این فقط یک است
راهی برای گرفتن makepp برای ساختن برخی از اهداف و احتمالاً اجرای برخی از دستورات اضافی.

یک هدف ساختگی معمولی "همه" است که معمولاً برای ایجاد هر چیزی که می تواند باشد استفاده می شود
ساخته شده تا ساخته شود، مانند این:

همه: prog1 prog2 subdir/prog3 subdir2/libmine.a
@&echo "همه کار انجام شد!"

اگر "makepp all" را تایپ کنید، یا اگر همه را به عنوان اولین هدف صریح در پرونده خود قرار دهید
(که معمولی است) و فقط "makepp" را تایپ کنید، سپس باعث می شود همه وابستگی ها باشند
ساخته شده است، سپس "همه انجام شد!" را چاپ می کند. در این مرحله makepp به دنبال فایل می گردد ./همه
و متوجه می شود که وجود ندارد. با صدای بلند شکایت خواهد کرد.

برای اینکه makepp از فایل انتظار نداشته باشد ./همه برای خروج، باید به آن بگویید که یک است
هدف ساختگی فقط یک خط مانند زیر را در میکفایل خود قرار دهید (فرقی نمی کند
جایی که):

.PHONY: همه

یک جایگزین معادل که گاهی راحت تر است استفاده از "$(phony )" است.
عملکرد، مانند این:

$(همه ساختگی): prog1 prog2 subdir/prog3 subdir2/libmine.a

اهداف ساختگی در یک فایل میک‌فایل می‌تواند به اهداف ساختگی در فایل میک‌فایل دیگر اشاره داشته باشد. این هست
اغلب با هدف "تمیز" انجام می شود، مانند این:

# فایل ساخت سطح بالا:
# قوانین و چیزهای زیادی در اینجا وجود دارد
# ....
$ (تمیز ساختگی): subdir1/clean subdir2/clean
&rm -fm my_program

سپس در زیر شاخه‌ها، فایل‌های ساخت ممکن است به صورت زیر خوانده شوند:

# Makefile در یک زیر شاخه
#...
$ (تمیز ساختگی):
&rm -fm $(کارت عام *.o *.a)

اما امروزه به جای یک هدف تمیز از دستور "makeppclean" استفاده می کنید.

کارت های وحشی

تعیین حروف عام در لیست وابستگی ایمن است. حروف عام نه تنها با فایل ها مطابقت دارند
که وجود دارند، اما فایل هایی که می توانند با توجه به قوانین موجود در makefile ایجاد شوند. مثلا،
برای ساختن یک کتابخانه از تمام فایل های .o در یک فهرست، می توانید این را بنویسید:

libmine.a: *.o
&rm -f $(خروجی)
ar cr $(خروجی) $(ورودی ها)

این کار حتی اگر هیچ یک از فایل های ".o" هنوز ایجاد نشده باشد، کار خواهد کرد، زیرا makepp است
وایلدکارت ها با فایل هایی که هنوز وجود ندارند اما می توانند ساخته شوند مطابقت دارند. این حتی بالا خواهد رفت
فایل‌هایی که قاعده‌شان بعداً کشف می‌شود (در همان makefile، یا هنوز خوانده نشده است). در این
آخرین نکته با تابع "wildcard" که محدود به قوانین شناخته شده است، متفاوت است.
همانطور که باید نتیجه خود را پس از گسترش بازگرداند.

Makepp از تمام حروف عام پوسته معمولی ("*"، "?"، و "[]") پشتیبانی می کند. همچنین دارای یک
علامت عام "**" که با هر تعداد دایرکتوری مداخله ای مطابقت دارد. (این ایده دزدیده شد
از zsh.) به عنوان مثال، "**/*.c" با تمام موارد مطابقت دارد .c فایل ها در کل درخت منبع
"objects/**/*.o" با همه موارد مطابقت دارد .o فایل های موجود در هر نقطه از زیر شاخه اشیاء
یا هر یک از زیر شاخه های آن یا هر یک از زیر شاخه های آنها. علامت عام "**" نخواهد بود
پیوندهای نرم به دایرکتوری ها را در هر سطحی دنبال کنید. همچنین هرگز اهداف ساختگی را برنمی‌گرداند.

وایلد کارت های Makepp فایل ها یا دایرکتوری هایی را که وجود دارند اما قابل خواندن نیستند نادیده می گیرند. بعد از
به هر حال، چنین فایل هایی را نمی توان در فرآیند ساخت استفاده کرد. قرار دادن فایل های ناخوانا در a
دایرکتوری در درجه اول برای جلوگیری از واردات خودکار فایل داده شده از a مفید است
مخزن

ادعای اولیه این بود که این بی خطر است. این به این دلیل است که کار می کند
فایل ها از قبل وجود دارند یا باید ابتدا ساخته شوند. با این حال از نظر ظاهری ناامن است
که همچنان با فایل‌هایی که توسط makepp ساخته شده‌اند، مطابقت دارد، اما دیگر قانونی ندارند (مثلاً
شما حذف کردید .c فایل، اما .o فایل هنوز وجود دارد.) برای جلوگیری از این امر، از
گزینه "--rm-stale".

الگو قوانین
قانون الگو قاعده ای است که بر اساس برخی الگوهای متنی اعمال می شود. این عادت دارد
همین قانون را برای یک کلاس کامل از فایل ها اعمال کنید. سینتکس همانند ساخت گنو است
قوانین الگو:

%o: %c
$(CC) -c $(ورودی) -o $(خروجی)

این می گوید که هر فایلی در فهرست فعلی که با "*.c" مطابقت داشته باشد را می توان به آن تبدیل کرد
فایل .o مربوطه با استفاده از دستور داده شده.

توجه داشته باشید که چندین وابستگی الگو ممکن است عرضه شود. به عنوان مثال، اگر شما xyz.o پرونده
به مربوطه بستگی دارد xyz.cpp فایل و همچنین روی فایلی به نام moc_xyz.cflags که
شامل گزینه های کامپایلر است که می توان آن را با موارد زیر بیان کرد:

%.o: %.cpp %.cflags
$(CXX) `cat $(stem).cflags` -c $(ورودی ها) -o $(خروجی)

همچنین ممکن است چندین هدف الگو داشته باشید. مثلا،

%.tab.h .tab.c : %.y
yacc -d $(ورودی)
&mv y.tab.h $(stem).tab.h
&mv y.tab.c $(stem).tab.c

به طور معمول، قوانین الگو فقط به دنبال فایل ها در دایرکتوری های فعلی می گردند. شما می توانید مجبور شوید
آنها را برای جستجو در فهرست فعلی و همه دایرکتوری های زیر آن با تنظیم

makepp_percent_subdirs := 1

قبل از اولین قانون الگو در فایل میک یا در خط فرمان برای مثال.

تفاوت واضحی بین "%" و علامت "*" وجود دارد، اگرچه هر دو با هر کدام مطابقت دارند
string: علامت عام فهرستی از فایل‌ها را برمی‌گرداند که در آن نقطه کاملاً استفاده شده‌اند. بنابراین
این به همه بستگی دارد .o فایل های قابل ساخت در اینجا:

برنامه: *.o
$(LD) $(LDFLAGS) $(ورودی ها) -o $(خروجی)

با جایگزین کردن "*" با "%" نمی توان به این امر دست یافت، زیرا مورد دوم برای یک به یک است.
تطبیق ورودی با خروجی، تولید داخلی یک قانون برای هر ساقه همسان.

ایستا الگو قوانین
یک قانون الگوی ایستا یک قانون الگو است که فقط برای مجموعه محدودی از فایل ها اعمال می شود:

$(SPECIAL_MODULES).o : %.o : %.cpp
$(CXX) -c $(ورودی) -o $(خروجی)

این می گوید که قانون الگو فقط برای فایل های "$(SPECIAL_MODULES).o" اعمال می شود.

این بیشتر برای سازگاری با GNU make است. قوانین foreach (به زیر مراجعه کنید) بیشتر هستند
روشی قدرتمند برای انجام همان کار

برای هر قوانین
نحو قاعده الگوی بالا به اندازه کافی قدرتمند است که تقریباً از تمام ساخت‌ها پشتیبانی می‌کند، اما
گاهی اوقات لازم است کار پیچیده تری انجام شود. Makepp بیشتر ارائه می دهد
نحو قدرتمند: عبارت ":foreach" برای قانون.

target_expression : dependency_expression : foreach file-list
اقدامات

ساده ترین نوع قانون foreach فقط یک قانون الگو است که کاربرد آن محدود است
به لیست خاصی از فایل ها برای مثال، فرض کنید یک قانون الگو دارید که می گوید
makepp چگونه همه را کامپایل کنیم .c فایل ها. با این حال، شما یک لیست از .c فایل هایی که شما برای آنها
می خواهید کاری متفاوت انجام دهید شما می توانید کاری شبیه به این انجام دهید:

# در اینجا قانونی است که برای همه چیز اعمال می شود:
%o : %c
$(CC) $(CFLAGS) -c $(ورودی) -o $(خروجی)

%o : %c : foreach $(SPECIAL_MODULES)
$(CC) $(SPECIAL_CFLAGS) -c $(ورودی) -o $(خروجی)

استفاده حتی قدرتمندتر از قوانین foreach از این واقعیت بهره می برد که متغیر
"$(foreach)" به نوبه خود برای هر فایل مطابق با لیست فایل و هدف و
عبارات وابستگی ارزیابی می شوند. فهرست فایل ممکن است حاوی حروف عام و اینها باشد
حتی فایل‌هایی را که هنوز وجود ندارند، اما می‌توانند ساخته شوند، مطابقت دهید (به "Wildcards" مراجعه کنید
makepp_rules).

این یک نحو دشوار است اما بسیار منعطف است، زیرا متغیر "$(foreach)"
ممکن است به هر شکلی در عبارت ظاهر شود. ابتدا توجه داشته باشید که قوانین الگو در واقع الف هستند
مورد خاص قوانین foreach; قانون الگو

%o : %c
$(CC) $(CFLAGS) -c $(ورودی) -o $(خروجی)

دقیقا معادل است با:

$(patsubst %.c، %.o، $(foreach)) : $(foreach) : foreach *.c
$(CC) $(CFLAGS) -c $(ورودی) -o $(خروجی)

(در واقع، تقریباً در داخل به آن تبدیل شده است.)

به عنوان مثالی از نحوه استفاده از عبارت ":foreach" در جایی که یک قانون الگو وجود ندارد
کافی است، فرض کنید مقداری دارید .c فایل هایی که با استفاده از نوعی پیش پردازنده ساخته می شوند
که به عنوان فایل های ورودی با a .k افزونه. شما می خواهید آن ها را کامپایل کنید .c فایل هایی با a
مجموعه متفاوتی از گزینه های تلفیقی نسبت به حالت معمول .c فایل هایی که منبع معمولی هستند
فایل ها. شما می توانید کاری شبیه به این انجام دهید:

# قانون برای فایل های .c معمولی:
%o : %c
$(CC) $(CFLAGS) -c $(ورودی) -o $(خروجی)

# قانون ساخت فایل های .c از فایل های .k:
%c : %k
$(پیش پردازنده) $(ورودی) > $(خروجی)

# قوانین ساخت ویژه برای فایل های .c که از فایل های .k ساخته شده اند:
$(foreach:%.k=%.o) : $(foreach:%.c=%.k) : foreach *.k
$(CC) $(SPECIAL_CFLAGS) -c $(ورودی) -o $(خروجی)

(این به جای فراخوانی از نحو مرجع جایگزینی مختصرتر استفاده می کند
"patsubst" به صراحت.)

توجه داشته باشید که اگر تنها کاری که می خواهید انجام دهید این است که مقدار یک متغیر را تغییر دهید ("CFLAGS" در این
مورد) گاهی اوقات استفاده از متغیرهای خاص هدف راحت تر است.

میراث پسوند قوانین
برای سازگاری با عقب، makepp از قوانین پسوند سبک قدیمی پشتیبانی می کند.

.suffix1.suffix2:
اقدامات

برابر است با

%.پسوند2: %.پسوند1
اقدامات

اما به خاطر سپردن بسیار سخت تر است (کدام پسوند اول می آید؟) به طور معمول، یک قانون ظاهر می شود
در یک فایل قدیمی مانند این:

.co:
$(CC) $(CFLAGS) -c $*.c -o $*.o

که دقیقا معادل است

%o : %c
$(CC) $(CFLAGS) -c $(ورودی) -o $(خروجی)

درگیری قوانین
هنگامی که بیش از یک راه برای ایجاد یک فایل وجود دارد، makepp از یک روش ساده برای ساختن آن استفاده می کند
تعیین کنید که از کدام قانون استفاده کنید.

· وجود قوانین صریح متناقض برای ساخت فایل یک خطا است.

· قوانین الگو و قوانین foreach با حروف عام هرگز قوانین صریح را نادیده نمی گیرند. بدین ترتیب
قوانین صریح را می توان برای مشخص کردن استثناها برای قوانین الگو استفاده کرد. (به سادگی توجه کنید
استفاده از عبارت ":foreach" چیزی را به عنوان قانون الگو تبدیل نمی کند. باید الف داشته باشد
علامت عام (مانند "*" یا "?") به عنوان بخشی از نام فایل در عبارت ":foreach". اگر هست
فقط یک لیست صریح از فایل ها، به عنوان یک قانون صریح برای هر یک از آنها در نظر گرفته می شود
فایل ها.)

· وقتی قوانین الگوی متناقض از فایل های مختلف می آیند، قوانین از "نزدیک تر"
makefiles قوانین را از فایل های "دورتر" لغو می کند. "نزدیکتر" به این معنی است که makefile
نزدیکتر به هدف در سلسله مراتب دایرکتوری قرار دارد (یعنی نام فایل
هدف نسبت به دایرکتوری که فایل make از آن اجرا می شود کوتاهتر است). اگر این
فایل‌های ایجاد شده را متمایز نمی‌کند، سپس قانون را از فایلی که بارگذاری می‌شود، تشخیص نمی‌دهد
آخرین استفاده شده است.

این بدان معنی است که شما می توانید یک قانون الگو را مشخص کنید که برای همه فایل های موجود در شما اعمال می شود
کل درخت دایرکتوری فقط در فایل سطح بالا، اما می توانید آن را در آن لغو کنید
یک فایل ساخت سطح پایین تر به عنوان مثال، میک‌فایل سطح بالای شما می‌تواند شامل موارد زیر باشد:

%.o : %.c : foreach **/*.c
$(CC) $(CFLAGS) -c $(ورودی) -o $(خروجی)

و می توانید در یکی از زیرشاخه ها یک makefile داشته باشید که می گوید:

%o : %c
$(CC) $(SPECIAL_CFLAGS) -c $(ورودی) -o $(خروجی)

· قوانین الگویی که زنجیره استنتاج کوتاه تری دارند بر سایر الگوها ارجحیت دارند
قوانین برای مثال، اگر قوانین زیر را داشتید (بر اساس مثالی از
هسته لینوکس):

%s: %c
$(CC) -s $(ورودی) -o $(خروجی)

%.o: %.s
$(AS) $(ورودی) -o $(خروجی)

%o: %c
$(CC) -c $(ورودی) -o $(خروجی)

اگر نیاز به ساخت "xyz.o" داشته باشیم، می توانیم فایل ".s" میانی را بسازیم و سپس
آن را از طریق اسمبلر با استفاده از دو قانون اول اجرا کنید، یا می‌توانیم مستقیماً به a برویم
فایل ".o" با استفاده از قانون آخر. قانون آخر ترجیح داده می شود زیرا تعداد آنها کمتر است
مراحل در زنجیره استنتاج (یک به جای دو).

· قواعد الگوی بعدی در یک makefile قوانین الگوی قبلی را نادیده می گیرند. (این هست
به عقب از ساخت گنو.) این به این معنی است که شما باید قوانین کلی تری خود را قرار دهید
زودتر، و قوانین خاص تر شما بعدا. مثلا،

%.o: %.c # قانون جمع‌آوری عمومی.
اقدام

special_%.o: special_%.c # قانون ویژه برای فایل های دارای a
اقدام متفاوت # پیشوند "ویژه_".

قانون گزینه های
گاهی اوقات لازم است گزینه های اضافی برای اصلاح نحوه اجرای makepp ارائه شود
قانون. این گزینه ها به عنوان ":optionname value" یا در خط حاوی مشخص می شوند
وابستگی ها یا در خط بعدی.

ارائه گزینه ها در خطوط جداگانه ممکن است استفاده از همان را برای شما ممکن کند
makefile با makepp و یک ساخت سنتی. مثلا،

هدف: وابستگی ها
: امضای target_newer
اقدامات

با ساخت سنتی یونیکس به خوبی کار می کند، زیرا خط ": امضا" را تفسیر می کند
به عنوان یک فرمان پوسته، و دستوری که با دو نقطه شروع می شود، هیچ کاری نمی کند.

:build_cache /path/to/build/cache
هدف: وابستگی ها
: build_cache /put/cache/files/over/there
اقدامات

مسیر یک build cache را مشخص می کند تا برای فایل های تولید شده توسط این قانون استفاده شود. این
اثر عبارت "build_cache" یا دستور "--build-cache" را لغو می کند
گزینه خط، در صورت وجود، برای این قانون. برای جزئیات بیشتر در مورد ساخت، makepp_build_cache را ببینید
حافظه های پنهان

اگر به جای مسیر "none" را مشخص کنید، کش ساخت را برای این کار غیرفعال می کنید
قانون خاص این می تواند برای جلوگیری از هدر رفتن فضای دیسک در فایل هایی که شما دارید مفید باشد
دانستن برای حافظه پنهان مفید نیستند، زیرا مطمئن هستید که هرگز این کار را نخواهند کرد
استفاده مجدد یا به این دلیل که آنقدر سریع ساخته شده اند که ارزش ذخیره کردن آنها را ندارد.

:build_check build_check_method
هدف: وابستگی ها
: build_check target_newer
اقدامات

این به makepp می گوید که از چه الگوریتمی برای تصمیم گیری در مورد نیاز به بازسازی اهداف استفاده کند.
برای جزئیات بیشتر به makepp_build_check مراجعه کنید. این بر اثر
عبارت "build_check" یا گزینه خط فرمان "--build-check-method"، در صورت وجود، برای
این قانون

: env متغیر ...
یک وابستگی به مقادیر متغیرهای محیط نامگذاری شده اضافه کنید. اگر هر کدام از آنها
با ساخت قبلی متفاوت است، پس اهداف قدیمی در نظر گرفته می شوند، اگر این
روش build_check چنین حکم می کند. (همه روش های بررسی ساخت داخلی به جز برای
target_newer به این احترام بگذارید.)

VARIABLE ممکن است به شکل "نام فایل در PATH_VARIABLE" (در گیومه) باشد، در این صورت
اگر اولین دایرکتوری از کولون محدود شود، اهداف قدیمی در نظر گرفته می شوند
مقدار PATH_VARIABLE که نام فایل در آن وجود دارد با آخرین ساخت متفاوت است.
هنگامی که PATH_VARIABLE در یک تغییر می کند، می توان از آن برای جلوگیری از بازسازی اهداف استفاده کرد
راه بی ربط

:ارسال فرمان ...
هر عمل پوسته (اما نه اقدامات پرل و نه دستورات پرل) را در یک "sh -c '...'" محصور کنید.
و پیشوند آن را با فرمان اضافه کنید، اما فرض کنید که هدف به فرمان بستگی ندارد.
اگر می‌خواهید اقداماتی را به یک سیستم نوبت کاری ارسال کنید، مفید است، اما نتیجه این است
فرض می شود مستقل از پارامترهای صف، و همچنین از اینکه آیا صف است
سیستم اصلا استفاده می شود

:عبارتند از file_or_pattern
قانون بسته به کامپایلر متفاوت است:

%o : %c
: شامل %d : امضای C
gcc -MD -c ...

%o : %c
: include %u : امضای C # IBM از پسوند دیگری استفاده می کند
xlc -M -c ...

sub dependify { # گفتگوی مایکروسافت را به قالب مفید تبدیل کنید
s/\$/\$\$/g;
s/(توجه: شامل فایل: *)?(.+?)\r?\n/$1 ? "'$2' " : "'".f_output()."': "/e;
}
%o : %c
: شامل %d : امضای C
cl -showIncludes -c ... >$(stem).d
&sed &dependify -o +<$(stem).d

برخی از کامپایلرها (ICC اینتل درست مانند gcc بالا، یا IBM xlc) می توانند وابستگی ایجاد کنند.
فایل ها در حال پرواز یعنی در حالی که کامپایل می کنند، یک میک فایل می نویسند که makepp می تواند
عبارتند از. مزیت آن نسبت به اسکنر makepp این است که 100٪ تضمین شده است.
درست است، جایی که ما فقط ممکن است نزدیک شویم.

این گزینه آن را به روش خاصی مهار می کند: اگر فایل موجود نباشد، به عنوان مثال
معمولاً در ساخت اول، اسکن معمولی رخ می دهد. اما اگر فایل موجود باشد خیر
اسکن رخ می دهد (به همین دلیل است که ما یک امضای هوشمند را در بالا مشخص می کنیم -- اسکن نمی افتد
بازگشت به پیش‌فرض گنگ مهر زمان و اندازه). در عوض شامل فایل قبل است
اجرای قانون پس از اجرای موفقیت آمیز قانون، هر آنچه را که باشد فراموش می کند
با توجه به اینکه ممکن است فایل قدیمی باشد، اولین بار بخوانید. در عوض می خواند
فایل را دوباره، اگر تغییر کرد، برای داشتن اطلاعات ساخت به روز.

هشدار: این ذاتا غیر قابل اعتماد است. فایل وابستگی توسط خیلی تولید می شود
قانونی که برای آن یک وابستگی است. از طرف دیگر، کامپایلر در مورد همه چیز می داند
این موارد فرعی داخلی است که makepp معمولاً آنها را نادیده می گیرد. این یک قابلیت اطمینان است
مزیت فقط برای مواردی که پچ کامپایلر فقط موارد فرعی را اصلاح می کند. در
قیمت این است که makepp در نهایت فایل‌های بیشتری را مشاهده می‌کند، که زمان می‌برد.

هنگامی که یک عبارت "#include" را حذف می کنید، یک مشکل وجود دارد و فایل مربوطه:
همچنان از آخرین باری که بوده در فایل وابستگی ذکر خواهد شد
مورد نیاز است. در چنین حالتی باید فایل وابستگی را ویرایش کنید تا وابستگی حذف شود
که دیگر قابل تحقق نیست

این ویژگی را نمی توان با کش ساخت استفاده کرد زیرا یک فایل از آنجا واکشی می شود
نیاز به دانستن همه چیز در مورد فایل دارد. اما یک فایل وابستگی به آنها بستگی دارد
فایل‌هایی که makepp با خواندن آن‌ها در مورد آن‌ها یاد می‌گیرد. چنین وابستگی دایره ای معمولاً وجود ندارد
در یک سیستم ساخت قابل اعتماد امکان پذیر است. این یک استثنا است زیرا پس از بازسازی
و بازخوانی یک فایل وابستگی دوباره همه چیز درست است.

اگر در مخازن خود بسازید، makepp فایل وابستگی را از آن انتخاب می کند
مخزن اول که شامل یک. این بر خلاف فایل های دیگر است، جایی که اول را می گیرد
با امضای مورد انتظار این بهتر از ساخت حافظه پنهان است، جایی که به دلیل کمبود
امضا، حتی نمی تواند فایل را پیدا کند.

:آخرین شانس
یک قانون پایان باز را فعال کنید، مانند

%.foo foo%.bar: :last_chance
&echo $@ -o $@
&cp $(خروجی ها)

از آنجایی که قاعده ای مانند این می تواند اساساً تعداد بی نهایت هدف ایجاد کند،
یک هدف از این قانون با تابع یا قانون الگوی $(wildcard) مطابقت نخواهد داشت مگر اینکه
چیز دیگری قبلاً با ارجاع خاص به هدف، این قانون را مثال زده است.
علاوه بر این، اگر "--rm-stale" مشخص شده باشد، یک هدف باقی مانده از قبلی است
اجرای makepp کهنه به نظر می رسد اگر تنها راه ساخت آن از طریق قانون last_chance باشد
که هنوز برای هدف مورد استفاده قرار نگرفته است، که رفتاری مطلوب است زیرا
وقتی که به اشتباه به یک علامت عام تکیه کند، ساخت به طور مداوم شکست خواهد خورد
اهداف را از اجرای قبلی مطابقت دهید.

گزینه ":last_chance" در نظر گرفته شده است تا توجه را به رفتار خاص آن جلب کند
قانون با توجه به تطبیق حروف عام.

: تجزیه کننده تجزیه کننده
این به makepp می‌گوید که چگونه فرمان شناسایی (شامل) فایل‌ها را تجزیه کند. معمولا،
makepp بر اساس کلمات موجود در خود فرمان حدس می‌زند که چگونه این کار را انجام دهد (نگاه کنید به
makepp_scanning برای جزئیات). با این حال، اگر makepp اشتباه حدس زد، ممکن است بخواهید
به صراحت تجزیه کننده را مانند این نشان دهید:

%.o: %.abc
: تجزیه کننده c_compilation
در اینجا اقدام کنید

این باعث می شود makepp همان تجزیه و اسکن را انجام دهد که برای C/C++ انجام می دهد
دستورات را بسازد، حتی اگر عمل را به عنوان یک کامپایل C تشخیص ندهد.

تجزیه کننده پیش فرض به دستور بستگی دارد. اگر گزینه ":parser" را مشخص نکنید،
سپس اولین کلمه هر دستور بررسی می شود. به عنوان مثال برای یک کامپایل یا پیوند
دستور makepp از تجزیه کننده "c_compilation" استفاده خواهد کرد. یا اگر دستور شبیه به
نوع گنو، "gcc_compilation". اگر تجزیه کننده ای پیدا نشد از تجزیه کننده "none" استفاده می کند. برای
جزئیات بیشتر در این مورد، یا اگر می خواهید تجزیه کننده خود را بنویسید یا makepp را تغییر دهید
تجزیه کننده های پیش فرض، makepp_scanning را ببینید.

توجه داشته باشید که این برای هر دستوری در قانون اعمال می‌شود، که ممکن است آن چیزی نباشد که شما می‌خواهید:

%.o: %.c : تجزیه کننده c-compilation
@echo "ساخت $(خروجی)"
@funny_cc ...

این همچنین "پژواک" را به عنوان یک کامپایلر تفسیر می کند و استدلال آن "Building" را استنباط می کند
mymodule.o' به عنوان یک وابستگی ضمنی. این منجر به شکایت از آن می شود
نمی داند چگونه چنین فایلی بسازد. در این صورت بهتر است با
"register_parser". در آنجا توضیح می دهید که چگونه تجزیه کننده را می توان به عنوان یک
نام کلاس یا به عنوان نام تابع.

:امضا امضا_روش
هدف: وابستگی ها
: امضا md5
اقدامات

این به makepp می گوید که از چه الگوریتمی برای تعیین اینکه آیا وابستگی ها تغییر کرده اند استفاده کند.
برای جزئیات بیشتر به makepp_signatures مراجعه کنید. روش های امضایی که همراه با
توزیع makepp عبارتند از: "plain"، "md5"، "C" یا "c_compilation_md5"، و
"اشیاء_اشتراک‌گذاری شده". این روش هر روش امضای مشخص شده با "-m" یا را لغو می کند
گزینه های خط فرمان "--signature-method" یا با عبارت "signature".

ویژه کاراکتر
Makepp می تواند از نام فایل هایی که دارای کاراکترهای خاص مانند دو نقطه یا فاصله هستند پشتیبانی کند.
برای مثال فرض کنید می خواهید از فایل b:thing یک فایل به نام "a:thing" ایجاد کنید.
شما نمی توانید قانون را به این صورت بنویسید:

a:thing : b:thing # این یک خطای نحوی است
&cat $(ورودی) -o $(خروجی)

زیرا makepp نمی داند کدام کولون ها اهداف را از وابستگی ها جدا می کنند و کدام ها هستند
بخشی از نام فایل ها در عوض، به سادگی نام را در نقل قول قرار دهید، مانند این:

"a:thing" : "b:thing"
&cat $(ورودی) -o $(خروجی)

حالا این قانون بدون ابهام است.

نحو نقل قول Makepp کاملاً شبیه به پوسته است. برای مثال می توانید از تک استفاده کنید
به جای نقل‌قول‌های دوتایی، نقل‌قول می‌دهد، یا می‌توانید با یک بک اسلش از کاراکترهای خاص فرار کنید:

a\:thing: 'b:thing'
&cat $(ورودی) -o $(خروجی)

به عنوان مثال، فرض کنید نام فایل شما "'" است!;\$. حالا چرا شما چنین نام فایلی را می خواهید
من نمی دانم، اما در اینجا چندین راه وجود دارد که می توانید آن را به makepp (و پوسته) مشخص کنید:

\''"!;\$$'
"'\"!;\\$$"

به زمانی که makepp نقل قول ها را نوار می کند و زمانی که پوسته انجام می دهد توجه کنید. Makepp نگاه می کند
نقل قول فقط در موارد زیر:

· در خانواده آزمون های «ایفق».

· قبل و بعد از کولون قانون

· در یک دستور makepp ساخته شده است

· در تابعی که به فایل ها مربوط می شود

برخلاف پوسته، makepp در حین اختصاص دادن آنها به یک متغیر، نقل قول ها را گسترش نمی دهد. بدین ترتیب
قوانین زیر یکسان است:

FILE = "نام با فاصله"
x := $($(FILE)) # را فقط برای بررسی اینکه آیا نقل قول ها هنوز وجود دارند
$(FILE): # نقل قول در اطراف یک فایل که توسط makepp حذف شده است
&echo hello -o$(FILE) # نقل قول در اطراف تک فایل حذف شده توسط makepp
پژواک وجود دارد >>$(FILE) # نقل قول در اطراف تک فایل حذف شده توسط Shell
"نام با فاصله":
&echo hello -o'name با فاصله‌ها
echo there >>'$(output)' # نقل قول در بالا حذف شد، آنها را دوباره اضافه کنید

توجه داشته باشید که (برخلاف Shell) متغیرهایی که با "$" شروع می شوند، حتی در داخل واحد نیز گسترش می یابند
نقل قول ها نشانه های دلار را نمی توان با نقل قول یا بک اسلش محافظت کرد. برای به دست آوردن واقعی کلمه
علامت دلار، از علامت دو دلاری استفاده کنید، به عنوان مثال،

$ (همه جعلی):
@&echo این علامت دلار است: $$
@for val در abcd; انجام پژواک $$val; انجام شده

به طور کلی، شما باید بتوانید تقریباً با هر شخصیت خاصی با نقل قول از آن مقابله کنید
به نوعی این شامل فضاها، کاراکترهای کنترلی و غیره می شود. با این حال، توجه داشته باشید که در
در حال حاضر، برداشتن نظر makepp تا حدودی ساده است و هر کاراکتر "#".
قبل از استفاده از فضای خالی به عنوان نظرات بدون توجه به نحوه نقل قول تفسیر می شوند.

هنگامی که یک نام هدف یا وابستگی در یک متغیر خودکار مانند "$(output)" قرار می گیرد، سپس
نقل قول ها و هر گونه بک اسلش حذف می شوند. این بدان معنی است که اگر می خواهید به آن ارجاع دهید
نام فایل در اکشن‌ها، احتمالاً باید دوباره آن را نقل قول کنید، مانند این:

"نام فایل با فاصله":
پژواک "محتوای خاص" > "$@"

اگر نقل قول ها را در اطراف $@ قرار ندهید، پوسته دستور را می بیند

echo "Special contents" > یک نام فایل با فاصله

که رشته “Special contents file name with spaces” را در فایل فراخوانی شده می نویسد a.
احتمالاً این چیزی نیست که شما می خواهید.

با استفاده از خدمات onworks.net از makepp_rules به صورت آنلاین استفاده کنید


سرورها و ایستگاه های کاری رایگان

دانلود برنامه های ویندوز و لینوکس

دستورات لینوکس

Ad