logo

لينكس جعل الأمر

لينكس يصنع يتم استخدام الأمر لبناء وصيانة مجموعات من البرامج والملفات من التعليمات البرمجية المصدر. في Linux، يعد هذا أحد الأوامر الأكثر استخدامًا من قبل المطورين. يساعد المطورين على تثبيت وتجميع العديد من الأدوات المساعدة من المحطة. علاوة على ذلك، فإنه يتعامل مع عملية تجميع المشاريع الكبيرة. أنه يوفر وقت التجميع.

الدافع الرئيسي لأمر make هو تقسيم برنامج كبير إلى أجزاء والتحقق مما إذا كان يحتاج إلى إعادة ترجمته أم لا. كما أنه يصدر الأوامر اللازمة لإعادة ترجمتها.

في هذا القسم، سنستخدم برامج C++ نظرًا لأن لغة برمجة C++ هي لغة موجهة للكائنات، ولكن يمكنك استخدام أي لغة مثبتة على جهازك. ولا يقتصر الأمر على البرامج فقط؛ يمكننا استخدامه لوصف المهام الأخرى أيضا.

كيف يعمل الأمر؟

يأخذ الأمر make الأهداف كوسيطات. تم تحديد هذه الوسائط في 'Makefile'. يحتوي ملف makefile على الأهداف بالإضافة إلى الإجراءات المرتبطة بهذه الأهداف.

عندما ننفذ أمر make، فإنه يبحث عن ملف makefile ويفحصه للعثور على الهدف والوصول إلى تبعياته. إذا لم يتم تحديد التبعيات، فسوف يبحث عن التبعية ويقوم بإنشائها. سيتم بناء الهدف الرئيسي بعد بناء التبعيات.

على سبيل المثال، إذا أردنا تغيير ملف مصدر واحد فقط وقمنا بتنفيذ أمر make؛ لذلك، سيؤدي هذا إلى تجميع ملف الكائن المتصل بهذا الملف المصدر فقط. سيوفر الكثير من الوقت في التجميع النهائي للمشروع.

ما هو ملف Makefile؟

يستدعي أمر make تنفيذ ملف makefile. وهو ملف خاص يحتوي على أوامر الصدفة التي نقوم بإنشائها لصيانة المشروع. يحتوي ملف makefile على أهداف وأوامر للتنفيذ. لا يجوز إنشاء أكثر من ملف تعريف واحد. يوصى بإنشاء دليل منفصل له.

فهو يتتبع الملفات الحديثة، لذا قم بتحديث الملفات المطلوبة فقط. إذا كان لدينا برنامج كبير يحتوي على العديد من الملفات المصدرية، فيجب علينا إعادة ترجمة جميع الملفات التابعة. لذلك، قد تكون عملية تستغرق وقتا طويلا للغاية.

يحتوي makefile على قائمة بالمعايير. هذه المعايير مفيدة للنظام لفهم الأمر الذي نريد تنفيذه. وتنقسم هذه المعايير إلى جزأين ويفصل بينهما سطر جديد. السطر الأول هو خط التبعية, والسطور اللاحقة تعتبر الإجراءات أو الأمر س. يتم فصل الأوامر بعلامة تبويب في السطر الجديد.

ال التبعيات تحديد علاقة كل ملف بالملفات المصدر. و ال هدف هو ملف قابل للتنفيذ، ويتم إنشاؤه بعد تنفيذ أمر make.

خيارات

