بعد تشغيل make، لم يظهر الملف القابل للتنفيذ. Makefile للصغار

11.04.2019

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

تشغيل الأداة المساعدة make

يبدو سطر الأوامر الخاص بتشغيل الأداة المساعدة make كما يلي:

جعل [الخيارات] [المتغيرات] [build_targets]

الخيارات - المعلمات التي تحدد شروطًا إضافية عند تنفيذ القواعد. تبدأ الخيارات دائمًا بعلامة "-".

على سبيل المثال:

جعل -f aaa -s -v

يؤدي إلى طباعة الأوامر التي تم إنشاؤها بواسطة make دون تنفيذها فعليًا

يمنع إخراج أسطر الأوامر قبل تنفيذها (إذا كان الأمر المضمن في القاعدة يبدأ بـ @، فلن تتم طباعته)

يتجاوز تأثير الخيار –k. هذا ضروري فقط عند تشغيل الإجراء بشكل متكرر.

يرشد إلى تجاهل الأخطاء (يتم تجاهل الخطأ أيضًا إذا سطر الأوامرفي ملف الوصف يبدأ بعلامة الطرح)

يحدد الدلائل للبحث عن ملفات makefiles المضمنة. إذا تم تحديد عدة مسارات مختلفة، فسيتم إجراء البحث بالترتيب الذي تم إدراجها به.

عند حدوث خطأ، تتوقف الأوامر المرتبطة بالتبعية الحالية عن العمل، ولكن تستمر معالجة التبعيات الأخرى

F اسم الملف

يحدد اسم ملف التعريفات (مثال: make -f mymakefile)

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

يتم التنقل في الدليل ديرقبل قراءة ملف makefile. في حالة تكرار استخدام الخيار -C فإن كل واحد منهم يرتبط بالخيار السابق: -C / -C إلخ يعادل -C /etc. يُستخدم هذا غالبًا عند الاتصال بشكل متكرر.

يعطي لمتغيرات الصدفة أولوية أعلى من متغيرات makefile.

تعطيل القواعد المضمنة (الافتراضي). مسح قائمة اللاحقة الافتراضية.

طباعة نسخة من الصنع

طباعة اسم الدليل الحالي

عادةً ما يتم الخروج إذا قام أي أمر بإرجاع رمز خروج غير صفري (غالبًا ما يكون علامة خطأ).

لا يلزم تحديد الخيارات في سطر الأوامر؛ بل يمكن وضعها في متغير البيئة أعلام مصنعة. يتم التعامل معه على أنه يحتوي على أي من الخيارات الصالحة (باستثناء -f بالطبع). عند تشغيل make، تتم إضافة الخيارات المحددة في سطر الأوامر إليه.

المتغيرات هي معلمات تسمح لك بتعيين قيم جديدة للمتغيرات التي تم إنشاؤها بالفعل أو تحديد متغيرات جديدة يمكن استخدام قيمها عند تنفيذ القواعد. المتغيرات المحددة في سطر الأوامر لها الأسبقية على المتغيرات المحددة في ملف التعريف.

على سبيل المثال:

makeABC=”aaa.c”CPU=”x86” - عند بدء التشغيل يتم تعريف متغيرين ABC وCPU.

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

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

على سبيل المثال:

Maketarget - بناء الهدف.

لقد انجذبت دائمًا إلى البساطة. إن فكرة أن شيئًا واحدًا يجب أن يفعل شيئًا واحدًا، ولكن يفعله بأفضل شكل ممكن، أدت إلى إنشاء UNIX. وعلى الرغم من أنه لم يعد من الممكن تسمية UNIX بنظام بسيط، وليس من السهل رؤية بساطته، إلا أنه يمكن اعتباره مثال واضحالتحول الكمي النوعي للعديد من الأشياء البسيطة والمفهومة إلى شيء واحد معقد للغاية ومبهم. في تطورها، مرت Make بنفس المسار تقريبًا: تحولت البساطة والوضوح، مع زيادة الحجم، إلى وحش رهيب (تذكر مشاعرك عندما فتحت ملفًا تعريفيًا لأول مرة).

