لينكس يصنع يتم استخدام الأمر لبناء وصيانة مجموعات من البرامج والملفات من التعليمات البرمجية المصدر. في Linux، يعد هذا أحد الأوامر الأكثر استخدامًا من قبل المطورين. يساعد المطورين على تثبيت وتجميع العديد من الأدوات المساعدة من المحطة. علاوة على ذلك، فإنه يتعامل مع عملية تجميع المشاريع الكبيرة. أنه يوفر وقت التجميع.
الدافع الرئيسي لأمر make هو تقسيم برنامج كبير إلى أجزاء والتحقق مما إذا كان يحتاج إلى إعادة ترجمته أم لا. كما أنه يصدر الأوامر اللازمة لإعادة ترجمتها.
في هذا القسم، سنستخدم برامج C++ نظرًا لأن لغة برمجة C++ هي لغة موجهة للكائنات، ولكن يمكنك استخدام أي لغة مثبتة على جهازك. ولا يقتصر الأمر على البرامج فقط؛ يمكننا استخدامه لوصف المهام الأخرى أيضا.
كيف يعمل الأمر؟
يأخذ الأمر make الأهداف كوسيطات. تم تحديد هذه الوسائط في 'Makefile'. يحتوي ملف makefile على الأهداف بالإضافة إلى الإجراءات المرتبطة بهذه الأهداف.
عندما ننفذ أمر make، فإنه يبحث عن ملف makefile ويفحصه للعثور على الهدف والوصول إلى تبعياته. إذا لم يتم تحديد التبعيات، فسوف يبحث عن التبعية ويقوم بإنشائها. سيتم بناء الهدف الرئيسي بعد بناء التبعيات.
على سبيل المثال، إذا أردنا تغيير ملف مصدر واحد فقط وقمنا بتنفيذ أمر make؛ لذلك، سيؤدي هذا إلى تجميع ملف الكائن المتصل بهذا الملف المصدر فقط. سيوفر الكثير من الوقت في التجميع النهائي للمشروع.
ما هو ملف Makefile؟
يستدعي أمر make تنفيذ ملف makefile. وهو ملف خاص يحتوي على أوامر الصدفة التي نقوم بإنشائها لصيانة المشروع. يحتوي ملف makefile على أهداف وأوامر للتنفيذ. لا يجوز إنشاء أكثر من ملف تعريف واحد. يوصى بإنشاء دليل منفصل له.
فهو يتتبع الملفات الحديثة، لذا قم بتحديث الملفات المطلوبة فقط. إذا كان لدينا برنامج كبير يحتوي على العديد من الملفات المصدرية، فيجب علينا إعادة ترجمة جميع الملفات التابعة. لذلك، قد تكون عملية تستغرق وقتا طويلا للغاية.
يحتوي makefile على قائمة بالمعايير. هذه المعايير مفيدة للنظام لفهم الأمر الذي نريد تنفيذه. وتنقسم هذه المعايير إلى جزأين ويفصل بينهما سطر جديد. السطر الأول هو خط التبعية, والسطور اللاحقة تعتبر الإجراءات أو الأمر س. يتم فصل الأوامر بعلامة تبويب في السطر الجديد.
ال التبعيات تحديد علاقة كل ملف بالملفات المصدر. و ال هدف هو ملف قابل للتنفيذ، ويتم إنشاؤه بعد تنفيذ أمر make.
خيارات
يسهل أمر make الخيارات المختلفة لجعله أكثر تحديدًا. بعض الخيارات المهمة هي كما يلي:
جعل -p -f/dev/null.
دعونا نفهم بعض الأمثلة على الأمر 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، استخدم '#' رمز. على سبيل المثال، لإضافة تعليق في قسم الترجمة، قم بإضافته كـ '# هذا سوف يقوم بتجميع البرنامج .' يتم تجاهل التعليقات من قبل المترجم.