يسهل أمر make الخيارات المختلفة لجعله أكثر تحديدًا. بعض الخيارات المهمة هي كما يلي:

    -بي ام:تُستخدم هذه الخيارات لتجاهل التوافق مع الإصدارات المختلفة لأمر make.-ب، --دائما-جعل:يتم استخدام هذه الخيارات لتحقيق جميع الأهداف دون قيد أو شرط.-C دير، --directory=dir:تُستخدم هذه الخيارات لتغيير الدليل قبل تنفيذ ملف التعريف.-د:يتم استخدامه لطباعة معلومات التصحيح.--تصحيح الأخطاء[=الأعلام]:يتم استخدامه لطباعة معلومات التصحيح مع المعالجة العادية. إذا تخطينا العلامة، فسوف تظهر نتائج مشابهة للخيار '-d'.-e، --environment-overrides:يتم استخدامه لتوفير المتغيرات المأخوذة من أسبقية البيئة إلى ملف makefile.-f ملف، --file=file، --makefile=FILE:يتم استخدامه لاستخدام ملف كملف makefile.-i، --تجاهل الأخطاء:يتم استخدام الخيار '-i' لتجاهل كافة الأخطاء في الأوامر.-أنا دير، --include-dir=dir:يتم استخدامه لتحديد دليل للبحث عن ملف التعريف المحدد. إذا قمنا بتحديد العديد من الخيارات '-I'، فسيتم البحث في العديد من الأدلة بالترتيب المحدد.-j [وظائف]، --jobs[=jobs]:يتم استخدامه لتحديد عدد المهام التي سيتم تشغيلها في وقت واحد. إذا قمنا بتوفير العديد من الخيارات '-j'، فسيتم اعتبار الخيار الأخير قيد التنفيذ. إذا لم نحدد عدد الوظائف، فلن يحد ذلك من الوظائف التي يمكن تشغيلها في وقت واحد.-ك، --استمر:يتم استخدامه لمواصلة البرنامج قدر الإمكان بعد الحصول على خطأ.-l [تحميل]، --متوسط ​​التحميل[=تحميل]:يتم استخدامه لتحديد عدم بدء أي مهمة جديدة إذا كانت هناك مهام أخرى في قائمة الانتظار وكان متوسط ​​التحميل عند الحد الأدنى.-n، --just-print، --dry-run، --recon:يتم استخدامه لعرض الأمر الذي سيتم تشغيله.-o ملف، --old-file=file، --assume-old=file:يتم استخدامه للتأكد من أن عملية التصنيع لن تقوم بإعادة إنشاء الملف حتى لو كان أقدم من تبعياته.-O[نوع]، --output-sync[=type]:يتم استخدامه للتأكد من تجميع مخرجات كل مهمة معًا بدلاً من المخرجات المختلطة للمهام الأخرى. إنه مفيد لمعالجة المهام المتعددة باستخدام الخيار '-j'.-p، --طباعة قاعدة البيانات:يتم استخدامه لطباعة قاعدة البيانات التي يتم إنتاجها بعد قراءة ملفات التعريف. من المفيد أيضًا طباعة معلومات الإصدار عند استخدامها مع الخيار '-v'. لطباعة قاعدة البيانات دون محاولة إعادة إنشاء أي ملفات، قم بتنفيذ الأمر كما يلي:
    جعل -p -f/dev/null.-س، --السؤال:يتم استخدام الخيار '-q' لـ وضع السؤال. لن يقوم بتشغيل أي أمر أو طباعة أي شيء. لن يُرجع إلا حالة الخروج صفر إذا كان الهدف المحدد متزامنًا بالفعل؛ وإلا فسيتم عرض حالة خروج غير صفرية.-r، --لا توجد قواعد مدمجة:يتم استخدامه للتخلص من استخدام القواعد الضمنية المضمنة.-R، --لا توجد متغيرات مدمجة:يكون ذلك مفيدًا إذا لم نرغب في تحديد أي متغير مدمج.-s، --صامت، --هادئ:تسمى هذه الخيارات عملية صامتة. يقتصر على طباعة الأوامر أثناء تنفيذها.-S، --لا-استمر، --توقف:يتم استخدامه لإلغاء تأثير العملية '-k, --keep-going'.-ر، --لمس:يتم استخدامه للمس الملفات بدلاً من تشغيل أوامرها.--يتعقب:يتم استخدامه لتتبع التصرف في كل هدف.-v، --الإصدار:يتم استخدامه لطباعة الإصدار المثبت من الأداة المساعدة. علاوة على ذلك، فإنه يعرض قائمة بالمؤلفين وحقوق الطبع والنشر وبعض الإشعارات المتعلقة بأداة الصنع.-w، --دليل الطباعة:يتم استخدامه لتتبع رسالة الطباعة التي تحتوي على دليل العمل قبل وبعد المعالجة الأخرى. من المفيد تتبع الأخطاء من خلال البنية المعقدة لأمر make العودي.--لا يوجد دليل للطباعة:يتم استخدامه لإيقاف تشغيل الخيار '-w'.-ملف W، --what-if=file، --new-file=file، --assume-new=file:تتظاهر هذه الخيارات بأن الملف الهدف قد تم تعديله للتو.--تحذير-متغيرات غير محددة:يُستخدم هذا الخيار للتحذير من الإشارة إلى متغير غير محدد.

دعونا نفهم بعض الأمثلة على الأمر make. سنرى الاستخدام الأساسي لملف makefile، علاوة على ذلك، سننشئ بعض برامج c++ وmakefile. سنقوم بإجراء بعض العمليات عليها لفهم الأمر make بشكل أفضل.

اجتياز الشجرة

الاستخدام الأساسي لأمر make

دعونا نفهم الاستخدام الأساسي لأمر make، وقد يساعدك ذلك على فهم كيفية عمله.

قم بإنشاء دليل 'مشروع' وقم بتغيير الدليل إليه. خذ بعين الاعتبار الأوامر التالية:

 mkdir project cd project 

