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

Ad


فاویکون OnWorks

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

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

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

برنامه:

نام


makepp_variables -- نحوه استفاده از متغیرها در makepp

شرح


?: $*،
$+،
$/،
$<،
دلار؟،
$@،
$^،
=,
!=،
&=،
+=،
:=
;=
?=، A: AR،
ARFLAGS،
مانند، C: CC،
CFLAGS،
"تغییر_وابستگی ها"،
تغییرات_ورودی ها،
کوردیر،
CXX،
CXXFLAGS، D: "وابستگی ها"،
"وابستگی"، F: F77،
اف سی،
"برای هر"، I: ورودی ،
ورودی، L: LD،
LEX،
LIBTOOL، M: ساختن،
MAKECMDGOALS،
پرچم ها،
MAKEINFO،
MAKEPP_DEBUG،
MAKEPPFLAGS،
_MAKEPPFLAGS،
MAKEPP_LN_CP،
"makepp_percent_subdirs"،
"makepp_require_phony"،
makepp_signature_C_flat،
"makepp_simple_concatenation"،
MAKEPP_VERSION، O: "خروجی"،
"خروجی ها"، P: پرل،
PWD، R: RM ،
ریشه، S: پوسته،
"وابستگی_های مرتب شده"،
sorted_inputs
"ساقه"، T: هدف،
اهداف ، V: VPATH، Y: YACC

Makefiles معمولاً در بسیاری از مکان ها از متغیرها استفاده می کنند. یکی از دلایل مهم استفاده
متغیرها این است که اطمینان حاصل شود که اطلاعات فقط در یک مکان در makefile موجود است، بنابراین
که در صورت تغییر، خطری برای خارج شدن دو نسخه از اطلاعات وجود ندارد
همگام سازی

نام متغیرها به حروف کوچک و بزرگ حساس هستند. در تئوری، نام متغیرها را می توان از تعداد زیادی نام برد
شخصیت‌ها، اما makepp احتمالاً نمی‌تواند آن را در صورتی که کاری غیر از این انجام دهید به دست آورد
کاراکترهای الفبای عددی "_" و "-".

هر makefile مجموعه ای از متغیرهای خاص خود را دارد و تنظیم یک متغیر در یک makefile انجام می شود
هیچ تأثیری بر ارزش آن در هیچ فایل دیگری ندارد. اگر می خواهید متغیرهایی را تنظیم کنید
بسیاری از فایل های آرایشی، بهترین راه برای انجام این کار این است که هر کدام از آنها دارای تعاریف مشترکی باشند
فایل (به عبارت include مراجعه کنید) یا از متغیرهای "جهانی" استفاده کنید.

متغیر واگذاری
یک متغیر می تواند یک مقدار را به چند روش مختلف فرض کند:

· یک متغیر ممکن است در داخل یک فایل ایجاد شده تنظیم شود. چندین راه مختلف برای انجام وجود دارد
این؛ زیر را ببینید.

· مقدار یک متغیر ممکن است در خط فرمان مشخص شود، مانند:

makepp CFLAGS=-O2 my_program

اگر بیش از یک makefile بارگذاری شود، متغیر CFLAGS به همه آنها منتشر می شود
فایل های ایجاد شده متغیرهای تنظیم شده در خط فرمان به طور خودکار هر تنظیمی را لغو می کنند
متغیر موجود در هر یک از فایل های ایجاد شده

در صورت نیاز، makefile باید به نوبه خود صراحتاً تنظیمات خط فرمان را لغو کند.
هدف نادیده گرفتن خواسته های کاربر نیست، بلکه راهی برای اصلاح آن است.
ممکن است اصلاح کننده "Override" قبل از هر دستور انتساب باشد. اما در مورد
در عبارات کلمه کلیدی، ترتیب مهم است، به همین دلیل است که نوع لغو است
همیشه در زیر نشان داده شده است. تعدیل کننده "نسخه" فقط برای هر تکالیفی که در آن وجود دارد اعمال می شود
وجود دارد و بر تخصیص های بعدی به متغیر تأثیر نمی گذارد.

· اگر متغیری در محیط تنظیم شده باشد، می توان به آن به عنوان متغیر makepp اشاره کرد.
معمولاً انتساب به متغیرهای داخل یک makefile تنظیمات را از
محیط، اما می توانید با استفاده از "-e" یا "--environment-overrides" این مورد را تغییر دهید.
گزینه خط فرمان

متغیرها با یکی از چندین عبارت انتساب، مانند این، تخصیص می‌یابند

X = 1
ماژول ها: = abcd
CC ?= gcc
CFLAGS += -Wall
VAR را تعریف کنید
var خط 1
var خط 2
enddef
صادرات PATH := $(PWD):$(PATH)
سراسری MYPROJECT.INFO = اطلاعاتی که باید در همه فایل‌ها دیده شود

فضای خالی پیشرو و دنباله دار در اطراف مقادیر همیشه حذف می شود.

عملگرهای تخصیص مختلف معانی متفاوتی دارند.

ساده واگذاری اپراتور

=
VARIABLE = رشته متن
نادیده گرفتن VARIABLE = رشته متن

این عبارت انتساب معمولی است که همه پیاده سازی ها از آن پشتیبانی می کنند. در
عبارت سمت راست تا زمانی که مقدار "$(VARIABLE)" نباشد ارزیابی نمی شود
در واقع در جایی استفاده شده است بنابراین، اگر موارد زیر را انجام دهید:

X = 1
Y = $ (X)
X = 2

سپس "$(Y)" بعداً در makefile به "2" ارزیابی می شود.