كان تجاهلي المستمر للتصنيع لفترة طويلة بسبب ملاءمة IDEs المستخدمة وعدم الرغبة في فهم "بقايا الماضي" (الكسل في الأساس). ومع ذلك، فإن كل هذه الأزرار والقوائم المزعجة وما إلى ذلك. سمات الاستوديوهات بأنواعها أجبرتني على البحث عن بديل لأسلوب العمل الذي كنت أمارسه حتى الآن. لا، لم أصبح خبيرًا في الصناعة، لكن المعرفة التي اكتسبتها كافية لمشاريعي الصغيرة. هذه المقالة مخصصة لأولئك الذين، مثلي مؤخرًا، يريدون الخروج من عبودية النوافذ المريحة إلى عالم الصدفة الزاهد ولكن الحر.

صنع- المعلومات الأساسية

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

1) الأهداف (ماذا هذه القاعدةيفعل)؛
2) التفاصيل (ما هو ضروري لتحقيق القاعدة والحصول على الأهداف)؛
3) الأوامر (إجراء هذه التحولات).

في منظر عاميمكن تمثيل بناء جملة makefile على النحو التالي:

# يتم تحديد الهوية حصرا باستخدام أحرف علامة التبويب، # يجب أن يسبق كل أمر مسافة بادئة<цели>: <реквизиты> <команда #1> ... <команда #n>

أي أن قاعدة الصنع هي الإجابة على ثلاثة أسئلة:

(مما نصنعه؟ (تفصيل)) ---> [كيف نصنعه؟ (الأوامر)] ---> (ماذا نفعل؟ (الأهداف))
من السهل أن نرى أن عمليات الترجمة والتجميع تتناسب بشكل جيد للغاية مع هذا المخطط:

(ملفات المصدر) ---> [البث] ---> (ملفات الكائنات)
(ملفات الكائنات) ---> [رابط] ---> (ملفات قابلة للتنفيذ)

أبسط Makefile

لنفترض أن لدينا برنامجًا يتكون من ملف واحد فقط:

/* * main.c */ #include إنت الرئيسي () (برينتف (" مرحبا بالعالم!\n"); إرجاع 0; )
لتجميعه، يكفي ملف makefile بسيط للغاية:

مرحبًا: main.c gcc -o مرحبًا main.c
يتكون ملف Makefile هذا من قاعدة واحدة، والتي تتكون بدورها من هدف - "hello"، ودعامة - "main.c"، وأمر - "gcc -o hello main.c". الآن، للتجميع، ما عليك سوى إصدار أمر make في دليل العمل. افتراضيًا، سينفذ make القاعدة الأولى إذا لم يتم تحديد هدف التنفيذ بشكل صريح عند استدعائه:

$ جعل<цель>

تجميع من مصادر متعددة

لنفترض أن لدينا برنامج يتكون من ملفين:
ج الرئيسية
/* * main.c */ int main() ( hello(); return 0; )
و مرحبا.ج
/* * hello.c */ #include باطلة مرحبا() ( printf("Hello World!\n"); )
قد يبدو ملف Makefile الذي يجمع هذا البرنامج كما يلي:

مرحبًا: main.c hello.c gcc -o hello main.c hello.c
إنها وظيفية تماما، ولكن لديها عيب واحد كبير: سنكشف عن أي واحد أكثر.

التجميع التزايدي

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

الآن، بعد تغيير أحد الملفات المصدر، يكفي ترجمته وربط جميع ملفات الكائنات. وفي الوقت نفسه، نتخطى مرحلة ترجمة التفاصيل التي لا تتأثر بالتغييرات، مما يقلل من وقت التجميع بشكل عام. هذا الأسلوب يسمى التجميع التزايدي. لدعم ذلك، قم بإجراء مقارنة بين أوقات تغيير الأهداف وتفاصيلها (باستخدام data نظام الملفات)، والتي بفضلها تقرر بشكل مستقل القواعد التي يجب اتباعها والتي يمكن تجاهلها ببساطة:

Main.o: main.c gcc -c -o main.o main.c hello.o: hello.c gcc -c -o hello.o hello.c hello: main.o hello.o gcc -o hello main. يا مرحبا.o
حاول بناء هذا المشروع. ولبنائه، يجب عليك تحديد الهدف بشكل صريح، أي: إعطاء الأمر جعل مرحبا.
بعد ذلك، قم بتغيير أي من الملفات المصدر وقم بإنشائها مرة أخرى. يرجى ملاحظة أنه خلال التجميع الثاني، سيتم ترجمة الملف المعدل فقط.

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

أهداف وهمية

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

$ جعل $ جعل التثبيت
يقوم أمر make بتجميع البرنامج، ويقوم أمر make install بتثبيته. يعد هذا الأسلوب مناسبًا جدًا، نظرًا لأنه يحتوي على كل ما يلزم لإنشاء التطبيق ونشره نظام الهدفمضمن في ملف واحد (دعونا ننسى البرنامج النصي للتكوين للحظة). مع العلم أننا في الحالة الأولى لا نحدد الهدف، وفي الثانية الهدف ليس الخلق تثبيت الملف، وعملية تثبيت التطبيق على النظام. إن ما يسمى بالأهداف الوهمية (الزائفة) تسمح لنا بأداء مثل هذه الحيل. هنا قائمة قصيرةالأهداف القياسية:

  • كل شيء هو الهدف الافتراضي. ليس عليك تحديده بشكل صريح عند الاتصال بـ make.
  • نظيف - قم بمسح الدليل لجميع الملفات التي تم الحصول عليها نتيجة للتجميع.
  • تثبيت - إجراء التثبيت
  • إلغاء التثبيت - وإلغاء التثبيت وفقًا لذلك.
لمنع make من البحث عن ملفات بهذه الأسماء، يجب تعريفها في Makefile باستخدام التوجيه .PHONY. فيما يلي مثال لملف Makefile الذي يتضمن الأهداف كلها، التنظيف والتثبيت وإلغاء التثبيت:

PHONY: تثبيت الكل نظيف، إلغاء تثبيت الكل: hello clean: rm -rf hello *.o main.o: main.c gcc -c -o main.o main.c hello.o: hello.c gcc -c -o hello. o hello.c hello: main.o hello.o gcc -o hello main.o hello.o التثبيت: تثبيت ./hello /usr/local/bin إلغاء التثبيت: rm -rf /usr/local/bin/hello
يمكننا الآن إنشاء برنامجنا، وتثبيته/إلغاء تثبيته، وكذلك تنظيف دليل العمل باستخدام أهداف التصنيع القياسية.

لاحظ أن الهدف all لا يحدد الأوامر؛ كل ما تحتاجه هو الحصول على الدعائم مرحبا. بمعرفة الطبيعة التكرارية للـ make، ليس من الصعب أن نتخيل كيف سيعمل هذا البرنامج النصي. وتجدر الإشارة أيضا انتباه خاصعلى حقيقة أنه إذا كان ملف الترحيب موجودًا بالفعل (بقي بعد التجميع السابق) ولم يتم تغيير تفاصيله، فإن الأمر make لن يتم إعادة تجميع أي شيء. هذا هو أشعل النار الكلاسيكية. لذلك على سبيل المثال، التغيير الملف الاساسي، قد يؤدي عدم إدراجه عن طريق الخطأ في قائمة التفاصيل إلى الإصابة بالصداع لساعات طويلة. لذلك، لضمان إعادة بناء المشروع بالكامل، يجب عليك أولاً مسح دليل العمل:

$ جعل نظيفة $ جعل
ستحتاج إلى استخدام sudo لإكمال أهداف التثبيت/إلغاء التثبيت.