الآن قم بإنشاء 'ملف تعريفي' وجود المحتوى التالي للبرنامج الأول:

 say_hello: echo 'Hello World!' 

من الملف أعلاه، فإن say_hello هو هدف يتصرف كدالة في أي لغة برمجة، وسيتم اعتبار الصدى بمثابة إجراء. يجب أن نتذكر أنه يجب كتابة الإجراء باستخدام ملف فاتورة غير مدفوعة. يقوم الهدف والإجراء معًا بإنشاء قاعدة لملف التعريف. الآن قم بتنفيذ أمر make كما يلي:

النظر في الإخراج أدناه:

لينكس جعل الأمر

من الناتج أعلاه، يمكننا أن نرى عملية الصدى نفسها تظهر. إذا لم نرغب في عرض أمر الصدى على المخرجات، فقم بتنفيذ الصدى بدءًا من '@' رمز. لمنع الصدى، قم بتحديث محتوى makefile كما يلي:

 say_hello: @echo 'Hello World!' 

النظر في الإخراج أدناه:

لينكس جعل الأمر

قد يكون الهدف ملفًا ثنائيًا يعتمد على الإجراءات.

دعونا نضيف المزيد من الأهداف، مثل إنشاء وإدراج في ملف makefile. قم بتحديث ملف makefile كما يلي:

 say_hello: @echo 'Hello World!' generate: @echo 'Creating files' touch file-{1..5}.txt list: @echo 'Listing files' ls 

إذا قمنا بتنفيذ أمر make، فإنه ينفذ الهدف الأول فقط لأنه الهدف الافتراضي لملف makefile. النظر في الإخراج أدناه:

رد فعل البرنامج التعليمي JS
لينكس جعل الأمر

يمكننا تغيير الهدف الافتراضي من خلال تضمين المحتوى أدناه في ملف التعريف الخاص بنا:

 .DEFAULT_GOAL := generate 

أضفه إلى السطر الأول من الملف كما يلي:

لينكس جعل الأمر

سوف يعتبر ملف makefile أعلاه 'إنشاء' هو الهدف الافتراضي. قم بتنفيذ أمر make، وسيعطي الإخراج كما يلي:

لينكس جعل الأمر

سيقوم خيار DEFAULT GOAL بتنفيذ هدف واحد فقط لتحديد أكثر من هدف لاستخدام جميع الخيارات. لتحديد أكثر من هدف، قم بتحديث السطر الأول من ملف التعريف كما يلي:

 all: say_hello generate 

سيتم تنفيذ الهدف المحدد. النظر في الإخراج أدناه:

لينكس جعل الأمر

هناك خيار آخر يسمح لنا بتنفيذ جميع الأهداف. إذا أردنا تنفيذ جميع أهداف ملف makefile، فقم بتحديث الملف على النحو التالي:

 .PHONY: all say_hello generate list say_hello: @echo 'Hello World!' generate: @echo 'Creating files' touch file-{1..5}.txt list: @echo 'Listing files' ls 

سيقوم الملف أعلاه بتنفيذ كافة الأهداف المحددة. قم بتنفيذ أمر make، وفكر في الإخراج أدناه:

لينكس جعل الأمر

الاستخدام المتقدم لأمر make

لنقم بإنشاء مشروع C++ يحتوي على الملفات main.cpp وfunction1.cpp وfunction2.cpp وملف التبعية function.h.

رمز الملفات هو كما يلي:

ما هو 25 من 100

main.cpp:

 #include #include 'functions.h' int main() { print_hello(); std::cout<< std::endl; std::cout<< 'The factorial of 5 is' << factorial(5) << std:: endl; return 0; } 

function1.cpp:

 #include 'functions.h' int factorial(int n) { if(n!=1) { return (n * factorial(n-1)); } else return 1; } 

function2.cpp:

 #include #include 'functions.h' void print_hello() { std::cout << 'Hello World'; } 

وظائف.ح:

 void print_hello(); int factorial (int n); 

الآن قم بإنشاء ملف قابل للتنفيذ للمشروع أعلاه عن طريق تنفيذ الأمر أدناه:

 g++ main.cpp function1.cpp function2.cpp -o hello 

سيقوم الأمر أعلاه بإنشاء ملف قابل للتنفيذ 'مرحبًا' من الملفات main.cpp وfunction1.cpp وfunction2.cpp.

النظر في الإخراج أدناه:

لينكس جعل الأمر

من الناتج أعلاه، إذا تم تنفيذه بنجاح، فلن يعطي أي ناتج.

لنقم بتنفيذ نفس المهمة باستخدام ملف makefile.