به طور کلی، شما معمولاً می خواهید از ":=" (در زیر ببینید) به جای "="" استفاده کنید زیرا آن را دارد
ارزیابی متغیر قابل پیش بینی تری را ارائه می دهد. با این حال، مواقعی وجود دارد که شما نیاز دارید
برای به تعویق انداختن ارزیابی متغیر همچنین، اگر در حال نوشتن یک فایل اصلاحی هستید که باید باشد
سازگار با نسخه‌ای از make به غیر از GNU make، پس هیچ
انتخاب: شما فقط می توانید از "=" استفاده کنید.

:=
متغیر: = expr
نادیده گرفتن VARIABLE := expr

این همان "VARIABLE = expr" است با این تفاوت که سمت راست ارزیابی می شود
یکبار برای همیشه در زمان انجام وظیفه. بنابراین اگر

X: = 1
Y := $(X)
X: = 2

سپس "$(Y)" بعداً در makefile به "1" ارزیابی می شود زیرا "$(X)" همین بود
زمانی که "$(Y)" تعریف شد.

;=
VARIABLE ;= expr
نادیده گرفتن VARIABLE ;= expr

این همان "VARIABLE := expr" است با این تفاوت که سمت راست ارزیابی می شود
فقط در زمان اولین استفاده و سپس به یاد می آورد. این برای گرانی مفید است
دستوراتی که همیشه مقدار یکسانی را برمی‌گردانند، اما نمی‌خواهید چه زمانی اجرا شوند
ساختن اهداف نامرتبط:

VAR1 ;= $(محاسبات گران قیمت پرل)
VAR2 ;= $(فرمان خارجی پوسته)

توجه داشته باشید که میک‌فایل‌های قدیمی معمولاً از «:=" در اینجا استفاده می‌کنند تا حداقل یک بار این کار را انجام دهند.
اما با این اپراتور شما حتی نمی توانید آن را انجام دهید، اگر در حال حاضر انجام نمی دهید
نیاز به ارزش برای مقادیری که در چندین فهرست یکسان هستند، می توانید
این را بیشتر با "جهانی" که در زیر مورد بحث قرار گرفته است، بهینه کنید.

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

+=
VARIABLE += expr
نادیده گرفتن VARIABLE += expr

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

&=
VARIABLE &= expr
نادیده گرفتن VARIABLE &= expr

رشته را به محتویات قبلی متغیر که با فاصله از هم جدا شده اند، اضافه می کند.
اگر متغیر قبلاً با ":=" تخصیص داده شده بود، سمت راست آن است
قبل از الحاق ارزیابی شد

به عنوان مثال، یکی از راه‌های تضمین "CFLAGS"، هر چیز دیگری که کاربر ممکن است وارد کند،
همیشه با "-Wall" شروع می شود این دو خط هستند:

CFLAGS = -O2 # احتمالاً در خط فرمان لغو شود
لغو CFLAGS &= -Wall # بدون قید و شرط از پیش تعیین شده است

در میک‌فایل‌های قدیمی معمولاً باید کاری شبیه به این انجام می‌دادید، که طرف را داشت
اثر اجباری نوع به ":=" برای جلوگیری از بازگشت بی پایان:

VARIABLE := expr $(VARIABLE)

?=
VARIABLE ?= expr
override VARIABLE ?= expr # بی فایده، اما قانونی

مقدار متغیر را تنظیم می کند، اما فقط در صورتی که متغیر قبلاً در آن مشخص نشده باشد
makefile، در خط فرمان یا در محیط. تکلیف فوق می باشد
دقیقا معادل

ifndef VARIABLE
VARIABLE = expr
انتهایی

!=
VARIABLE != فرمان پوسته
override VARIABLE != فرمان پوسته

دستور shell را اجرا می‌کند و متغیر را طوری تنظیم می‌کند که خروجی استاندارد فرمان را داشته باشد.
این دقیقاً معادل است

VARIABLE := $(فرمان پوسته)

چند خطی متغیرها

عبارت "define" معادل چند خطی دستورات ساده بالا است. در
عملگر بعد از متغیر اختیاری است. اگر وجود نداشته باشد، معادل «تعریف VARIABLE» است
=". عملگرهای "&=" و "+=" در اینجا کمی متفاوت هستند، زیرا آنها این را به آن می چسبانند
مقدار قدیمی با یک خط جدید، به جای فاصله. چیزی جز الف نباید وجود داشته باشد
بعد از عبارت نظر بدهید، یعنی مقدار از خط بعدی شروع می شود.

VARIABLE را تعریف کنید:=
خط اول مقدار متغیر
خط دوم مقدار متغیر
خط سوم مقدار متغیر
endf

لغو تعریف VARIABLE
...
enddef

کلمات کلیدی قبل از "تعریف" می توانند ترکیبی از یکی از "صادرات" یا "جهانی" و
"لغو".

اگر به مقدار متغیری نیاز دارید که حاوی خطوط جدید باشد، باید از عبارت "define" استفاده کنید
نشان داده شده است (یا می توانید مقدار را مستقیماً در Perl اختصاص دهید). ("endef" برای
سازگاری با ساخت گنو شما همچنین می توانید از "enddef" استفاده کنید.) این در درجه اول مفید است
"توالی دستورات کنسرو شده"، به عنوان مثال، چیزی شبیه به این:

COMPILE_C_PROGRAM را تعریف کنید
@&echo "کامپایل $(ورودی)"
@$(CC) $(CFLAGS) $(CPPFLAGS) $(شامل) -c $(ورودی) -o $(خروجی)
endf

سپس می توانید از این متغیر چند خطی در چندین قانون استفاده کنید، مانند این:

%o : %c
$(COMPILE_C_PROGRAM)