المتغيرات

كل أولئك الذين هم على دراية بقاعدة DRY (لا تكرر نفسك) ربما لاحظوا بالفعل شيئًا خاطئًا، وهو أن ملف Makefile الخاص بنا يحتوي على رقم ضخمتكرار الأجزاء، مما قد يؤدي إلى حدوث ارتباك أثناء المحاولات اللاحقة لتوسيعها أو تغييرها. في اللغات الأمرية، لدينا متغيرات وثوابت لهذه الأغراض؛ جعل لديها أيضا بوسائل مماثلة. يتم تسمية المتغيرات في make بسلاسل ويتم تعريفها بكل بساطة:

=
هناك قاعدة غير معلنة مفادها أنه يجب تسمية المتغيرات بأحرف كبيرة، على سبيل المثال:

SRC = main.c hello.c
هذه هي الطريقة التي حددنا بها قائمة الملفات المصدر. لاستخدام قيمة متغير، يجب إلغاء الإشارة إليه باستخدام $( build ); على سبيل المثال مثل هذا:

دول مجلس التعاون الخليجي -مرحبا $(SRC)
يوجد أدناه ملف تعريف يستخدم متغيرين: TARGET - لتحديد الاسم برنامج الهدفوالبادئة - لتحديد مسار تثبيت البرنامج على النظام.

TARGET = hello PREFIX = /usr/local/bin .PHONY: تثبيت نظيف بالكامل، إلغاء تثبيت الكل: $(TARGET) نظيف: rm -rf $(TARGET) *.o main.o: main.c gcc -c -o main. o main.c hello.o: hello.c gcc -c -o hello.o hello.c $(TARGET): main.o hello.o gcc -o $(TARGET) main.o hello.o التثبيت: تثبيت $ (TARGET) $(PREFIX) إلغاء التثبيت: rm -rf $(PREFIX)/$(TARGET)
هذا أجمل بالفعل أعتقد الآن أن المثال أعلاه لا يحتاج إلى أي تعليقات خاصة لك.

المتغيرات التلقائية

تهدف المتغيرات التلقائية إلى تبسيط إنشاء الملفات، ولكن في رأيي لها تأثير سلبي على سهولة قراءتها. مهما كان الأمر، سأدرج هنا بعض المتغيرات الأكثر استخدامًا، وما يجب فعله بها (أو ما إذا كنت تريد القيام بذلك على الإطلاق) متروك لك:
  • $@ الاسم المستهدف للقاعدة التي تتم معالجتها
  • $< Имя первой зависимости обрабатываемого правила
  • $^ قائمة بجميع تبعيات القاعدة المعالجة
إذا أراد أي شخص التعتيم على نصوصه بالكامل، فيمكنك الحصول على الإلهام هنا:

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

تاريخيًا، كانت الأداة المساعدة مخصصة لبناء مشاريع بلغة C في نظام التشغيل نظام يونكسومع ذلك، يمكن استخدامها للعمل مع أي مشاريع. تم إنشاء النسخة الأولى من النظام في عام 1977.

اليوم، الأكثر شيوعا هي ثلاثة خيارات فائدة مجتمعة المبادئ العامةيعمل، ولكن يختلف في بناء جملة اللغة والقدرات:

    يعد GNU make هو الخيار الأكثر شيوعًا وعمليًا

    BSD make (pmake) - يُستخدم في مشاريع BSD، وهو مكافئ تقريبًا في وظائف GNU make

    nmake (Microsoft make) - يعمل ضمن نظام التشغيل Windows، وله وظائف قليلة فقط المبادئ الأساسيةيصنع.

نحن نعمل مع صنع جنو. في أنظمة BSD (خاصة FreeBSD، يمكن أن يكون متاحًا كـ gmake، على Linux - فقط اصنع).

المبادئ الأساسية

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

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

وقد يعتمد كل هدف على إنجاز الأهداف الأخرى. يتطلب تحقيق الهدف الإكمال المسبق للأهداف الأخرى التي يعتمد عليها.

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

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