قم بإنشاء ملف باسم ملف تعريف ووضع الكود أدناه فيه.

 all: g++ main.cpp function1.cpp function2.cpp -o hello 

يتم استخدام الكلمة الأساسية all للهدف وفي السطر الجديد ضع نفس الأمر مع علامة التبويب TAB كما هو مذكور أعلاه لتحديد العملية. حفظ الملف. النظر في الملف أدناه:

لينكس جعل الأمر

للتشغيل، قم بتنفيذ الأمر كما يلي:

شار توسترينغ جافا
 make 

سيقوم الأمر أعلاه بإنشاء ملف قابل للتنفيذ 'مرحبًا' من الملفات المحددة. النظر في الإخراج أدناه:

لينكس جعل الأمر

دعونا نضيف المزيد من المهام إلى Makefile. أضف مهمة 'تجميع' على النحو التالي:

 all: compile: g++ main.cpp function1.cpp function2.cpp -o hello 

لتنفيذ المهمة تجميع, قم بتنفيذ الأمر أدناه:

 make compile 

سيقوم الأمر أعلاه بتنفيذ مهمة الترجمة. النظر في الإخراج أدناه:

لينكس جعل الأمر

دعونا نؤدي المزيد من المهام إلى ملف makefile الخاص بنا.

قم بتحديث Makefile كما يلي:

 all: hello hello: main.o function1.o function2.o g++ main.o function1.o function2.o -o hello main.o: main.cpp g++ -c main.cpp function1.o: function1.cpp g++ -c function1.cpp function2.o: function2.cpp g++ -c function2.cpp clean: rm -rf *o hello 

من ملف makefile أعلاه، قمنا بإنشاء ثلاثة كائنات مثل main.o، وfunction1.o، وfunction2.o. علاوة على ذلك، قمنا بتوفير التبعيات للأهداف main.o، وfunction1.o، وfunction2.o مثل main.cpp، وfunction1.cpp، وfunction2.cpp على التوالي. ستقوم جميع الأهداف بتنفيذ المهام المحددة داخلها. لقد حددنا أيضًا هدفًا نظيفًا لتنظيف جميع التبعيات وإزالة الملف القابل للتنفيذ.

الآن قم بتنفيذ الأمر make all لتنفيذ ملف makefile الجديد الخاص بنا.

 make all 

النظر في الإخراج أدناه:

لينكس جعل الأمر

من الناتج أعلاه، يمكننا أن نرى أن الأمر نفذ أولاً main.o وfunction1.o وfunction2.o على التوالي. سيقوم بإنشاء الملف القابل للتنفيذ وملف الكائنات للملفات المحددة. لن يتم تنفيذ الهدف النظيف لأننا لم نحدده في hello. النظر في الملفات أدناه:

لينكس جعل الأمر

يحتوي أمر make على عملية عمل مباشرة. لقد نفذ خيار الكل وذهب إلى مرحبًا. بعد تنفيذ الترحيب، يتم قراءة الهدف بالتسلسل المحدد. لقد بحث في كل هدف وتبعياته ونفذها بالتسلسل.

لإزالة الكائنات والملف القابل للتنفيذ، قم بتنفيذ المهمة النظيفة. لتنفيذ المهمة النظيفة، قم بتنفيذ الأمر كما يلي:

 make clean 

النظر في الإخراج أدناه:

لينكس جعل الأمر

سيقوم الأمر أعلاه بإزالة كافة الكائنات والملفات القابلة للتنفيذ. انظر الصورة أدناه للدليل:

لينكس جعل الأمر

من الصورة أعلاه، يمكننا أن نرى أننا قمنا بتنظيف الدليل الخاص بنا.

المتغيرات في أمر make

يمكننا تحديد المتغيرات في ملف تعريفنا. لتحديد المتغيرات استخدم '=' المشغل أو العامل. على سبيل المثال، إذا أردنا إنشاء متغير A وتعيين أمر gcc له، فقم بتعيينه على النحو التالي:

كيفية ترقية جافا
 A=g++ 

استخدامه على النحو التالي في makefile لدينا:

 hello: hello.cpp ${A} hello.cpp -o hello 

يتم تمريره إلى المحطة على النحو التالي:

 g++ hello.cpp -o hello 

يمكننا استخدام $(A) بدلاً من ${A}، حيث يتم التعامل مع كليهما بنفس الطريقة بواسطة البرنامج النصي.

التعليقات في ملف makefile

لإضافة تعليق إلى ملف makefile، استخدم '#' رمز. على سبيل المثال، لإضافة تعليق في قسم الترجمة، قم بإضافته كـ '# هذا سوف يقوم بتجميع البرنامج .' يتم تجاهل التعليقات من قبل المترجم.