$(ARCH)/%.o : $(ARCH)/%.c
$(COMPILE_C_PROGRAM)

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

COMPILE_C_PROGRAM = @echo "کامپایل $(ورودی)"; \
$(CC) $(CFLAGS) $(CPPFLAGS) $(شامل) -c $(ورودی) -o $(خروجی)

همان اثر را خواهد داشت، با این تفاوت که نقطه ویرگول Perl را مجبور می کند آن را به پوسته منتقل کند.
به جای اجرای مستقیم و کارآمدتر دستور. شما همچنین باید هر یک را قرار دهید
بر روی یک خط ساخته شده است، به این معنی که شما باید به اکو خارجی در آن تغییر دهید
مورد نقطه ویرگول

در هنگام گسترش در "define" یک تخصص وجود دارد، یعنی "define X :=" یا در a
متغیری که قبلا ":="، "define X &=" و "define X +=" بود. در این مورد
"$(Shell command ...)" یا "$(&command ...)" داخلی به خطوط جدید تبدیل نمی شوند
فضاها

صادرات متغیرها به فرآیندهای فرعی

صادرات VAR ...
صادرات VAR = ارزش
لغو صادرات VAR += مقدار

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

اشتراک متغیرها در میان فایل های ایجاد شده

VAR جهانی ...
جهانی VAR = مقدار
نادیده گرفتن مقدار و = VAR جهانی

فرم اول متغیرهای داده شده را به عنوان جهانی برای همه فایل‌های ساخت علامت‌گذاری می‌کند. اگر هر کدام از آنها
قبلاً یک مقدار داشت، آن مقدار از متغیر محلی makefile به global منتقل می شود
یکی با این حال، اگر در زمانی که این عبارت مشاهده می‌شود، هر فایل makefi دیگری قبلاً یک علامت داشته باشد
برای هر یک از آنها ارزش داشته باشد، آنگاه آن فایل‌های ساختگی فایل جهانی را نخواهند دید.

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

رویارویی با متغیرهای سراسری ممکن است دشوار باشد، زیرا makepp ممکن است فایل‌های makepp را در هر کدام بارگذاری کند
دستور دهید، زیرا نیاز به ساختن هدفی است که هیچ قانون یا فایلی برای آن بارگذاری نشده است.
به همین دلیل توصیه می شود که یک RootMakeppfile و به صراحت همه را بارگذاری کنید
سایرین که متغیر را با "load-makefile" تغییر می دهند یا از آن استفاده می کنند.

جهانی GLIBLIBS ;= $(شل pkg-config --libs glib-2.0)

همچنین توجه داشته باشید که پروژه شما ممکن است روزی همراه با پروژه های دیگر ساخته شود. برای این
به همین دلیل توصیه می شود همیشه نام پروژه را بخشی از نام متغیر جهانی قرار دهید.

هدف خاص تکالیف

هدف: VARIABLE = رشته
هدف: VARIABLE := رشته
هدف: لغو VARIABLE += رشته

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

CFLAGS := -O2

my_prog: file1.o file2.o special_file.o

special_file.o : CFLAGS := -g

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

آنچه در اینجا اتفاق می افتد این است که همه فایل های ".c" با بهینه سازی ("-O2") کامپایل می شوند. جز
"special_file.c" که در حالت اشکال زدایی ("-g") کامپایل شده است. این یک راه راحت است
گزینه های مختلف کامپایل را فقط برای چند فایل مشخص کنید.

تخصیص متغیرهای خاص هدف مانند این فقط برای اعمال قانون اعمال می شود. آنها
هنگام ارزیابی اهداف یا وابستگی های یک قاعده موثر نیستند. اگر یک قانون
دارای بیش از یک هدف است، تخصیص متغیرهای خاص فقط از آن گرفته می شود
اول هدف. همچنین توجه داشته باشید که متغیرهای هدف خاص makepp کمی متفاوت هستند
از GNU make's به این دلیل که آنها فقط به قانون مربوط به یک فایل ذکر شده اعمال می شوند و نه برای
هر یک از پیشینیان آن

توسعه Wildcard روی هدف انجام می شود، بنابراین می توانید کاری شبیه به این انجام دهید:

test_*.o: CFLAGS += -DTEST

برای سازگاری با ساخت گنو، «%» ممکن است به جای «*» استفاده شود.

متغیر جایگزینی
قوانین جایگزینی متغیر Makepp مشابه قوانین سایر ساخت‌ها است، اما تا حدودی
قوی تر. همانطور که در همه مارک ها، "$(CC)" یا "${CC}" هر دو نشان دهنده مقدار هستند
CC متغیر اگر به یک علامت واقعی دلار نیاز دارید، یک علامت دو دلاری ($$) قرار دهید
این:

هدف: dep1 dep2 dep3 dep4
&rm -f $(خروجی)
برای فایل در $(ورودی ها)؛ do cat $$file >> $(خروجی); انجام شده

علاوه بر این makepp یک نحو "$[VARIABLE]" دارد که همان کار دیگری را انجام می دهد.
دو، اما قبل از اینکه makepp به هر چیز دیگری بپردازد. این اجازه می دهد تا از آن برای قوانین کامل استفاده کنید
و/یا مشروط:

تعریف bracket_rule =
ifdef SOME_VAR
براکت:
&echo این یک قانون است -o $(خروجی)
انتهایی
enddef

$[bracket_rule]

سبک rc جایگزینی

به‌طور پیش‌فرض، makepp از جایگزینی به سبک rc استفاده می‌کند (به این دلیل که پیشگام آن است
پوسته rc). این به بهترین شکل با یک مثال نشان داده می شود:

ماژول = abcd