تشغيل جعل

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

وبناء على ذلك الفريق

$ جعل

سيستخدم Makefile الموجود في الدليل الحالي.

عند تشغيل make، يمكنك تحديد هدف ليتم تنفيذه. إذا لم يتم تحديد أي هدف، فسيتم استخدام الهدف الافتراضي، والذي يتم تحديده بشكل صريح في ملف القواعد، أو يتم استخدام الهدف الأول المحدد ضمنيًا.

يتم تحديد الهدف بشكل صريح باستخدام عبارة DEFAULT_GOAL في ملف Makefile:

. DEFAULT_GOAL: الكل

على سبيل المثال، الأمر

$ جعل نظيفة

سيؤدي إلى معالجة الهدف ملف نظيف Makefile الموجود في الدليل الحالي.

يمكنك تحديد عدة أهداف في وقت واحد.

يمكن تكوين تنفيذ الأهداف باستخدام المتغيرات (المزيد حول ذلك أدناه). عند تشغيل make، يمكنك تحديد قيم المتغيرات:

$ إنشاء PREFIX =/usr/local

ستكون قيمة المتغير PREFIX متاحة في قواعد Makefile ويمكن استخدامها أثناء الإنشاء.

ويدعم الفريق أيضًا عددًا من خيارات اضافية، ومن أهمها ما يلي:

    F - يسمح لك بتحديد ملف القواعد بشكل صريح

    C - يذهب إلى الدليل المحدد قبل التنفيذ، ويمكن، على سبيل المثال، استخدامه لتشغيل make من دليل خارجي لدليل المشروع

    ب - تعطيل التحقق الزمني للأهداف التابعة ويجبرها على التنفيذ بشكل كامل

بناء الجملة الأساسي

يبدو البناء الأساسي المستخدم في إنشاء الملفات بالطريقة الآتية:

الهدف: dep1 dep2...command1command2...

    الهدف - الهدف

    dep1، dep2 - الأهداف التي يعتمد عليها الهدف

    Command1 , Command2 - الأوامر التي يتم تنفيذها لتحقيق الهدف

على سبيل المثال:

أسلوب. CSS: src/ أقل/ التطبيق. أقل أقل src/ أقل/ التطبيق. أقل> النمط. المغلق

يحدد هذا المقتطف أن ملف style.css يعتمد على ملف src/less/app.less ولإنشائه تحتاج إلى تشغيل الأمر lessc src/less/app.less > style.css . سيتم إعادة إنشاء ملف style.css فقط إذا كان الملف src/less/app.less أحدث من ملف style.css (ما لم يتم تحديد المفتاح -B عند تشغيل make).

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

تُستخدم أوامر Shell كأوامر معالجة مستهدفة. يتم عرض نص الأمر، لمنع عرضه، يجب أن يبدأ الأمر بالرمز @.

يتم تشغيل كل أمر بشكل منفصل مترجم قذيفة، وبالتالي فإن الأوامر ليست مرتبطة ببعضها البعض. وبعبارة أخرى، سطر أوامر واحد - قذيفة واحدة. يمكن تجاوز هذا السلوك باستخدام الهدف الخاص .ONESHELL .

إذا كان الأمر (أو قائمة التبعيات) يحتاج إلى الكتابة على عدة أسطر، فاستخدم الحرف \ الواصلة.

أهداف زائفة

يتم الإعلان عن الأهداف غير المتعلقة بالملفات والتي تهدف إلى تنفيذ مجموعة من الأوامر أو تبعيات المجموعة على النحو التالي:

.PHONY: نظيف نظيف: rm *. يا درجة الحرارة

من الممكن أن يكون هناك عدة إعلانات. عادة ما يتم تعريف أحد الإعلانات ويتم كتابة جميع الأهداف ذات الصلة هناك.

في مثالنا، سيؤدي استدعاء make clean إلى تنفيذ الهدف النظيف، والذي سيؤدي بالتأكيد إلى إزالة الملفات المؤقتة.