mylib.a : module_dir/$(MODULES).o $(OTHER_OBJECTS)
$(CXX) $(وابستگی ها) -o $(هدف)

پیشوند "module_dir/" به هر کلمه در MODULES اضافه می شود و پسوند ".o" است.
به هر کلمه اضافه می شود.

شما همچنین می توانید از جایگزینی به سبک rc بدون قرار دادن لیست کلمات در a استفاده کنید
متغیر؛ نحو "$( word1 word2)" است. به فاصله بین پرانتز و the توجه کنید
کلمه ی اول. بنابراین مثال بالا را می‌توان به صورت زیر نوشت:

mylib.a : module_dir/$( abcd).o $(OTHER_OBJECTS)
$(CXX) $(وابستگی ها) -o $(هدف)

یک متغیر تنها زمانی جایگزینی به سبک rc می دهد که بیش از یک کلمه در آن وجود داشته باشد.
با یک کلمه مانند ساخت سنتی است. افسوس، زمانی که متغیر خالی است، یک وجود دارد
تعارض. می سازد سنتی به سادگی آن را به رشته خالی گسترش می دهد. اما وقتی به آن فکر می کنید
به عنوان یک لیست، شما می خواهید "-I$(DIRLIST)" ناپدید شود، نه اینکه یک "-I" تنها بدهید. در
راه حل این است که آن را در لیستی قرار دهید که با فاصله شروع می شود: "-I$($(DIRLIST))" به شما می دهد
دقیقاً به همان تعداد گزینه، به اندازه کلماتی که در لیست وجود دارد.

اگر چندین متغیر را در یک کلمه قرار دهید که به آرایه های کلمات گسترش می یابد، به سبک rc
جایگزینی در واقع محصول دکارتی را می گیرد، بنابراین می توانید کاری شبیه به این انجام دهید اگر
شما می خواهید:

DIRS = s1 s2
ماژول ها = abc
پسوندها = .o .c
FILES := $(DIRS)/$(MODULES)$(پسوندها)

و FILES شامل رشته خواهد بود

s1/ao s1/ac s1/bo s1/bc s1/co s1/cc s2/ao s2/ac s2/bo s2/bc s2/co s2/cc

علاوه بر فضای سفید، جایگزینی به سبک rc در هر نقل قول، هر گرد، مجعد یا مربعی متوقف می شود
پرانتز، و هر یک از ", : ; = # @". توجه داشته باشید که این ممکن است تعجب آور باشد، و دوباره نیاز است
یک لیست صریح فرض کنید می خواهید سرصفحه ها را با حروف عام در همه دایرکتوری ها جستجو کنید
با یک حرف بزرگ شروع می شود:

بد := [AZ]*/**/*.$( hpp h) # [AZ]*/**/*.hpp */**/*.h
خوب := $( [AZ]*/**/*.)$( hpp h) # [AZ]*/**/*.hpp [AZ]*/**/*.h

اگر جایگزینی به سبک rc مانع شود، یا اگر نیاز دارید که پیشرو یا عقب‌نشینی داشته باشید
در متغیرهای make خود فضای خالی ایجاد کنید، سپس می توانید با تنظیم، جایگزینی به سبک rc را خاموش کنید
متغیر "makepp_simple_concatenation=1". با دستور می توانید آن را به صورت سراسری خاموش کنید
خط یا به عنوان یک متغیر محیطی. یا بر اساس هر makefile با تنظیم متغیر در
پرونده شما شما باید این کار را در نزدیکی بالای پرونده انجام دهید، در غیر این صورت ممکن است به آن برخورد کنید
موقعیت های خنده دار که در آن از جایگزینی به سبک rc برای برخی ارزیابی ها استفاده می شود و نه برای برخی دیگر.
(همه عبارات ارزیابی شده قبل از تخصیص از جایگزینی به سبک rc و همه استفاده می کنند
عباراتی که بعد از آن ارزیابی می شوند، خیر. از زمان ارزیابی عبارات در
makefiles پیچیده است و همیشه از ترتیب عبارات موجود در آن مشخص نیست
makefile، بهتر است هرچه زودتر "makepp_simple_concatenation" را تنظیم کنید.) می توانید
حتی آن را فقط برای یک هدف تنظیم کنید:

هدف: makepp_simple_concatenation = 1
هدف:
&echo before_first$(LIST)after_last -o $(خروجی)

از آنجا که "$[VARIABLE]" زودتر از "$(VARIABLE)" ارزیابی می شود، با ترکیب این دو در rc-
تعویض نتیجه ای را که ممکن است انتظارش را داشته باشید به دست نمی آورد، مگر اینکه آن را به صورت واضح بپیچید
لیست:

A = ab
N = 1 2
بد := $(A)$[N]
خوب := $(A)$( $[N])

سطرهای آخر به صورت خوانده می شود

بد := $(A)1 2 # a1 b1 2
خوب := $(A)$( 1 2) # a1 a2 b1 b2

جایگزینی منابع

یک مرجع جایگزین به شکل "$(VAR:A=B) است، که در آن A الگویی برای مطابقت و B است.
الگویی برای جایگزینی با آن ارجاعات جایگزین مخفف عبارت هستند
تابع "patsubst". مثلا:

source_files = ac bc cc dc
object_files = $(source_files:%.c=%.o)

"$(object_files)" را روی "ao bo co do" تنظیم می کند. "%" یک کاراکتر خاص است
هر رشته دلخواه اگر هر دو A و B با "%" شروع می شوند، یک مورد رایج هنگام جایگزینی
پسوندها را می توان حذف کرد:

object_files = $(source_files:.c=.o)
object_files = $(source_files:c=o) # یکسان، زیرا . خاص نیست

فضای سفید in متغیرها

اگر نیاز به کنترل فضای سفید در یک متغیر دارید، باید (در حال حاضر) rc-style را غیرفعال کنید
جایگزینی (با تنظیم "makepp_simple_concatenation=1") و سپس از نحوی مانند این استفاده کنید:

تهی =
T = -o $(null)

یا با یک ارزیابی خالی:

T = -o $()

هنگامی که این کار را انجام می دهید، متغیر "T" حاوی "-o" و به دنبال آن یک فاصله است.

این نوع تکنیک برای مدیریت فضای خالی توصیه نمی شود. اگر به متغیرها نیاز دارید
در میکفایل خود برای اینکه حاوی فضا باشد، باید به طور جدی در مورد کاری که انجام می دهید فکر کنید.
اگر نیاز به مدیریت فضاها دارید، معمولاً بهتر است کد پرل را در خود قرار دهید
makefile برای مراقبت از آن (با استفاده از عبارت "perl_begin" یا "sub")، یا برای رسیدگی به آن
در بیانیه های پوسته در اقدامات قوانین.

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

ifeq ($(ARCH), weirdarch)
O := /OUTPUT=
دیگر
null :=
O := -o $(null)
انتهایی

%o : %c
$(COMPILER) $(ورودی) $(O)$(خروجی)

اگر واقعاً می خواهید، می توانید این کار را با makepp انجام دهید، اما احتمالاً متوجه خواهید شد که این کار شماست
اگر متغیر پیچیده تری داشته باشید، فایل های make-files به طور قابل ملاحظه ای خواناتر هستند
جایگزینی، به عنوان مثال،

ifeq ($(ARCH), weirdarch)
%o : %c
$(WEIRD_COMPILER) $(ورودی) /OUTPUT=$(خروجی)
دیگر
%o : %c
$(CC) -c $(ورودی) -o $(خروجی)
انتهایی

فضای خالی هرگز در نام متغیرها مجاز نیست، فقط در مقادیر آنها. این فرق داره
از برخی پیاده سازی می کنند.

اتوماتیک متغیر
متغیرهای خودکار متغیرهایی هستند که بسته به قانون، مقادیر متفاوتی را در نظر می گیرند
Makepp از بسیاری از متغیرهای خودکار پشتیبانی می کند
نسخه های make use علاوه بر این، نام‌های کمتر مرموز و طولانی‌تری برای اکثر آنها دارد
که می توانید به جای آن استفاده کنید. (برای فایل‌های قدیمی که اتفاقاً این نام‌ها را دوباره تعریف می‌کنند،
تعریف موجود در makefile معنای پیش فرض را نادیده می گیرد. مثلاً اگر بگویید
"target = abc" در makefile شما، سپس "$(target)" همیشه به "abc" گسترش می یابد، و هیچ
دیگر معادل $@ باشد.)

در زیر لیست کاملی از تمام متغیرهای خودکاری که makepp پشتیبانی می کند آورده شده است:

تولید
هدف
$@ هدف قانون فعلی. در واقع، از آنجایی که makepp از چندین هدف برای پشتیبانی می کند
هر قانون، این است اول هدف. برای مثال در قانون زیر

y.tab.c y.tab.h : parser.y
$(YACC) -o $(خروجی) $(YFLAGS) $(ورودی)

"$(output)" حاوی مقدار خواهد بود y.tab.c. از آنجایی که این متغیرهای جادویی در واقع هستند
توابع، شما همچنین می توانید یک شاخص را به عنوان آرگومان ارسال کنید. این از 1 یا عقب حساب می شود
از -1. بنابراین "$(خروجی 2)" یا "$(خروجی -1)" حاوی مقدار خواهد بود y.tab.h.

در حالی که هر سه شکل این متغیر دارای مقدار یکسانی هستند، تفاوت در آن وجود دارد
تفسیر قوانین چند هدف اگر از نام رمزی قدیمی $@ استفاده می کنید،
makepp آن را به‌عنوان یک مجموعه قوانین قدیمی تفسیر می‌کند تا یک قانون مدرن
همه آن اهداف را در یک حرکت تولید می کند:

ab: # واقعاً: هر کدام یک قانون برای a و b
$@ را لمس کنید

cd: # خطا: mpp شکایت می کند که این d ساخته نشده است
$ (خروجی) را لمس کنید

خروجی
اهداف
همه اهداف قانون فعلی. مانند "$(هدف)" مگر اینکه بیش از یک وجود داشته باشد
هدف. در مثال بالا، "$(outputs)" y.tab.c y.tab.h خواهد بود. شما می توانید عبور کنید
فهرست فهرست، بنابراین "$(خروجی های 2 1)" y.tab.h y.tab.c خواهد بود.

وابستگی
ورودی
$< اولین وابستگی صریح قانون. مثلا در این قاعده

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

"$(input)" نام آن خواهد بود .c پرونده، صرف نظر از اینکه چه چیزی .h فایل های makepp
کشف می کند. اگر بیش از یک وابستگی را مشخص کنید، می توانید آنها را با عبور از یک به دست آورید
index: "$(input $(INDEX))" وابستگی INDEX است.

وابستگی
ورودی
$^ تمام وابستگی های صریح هدف، بدون احتساب .h فایل های کشف شده توسط
makepp_scanning برای شامل.

مثلا در قاعده

myprog.o : *.o
$(CC) $(CFLAGS) $(ورودی ها) -o $(خروجی)

"$(inputs)" همه فایل‌های .o در فهرست هستند. شما فقط می توانید آنهایی را که خودتان هستید انتخاب کنید
می خواهید با گذراندن یک فهرست فهرست. اگر به صراحت انواع مختلفی از فایل ها را مشخص کنید،
می‌توانید آن‌ها را مانند «$(ورودی‌های 2 3 4)» انتخاب کنید (اما با علامت عام، این هم نیست
امیدوار کننده).