إذا كان الهدف الزائف لديه تبعية في شكل هدف زائف آخر، فسيتم تنفيذ التبعية قبل الهدف التابع. وهكذا نحصل على آلية تشبه الإجراءات الفرعية. على سبيل المثال، يمكننا تحديد all target الذي يجمع كل ملفات المشروع، وأهداف css وjs وphp المنفصلة التي تجمع CSS منفصل-الملفات وملفات js ومعالجة ملفات php.

وفقا لذلك، في Makefile يمكننا أن نكتب:

.PHONY : جميع CSS JS PHP الكل: CSS JS PHP CSS: www/ style. css ... إليك أوامر js: www/ js/ app. js ... إليك أوامر php: ... إليك الأوامر مرة أخرى

ونتيجة لذلك، يمكننا استخدام make all لإعادة بناء جميع الملفات، ولنقل، make css لإعادة بناء ملفات CSS فقط.

المتغيرات

يمكنك استخدام المتغيرات في ملف makefile، على الرغم من أنه سيكون أكثر دقة القول أنه يمكنك استخدام وحدات الماكرو.

يتم تعريف المتغيرات عن طريق التعيين في ملف makefile أو يمكن تمريرها خارجيًا.

المتغيرات هي تعريفات كلية، ويتم تقييم المتغير دائمًا في اللحظة الأخيرة قبل الاستبدال. يمكن استخدام وحدات الماكرو في أي مكان في نص makefile.

CC= gcc IDIR=../ include CFLAGS=- I$ (IDIR) DEPS= hellomake. يا مرحبا. ص NAME= hellomake $ (NAME ) : $ (DEPS ) $ (CC ) - o $ (NAME ) $ (DEPS )

يتم إجراء الاستبدال باستخدام البنية $(VAR)، على عكس الصدفة التي تستخدم $VAR .

إذا كان في أمر شلعند استخدام متغير الصدفة، من الضروري ذكر علامة $ وتكرارها، على سبيل المثال:

بيت الطباعة: صدى $$HOME

بالإضافة إلى المتغيرات الكلية، هناك أيضًا متغيرات أكثر تقليدية، حيث يتم تعيين القيمة على الفور. للعمل معهم، استخدم عامل التشغيل:=. في ظروفنا، يكفي استخدام المتغيرات العادية.

غالبًا ما تريد تعريف متغير فقط إذا لم يكن قد تم تعريفه بالفعل. للقيام بذلك، استخدم عامل التشغيل ?=:

MYSQL_CHARSET ?= UTF8

وبناء على ذلك، إذا اتصلنا

إنشاء قاعدة بيانات

سيتم استخدام ترميز UTF8، وفي حالة

إنشاء قاعدة بيانات MYSQL_CHARSET=CP1251

سيتم استخدام CP1251.

إذا كان المتغير يحتوي على عدة أسطر، فيمكنك استخدام صيغة التعريف:

تحديد MYSQL_APP_CONF_TEMPLATE [ mysql] المضيف = $ (MYSQL_SERVER ) المنفذ = $ (MYSQL_PORT ) المستخدم = $ (MYSQL_USER ) كلمة المرور = "$(MYSQL_PASSWORD)" endef

المتغيرات التلقائية

يدعم Make مجموعة من المتغيرات التلقائية التي تجعل قواعد الكتابة أسهل. على سبيل المثال، المتغير $@ يتوافق مع الهدف الحالي (المتغير الموجود على يسار :)، والمتغير $^ يتوافق مع قائمة التبعيات (المتغير الموجود على يمين :)). وهكذا، على سبيل المثال، يمكنك كتابة:

www/js/script. js: src/js/jquery. js src/ js/ plugin1. js src/ js/ plugin2. قطة شبيبة $^ > $@

ونتيجة لذلك، سيكون www/js/script.js نتيجة لدمج ثلاثة ملفات js.