sorted_dependencies
sorted_inputs
$+ همه وابستگی های هدف، به ترتیب مرتب شده، با حذف تکراری.
معادل "$(مرتب کردن $(ورودی ها))".

تغییر_وابستگی ها
change_inputs
دلار؟ وابستگی های هدف که تغییر کرده است. این فقط شامل صریح است
وابستگی ها (یعنی آنهایی که در فایل میک فهرست می کنید)، که به طور ضمنی کشف نشده اند
وابستگی های حاصل از اسکن (مانند فایل های .h).

این معمولاً در دستوراتی مانند زیر استفاده می شود:

libmine.a : $(MODULES) : build_check ignore_action
$(AR) ru $@ $؟

یعنی ar گفته می شود که فقط ماژول هایی را که تغییر کرده اند جایگزین کنید. (توجه داشته باشید که
قانون بررسی ساخت "ignore_action". اگر این را مشخص نکنید، makepp آن را مجبور می کند
عملی که باید هر زمان که تغییر کرد اجرا شود. اگر هیچ وابستگی تغییر نکرده باشد،
رشته اکشن "ar ru libmine.a" خواهد بود که احتمالاً با آنچه بود متفاوت است
آخرین باری که آن را اجرا کردید، بنابراین بدون "ignore_action" makepp آن را اجرا می کند. در این
در مورد، بی ضرر است، اما با دستورات دیگر، ممکن است یک مشکل باشد. دیدن
makepp_build_check برای جزئیات مربوط به "ignore_action".)

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

ساقه
$* ساقه در یک قانون الگو (یعنی هرچه که '%' مطابقت داشته باشد). متناوبا، اگر این
یک قانون الگو نیست، نام فایل را بدون پسوند برمی گرداند (یعنی این است
معادل "$(نام پایه $(ورودی))".

این بیشتر برای سازگاری با عقب است. به عنوان مثال، در نسخه های قدیمی make the
تنها راه برای گفتن اینکه چگونه هر کدام را کامپایل کند .c فایل مربوطه .o فایل شبیه بود
این:

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

این یک راه بد برای نوشتن قانون است. استفاده از سبک GNU-make بسیار واضح تر است
قوانین الگو، مانند این:

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

برای هر
نام فایل فعلی از عبارت "foreach". بندهای "foreach" به ندرت استفاده می شوند،
اما آنها کلی ترین نوع قانون الگو هستند که makepp از آن پشتیبانی می کند. برای
مثال،

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

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

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

برای جزئیات و مثال های بیشتر به مستندات مربوط به بند foreach در قوانین مراجعه کنید.

$/ این در اصل یک ثابت است، یا "/"، یا در ویندوز بومی "\". شما به آن نیاز دارید، اگر
شما می خواهید یک برنامه را به صورت قابل حمل راه اندازی کنید، به عنوان مثال برنامه ای که در دایرکتوری فعلی ساخته اید:

خروجی من:
.$/myprog >$(خروجی)

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

گزینه متغیر
می‌توانید این موارد را به روش‌هایی که در بالا توضیح داده شد تنظیم کنید (به استثنای مواردی که خلاف آن ذکر شده باشد) برای اصلاح
رفتار makepp. به طور پیش فرض همه آنها تعریف نشده اند.

MAKEPP_DEBUG
اگر قبل از فراخوانی makepp، آن را با مقدار واقعی صادر کنید، اشکال زدایی بیشتری خواهید داشت
اطلاعات این "RULE_SOURCE" از فایل‌هایی است که در زمانی که این مورد در حال اجرا است ساخته شده است
makeppinfo، mppi و جزئیات مربوط به بسط متغیر و تطبیق قوانین در زیر
makepplog، mppl. این همچنین به شما نشان می دهد که حافظه makepp تمام می شود یا هنگ می کند.
زیرا به طور بی پایان همان متغیرها را گسترش می دهد:

A = $A # ارزیابی معوق، نیاز به :=
B = C $
C = B $

MAKEPP_LN_CP
به یادداشت زیر &ln مراجعه کنید.

makepp_percent_subdirs
این را روی مقداری واقعی (مانند 1) تنظیم کنید تا "%" در اهداف یا وابستگی ها مطابقت داشته باشد
در بیش از یک دایرکتوری

makepp_require_phony
این را روی مقدار واقعی (مانند 1) تنظیم کنید تا از ساختگی ضمنی جلوگیری کنید (به عنوان مثال اگر یک قانون باشد
بدون تولید هدف خود موفق می شود). این متغیر باید به طور پیش فرض true باشد
از شکسته شدن زنجیره‌های وابستگی جلوگیری می‌کند، اما این امر سازگاری رو به عقب را از بین می‌برد
فایل های آرایشی درهم و برهم

makepp_signature_C_flat
این گزینه ای برای امضای C است. این را روی مقداری واقعی (مانند 1) تنظیم کنید تا با شما رفتار شود
منابع به صورت مسطح، یعنی تمام خطوط جدید (به جز در اطراف دستورات پیش پردازنده) هستند
مانند فضای خالی رفتار می شود و دستورالعمل های "#خط" نادیده گرفته می شوند.

makepp_simple_concatenation
این را روی مقداری واقعی (مانند 1) تنظیم کنید تا از "جایگزینی به سبک rc" جلوگیری کنید.

PERL
می‌توانید این را دقیقاً روی پرلی که برای اجرای اسکریپت‌ها در makepp استفاده می‌کنید تنظیم کنید
مجموعه، و آن را صادر کنید. این می تواند به اجرای زیر اسکریپت ها با همان perl کمک کند. این هست
بیشتر برای مجموعه آزمایشی، نصب و برای ساخت های بازگشتی مفید است.

VPATH
تنظیم این متغیر به مقداری به طور ضمنی "vpath % value" را فراخوانی می کند.

از پیش تعریف شده متغیر
Makepp چند متغیر از پیش تعریف می کند که می توانید آنها را لغو کنید:

AR پیش فرض: "ار".

ARFLAGS
پیش فرض: "rv".

AS پیش فرض: "مانند".

CC پیش فرض: اولین مورد در میان "gcc"، "egcc"، "pgcc"، "c89" یا "cc" یا در ویندوز یافت شد.
علاوه بر این، "cl" یا "bcc32".

CFLAGS
پیش فرض: اگر "$(CC)" یک کامپایلر گنو "-g -Wall" باشد، اگر یکی از دو ویندوز باشد.
کامپایلرها هیچ چیز، در غیر این صورت "-g".

CURDIR
دایرکتوری که Makefile فعلی در آن قرار دارد.

CXX پیش فرض: اولین مورد در میان "g++"، "c++"، "pg++"، "cxx"، "C""C" یا "aCC"، یا در
ویندوز علاوه بر "cl" یا "bcc32".

CXXFLAGS
پیش فرض: اگر "$(CXX)" یک کامپایلر گنو "-g -Wall" باشد، اگر یکی از دو ویندوز باشد.
کامپایلرها هیچ چیز، در غیر این صورت "-g".

F77 پیش فرض: اولین مورد در میان "f77"، "g77" یا "fort77" یافت شد.

FC پیش فرض: "$(F77)".

LD پیش فرض: "ld".

لکس پیش فرض: اولین مورد در میان "lex" یا "flex" یافت می شود.

LIBTOOL
پیش فرض: "libtool".

خلق کنید
این متغیر بسته به وجود یا نبودن دو مقدار متفاوت دارد
"--سنتی- بازگشتی-ساخت". Makepp تشخیص می دهد که چه زمانی از این متغیر استفاده می شود و
برخی از ویژگی‌ها را خاموش می‌کند، حتی قبل از اینکه بازگشت واقعی انجام شود. این میتواند باشد
نامطلوب در حالی که به تدریج آن را حذف می کنید، بنابراین ابتدا تماس ها را به a تبدیل کنید
makepp خاص "$((MAKE))"، که ویژگی ها را خاموش نمی کند. شما نباید آن را تنظیم کنید
زیرا این کار بازگشت هوشمند ما را در اطراف می شکند.

MAKECMDGOALS
این متغیر تنظیم شده است اما توسط makepp استفاده نمی شود. شما می توانید آن را پرس و جو برای انجام کاری تنها اگر
هدف خاصی درخواست شد

پیش فرض: هر هدف صریحی که کاربر (یا یک فراخوان بازگشتی) ارائه کرده است.
هنگام ساختن ضمنی هدف پیش فرض خالی است.

ifneq $(فیلتر هدف ویژه، $(MAKECMDGOALS))
# target-special یکی از اهداف صریح فعلی است
else ifeq $(MAKECMDGOALS)
# بدون هدف صریح
انتهایی

MAKEFLAGS (صادراتی)
گزینه های استانداردی که makepp با آنها فراخوانی شد. آنهایی که یک حرف دارند
فرم ها در ابتدا بدون "-" پیشرو ترکیب می شوند (بهشت می داند که چرا gmake انتخاب کرد
برای انداختن "-").

MAKEINFO
پیش فرض: "ساخت اطلاعات".

MAKEPPFLAGS (صادرات شده)
این مقدار به همان مقدار MAKEFLAGS تنظیم می شود، اما تنها در صورتی که این متغیر در آن موجود باشد
محیط makepp.

_MAKEPPFLAGS (صادرات شده)
گزینه های خاص makepp مورد نیاز برای سازگاری POSIX/gmake، که با آن makepp
نامیده می شد. اینها در یک متغیر جداگانه هستند، بنابراین یک فایل قدیمی نمی‌تواند شکسته شود
سازگاری با لغو تنظیم MAKEFLAGS. این فقط با تنظیم شده است
"--سنتی- بازگشتی-ساخت".

MAKEPP_VERSION
نسخه makepp که با آن اجرا می کنید. اگر نسخه بتا باشد دارای a
خط تیره و به دنبال آن YYMMDD به اضافه برخی داده های داخلی دیگر. می توانید از این برای "ifdef" استفاده کنید
برای مخفی کردن سازه های خاص makepp از ساخت های دیگر.

پیش فرض: همان مقدار نمایش داده شده توسط "makepp --version"

PWD نام مستعار "CURDIR".

RM پیش فرض: "rm -f". این برای Makefiles قدیمی در نظر گرفته شده است. برای موارد جدید ترجیحا استفاده کنید
دستور &rm داخلی به طور مستقیم. اگر می‌خواهید یک قانون تمیز ساختگی بنویسید، نگاه کنید
در عوض دستور makeppclean -r.

ریشه
مسیر نسبی به ریشه سیستم ساخت شما، یعنی دایرکتوری بالاتر در
که شما یک "RootMakeppfile(.mk)" دارید. اگر یکی ندارید، این متغیر است
خالی.

پوسته
این متغیر فقط در صورتی قابل احترام است که آن را "صادرات" کنید. در این صورت آن Shell است
که برای اجرای اکشن های ساخته نشده با کاراکتر خاصی در آن استفاده می شود (plain
آنهایی که مستقیماً اجرا می شوند). در Windows Strawberry یا ActiveState Perl، اگر دارید
یک پوسته یونیکس مانند، در عوض باید متغیر SHELL خود را روی مقداری تنظیم کنید که به "sh" ختم می شود.
یا "sh.exe" قبل از تماس با makepp.

پیش فرض: اولین مورد در میان "/usr/xpg4/bin/sh" (به عنوان مثال سولاریس) یا "/sbin/xpg4/sh" یافت شد.
(به عنوان مثال Reliant Unix) یا "/ بن / شل".

YACC
پیش فرض: اولین مورد در میان "bison -y" یا "yacc" یافت شد.

متغیر و پرل
مقادیر متغیر به عنوان اسکالرهای پرل معمولی ذخیره می شوند، بنابراین می توانید مستقیماً به آنها دسترسی داشته باشید
کد پرل اگر نیاز به انجام هر گونه دستکاری پیچیده با آنها دارید. makepp_extending را ببینید
برای جزئیات بیشتر.

دسترسی به متغیرهای سراسری از پرل با قرار دادن پیشوند آنها با "Mpp::global" به دست می آید.
بسته بندی در واقع هر متغیری که هنوز در makefile فعلی وجود ندارد و شما
assign to در این بسته از آن زمان به بعد جهانی خواهد شد، گویی که شما به تازگی آن را صادر کرده اید
بیانیه "جهانی" برای آن.

با این حال، این دسترسی مستقیم مستعد خطا است! کاربر ممکن است این متغیرها را نادیده گرفته باشد
در خط فرمان یا از طریق محیط. قبل از این، برخی از فایل‌های ایجاد شده دیگر بارگذاری شده‌اند
ممکن است یکی متغیر را جهانی یا هدف خاص کرده باشد. در این موارد شما نمی خواهید
مقدار متغیر را بیابید یا در هنگام تخصیص آن، ممکن است ویژگی آن را از بین ببرید
(معادل یک اصلاح کننده "نسخه"، به جز برای مشخصات هدف.)

با دسترسی مستقیم، گسترش این متغیرها را نیز دور می‌زنید، اگر از نوع باشند
"=" یا ";=". متغیرهای ویژه مانند "$(CC)" به عنوان توابع شروع می شوند، تا زمانی که وارد شوند
اختصاص یافته به. بنابراین در بسیاری از موارد ارزش آنها را نخواهید دید.

به این دلایل بهتر است به makepp اجازه دهیم مقدار صحیح را تعیین کند. می توانید استفاده کنید
نوع "makeperl" که در آن متغیر قبل از دریافت کد پرل ارزیابی شده است
تفسیر کرد:

makeperl { $$current_value = '$(MAKEFILE_VAR)' }

اگر به یک متغیر در بلوک‌های makefile perl نیاز دارید، از طریق متغیر Perl به دست می‌آید
$makefile به شرح زیر است:

perl { $current_value = $makefile->expand_variable( 'MAKE_VAR') }

توابع همیشه شی makefile را به عنوان آرگومان دوم $_[1] دریافت می کنند:

sub f_f {$current_value = $_[1]->expand_variable('MAKE_VAR') }

قرار است دستورات در یک عمل قانون فراخوانی شوند، جایی که شی makefile در آن قرار دارد
قابل دسترسی از طریق "$Mpp::Subs::rule->{MAKEFILE}":

زیر c_cmd { $current_value = $Mpp::Subs::rule->{MAKEFILE}->expand_variable( 'MAKE_VAR' ) }

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


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

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

  • 1
    بسیار تمیز
    بسیار تمیز
    یک اسکریپت کاتلین که تمام ساخت‌ها را هسته‌ای می‌کند
    حافظه پنهان از پروژه های Gradle/Android.
    زمانی مفید است که Gradle یا IDE به شما اجازه دهند
    پایین. اسکریپت روی تست شده است
    macOS، اما ...
    دانلود عمیق تمیز
  • 2
    پلاگین Eclipse Checkstyle
    پلاگین Eclipse Checkstyle
    پلاگین Eclipse Checkstyle
    کد جاوا Checkstyle را یکپارچه می کند
    حسابرس به Eclipse IDE. در
    پلاگین بازخورد در زمان واقعی را به شما ارائه می دهد
    کاربر در مورد viol...
    دانلود Eclipse Checkstyle Plug-in
  • 3
    AstrOrzPlayer
    AstrOrzPlayer
    AstrOrz Player یک پخش کننده رسانه رایگان است
    نرم افزار، بخشی مبتنی بر WMP و VLC. این
    پخش کننده به سبک مینیمالیستی است، با
    بیش از ده رنگ تم، و همچنین می توانید
    ب ...
    AstrOrzPlayer را دانلود کنید
  • 4
    movistartv
    movistartv
    Kodi Movistar+ TV بدون ADDON برای XBMC/
    Kodi que Permite disponer de un
    رمزگشایی خدمات IPTV
    Movistar integrado en uno de los
    مراکز رسانه ای ما...
    دانلود movistartv
  • 5
    کد :: بلوک
    کد :: بلوک
    کد::Blocks یک منبع باز و رایگان است،
    کراس پلتفرم C، C++ و Fortran IDE
    ساخته شده برای پاسخگویی به بیشترین نیازها
    از کاربران آن بسیار طراحی شده است
    تمدید می کند ...
    کد دانلود::Blocks
  • 6
    در میان
    در میان
    در میان یا رابط پیشرفته Minecraft
    و Data/Structure Tracking ابزاری برای
    نمای کلی یک Minecraft را نمایش دهید
    جهان، بدون اینکه واقعاً آن را ایجاد کند. آی تی
    می توان ...
    دانلود در میان
  • بیشتر "

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

Ad