يتم تقديم قائمة كاملة بهذه المتغيرات في الوثائق، والأكثر إثارة للاهتمام بالنسبة لنا هي:

    $@ - اسم الهدف

    $< - имя первой зависимости

    $؟ - أسماء جميع التبعيات الأحدث من الهدف

    $^ - أسماء جميع التبعيات المستهدفة

مع القائمة الكاملةيمكن العثور عليها في الوثائق: المتغيرات التلقائية.

التنفيذ المشروط

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

إعداد ifdef $(APP): ... إعداد آخر: @ echo "خطأ، لم يتم تعريف التطبيقات"إنهاء إذا

كشروط، يمكنك التحقق من دقة المتغير، وكذلك قيمته:

Foo: $ (objects) ifeq ($ (CC)، gcc) $ (CC) - o foo $ (objects) $ (libs_for_gcc) else $ (CC) - o foo $ (objects) $ (normal_libs) endif

متمكن بالكامل الشرطيةيمكن العثور عليها في الوثائق: بناء الجملة الشرطي.

قواعد القالب

تسمح لك قواعد النمط بتحديد قاعدة لتحويل ملف إلى آخر بناءً على التبعيات بين أسمائهم. على سبيل المثال، يمكننا تحديد قاعدة للحصول على ملف كائن من ملف لغة C:

%. س:٪. ج $(CC)$< - o $@

لاحظ استخدام المتغير %< , которая в таких правилах используется для получения имени исходного файла.

ليس من الضروري أن تقتصر القوالب على امتدادات الملفات. إذا كانت ملفات المصدر وملفات الإخراج متطابقة مع بعضها البعض وكان هناك أي تبعية في أسمائها، فيمكن استخدام قاعدة النمط.

بما في ذلك ملفات الصنع الأخرى

يمكن أن يتضمن ملف الصنع ملفات إنشاء أخرى مع عبارة التضمين:

تشمل make1. عضو الكنيست جعل2. عضو الكنيست

وبالتالي، من الملفات التي يمكنك بناءها نظام الوحدات، غالبًا ما يكون من المنطقي تضمينها في عبارة شرطية.

المهام

قم بتحديد مجموعة كبيرةالوظائف التي يمكن استخدامها في المتغيرات (وحدات الماكرو). يتم تنفيذ استدعاء الوظيفة بواسطة البناء:

$(الدالة arg1, arg2,...)

تتيح لك الوظائف معالجة السلاسل وأسماء الملفات وتنظيم الحلقات عبر مجموعة من القيم وتنظيمها مكالمة مشروطةوظائف أخرى.

بعض الأمثلة من الخلية. نحن نحصل الوقت الحالي(لاحظ استخدام := :

HIVE_TIME := $ (تاريخ الصدفة +% Y/% m/% d\ % H:% M:% S)

بما في ذلك ملف Container.mk فقط إذا كان موجودًا:

تضمين $ (قم بالعثور على $ (HIVE_ETC_DIR ) - اسم الحاوية. mk)

تشكيل الاسم قواعد بيانات MySQLحسب اسم المشروع:

MYSQL_DB ?= $ (subst -, _,$ (HIVE_NAME) _$ (APP))

إضافة البادئات واللاحقات لأسماء الملفات

$ (addprefix src/ less/,$ (addsuffix . أقل، كتالوج واجهة المستخدم للتطبيق))

يمكنك قراءة المزيد عن الوظائف في وثائق الوظائف.

الوظائف الخاصة

يمكنك إنشاء وظائف ذات معلمات خاصة بك عن طريق تحديد المتغيرات التي تحتوي على متغيرات خاصة $1 , $2 , ... المتوافقة مع الوسائط التي تم تمريرها. يتصل وظيفة مخصصةيتم إنتاجه بواسطة ماكرو استدعاء خاص:

$(استدعاء المتغير، المعلمة، المعلمة،...)

مثال غبي جداً:

خلية_أحمر = " \0 33}