صنع (برمجيات)

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

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

بالإضافة إلى الإشارة إلى أداة يونكس الأصلية ، فإن Make هي أيضًا تقنية نظرًا لأنه تم تنفيذ أدوات متعددة بنفس الوظائف تقريبًا - بما في ذلك بناء الجملة والدلالات المتشابهة لملفات makefile .

أصل

ابتكر ستيوارت فيلدمان برنامج Make أثناء عمله في مختبرات بيل . وقد أُنجزت نسخة مبكرة منه في أبريل 1976. [ 1 ] [ 2 ] [ 3 ] وحصل فيلدمان على جائزة ACM لأنظمة البرمجيات لعام 2003 عن تأليفه لبرنامج Make. [ 4 ]

يصف فيلدمان مصدر إلهامه لكتابة كتاب "اصنع" بأنه نابع من إحباط أحد زملائه في العمل من الأدوات المتاحة في ذلك الوقت:

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

ستيوارت فيلدمان، فن برمجة يونكس ، إريك إس. ريموند 2003

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

يُستخدم برنامج Make على نطاق واسع جزئيًا بسبب إدراجه المبكر في نظام Unix ، بدءًا من PWB/UNIX 1.0، الذي تضمن مجموعة متنوعة من أدوات تطوير البرمجيات. [ 3 ]

المتغيرات

تم تطبيق برنامج Make عدة مرات، باستخدام نفس تنسيق ملف Makefile بشكل عام، وتوفير نفس الميزات، ولكن بعضها قدم تحسينات عن النسخة الأصلية. أمثلة:

  • ظهر برنامج Sun DevPro Make في عام 1986 مع نظام التشغيل SunOS-3.2. وكان يُقدّم كبرنامج اختياري مع نظام التشغيل SunOS-3.2، ثم أصبح البرنامج الافتراضي لنظام التشغيل SunOS-4.0. [ 5 ] وفي ديسمبر 2006، أُتيح برنامج Sun DevPro Make كمصدر مفتوح كجزء من الجهود المبذولة لجعل نظام Solaris مفتوح المصدر . [ 6 ] [ 7 ]
  • كان dmake أو Distributed Make مُضمّنًا مع Sun Solaris Studio كأداة Make افتراضية، ولكنه ليس الأداة الافتراضية في نظام التشغيل Solaris (SunOS). كان مطلوبًا في الأصل لبناء OpenOffice، ولكن في عام 2009 [ 8 ] أُعيدت كتابة نظام البناء لاستخدام GNU Make. بينما لا يزال Apache OpenOffice يحتوي على مزيج من كلا نظامي البناء، [ 9 ] فإن LibreOffice، الذي يشهد تطورًا مستمرًا، يستخدم الآن فقط أداة "gbuild" المُحدّثة. [ 8 ]
  • BSD Make ( pmake ، [ 10 ] bmake [ 11 ] أو fmake [ 12 ] )، وهو مشتق من عمل آدم دي بور على نسخة من Make قادرة على بناء الأهداف بالتوازي ، ولا يزال موجودًا بدرجات متفاوتة من التعديل في FreeBSD ، [ 11 ] و NetBSD، [ 13 ] و OpenBSD . [ 14 ] ويتميز باحتوائه على عبارات شرطية وحلقات تكرارية تُطبق في مرحلة التحليل، ويمكن استخدامها لإنشاء ملف makefile بشكل مشروط وبرمجي، [ 15 ] بما في ذلك توليد الأهداف في وقت التشغيل.
  • يُعدّ GNU Make (اختصارًا gmake ) التنفيذ القياسي لـ Make لأنظمة Linux و macOS. [ 16 ] وهو يوفر العديد من الإضافات على Make الأصلي، مثل الشروط. كما يوفر العديد من الدوال المدمجة التي يمكن استخدامها للاستغناء عن كتابة البرامج النصية في قواعد ملف makefile، بالإضافة إلى معالجة المتغيرات المُعرّفة والمستخدمة في ملف makefile. [ 17 ] على سبيل المثال، يمكن استخدام دالة foreach للتكرار على قائمة من القيم، مثل أسماء الملفات في دليل مُحدد. [ 18 ] يُعدّ GNU Make ضروريًا لبناء العديد من أنظمة البرمجيات، بما في ذلك مجموعة مُترجمات GNU (GCC) (منذ الإصدار 3.4 [ 19 ] )، ونواة Linux، [ 20 ] [ 21 ] و Apache OpenOffice، [ 9 ] و LibreOffice، [ 8 ] و Mozilla Firefox . [ 22 ]
  • إعادة صنع روكي بيرنشتاين [ 23 ] هي نسخة معدلة من GNU Make وتوفر العديد من الإضافات على GNU Make، مثل تحسين موقع الخطأ والإبلاغ عنه، وتتبع التنفيذ، وتحديد خصائص التنفيذ، كما أنها تحتوي على مصحح أخطاء.
  • إن برنامج nmake الخاص بـ Glenn Fowler [ 24 ] (غير المرتبط بنسخة Microsoft التي تحمل نفس الاسم) غير متوافق مع نسخة UNIX، ولكنه يوفر ميزات تقلل، وفقًا لبعضهم، من حجم ملفات makefiles بمعامل 10.
  • يُثبَّت برنامج Microsoft nmake عادةً مع Visual Studio . [ 25 ] وهو يدعم توجيهات المعالج المسبق، مثل تضمين الملفات والتعبيرات الشرطية التي تستخدم متغيرات مُحدَّدة في سطر الأوامر أو داخل ملفات makefiles. [ 26 ] [ 27 ] تختلف قواعد الاستدلال عن Make؛ فعلى سبيل المثال، يمكنها تضمين مسارات البحث. [ 28 ]
  • يحتوي برنامج Embarcadero make على خيار سطر أوامر "يجعل MAKE يحاكي NMAKE الخاص بمايكروسوفت". [ 29 ]
  • أداة Jom الخاصة بمشروع Qt هي نسخة طبق الأصل من nmake. [ 30 ]
  • حلّت أداة Mk محل أداة Make في نظام التشغيل Research Unix ، بدءًا من الإصدار 9. [ 31 ] وهي إعادة تصميم للأداة الأصلية من قِبل المبرمج أندرو جي. هيوم من مختبرات بيل، وتتميز ببنية مختلفة. أصبحت Mk أداة البناء القياسية في نظام Plan 9 ، وهو النظام الذي كانت مختبرات بيل تنوي استخدامه كخليفة لنظام Unix. [ 32 ]
  • كاتي هي بديل جوجل لبرنامج GNU Make، وقد استُخدمت منذ عام 2020 في بناء نظام التشغيل أندرويد . تقوم كاتي بترجمة ملف makefile إلى لغة ninja لتسريع عمليات البناء التدريجي (على غرار أداة cmake metatool). [ 33 ]
  • Snakemake هو تطبيق قائم على لغة بايثون لتجميع وتشغيل سير العمل في مجال المعلوماتية الحيوية . [ 34 ]

يتضمن معيار POSIX توحيدًا للميزات الأساسية وطريقة عمل أداة Make، ويتم تنفيذه بدرجات متفاوتة من التوافق مع إصدارات Make المبنية على أنظمة Unix. بشكل عام، يمكن استخدام ملفات Make البسيطة بين مختلف إصدارات Make بنجاح معقول. يبحث كل من GNU Make وMakepp وبعض إصدارات BSD Make افتراضيًا أولًا عن الملفات المسماة "GNUmakefile" [ 35 ] و "Makeppfile" [ 36 ] و"BSDmakefile" [ 37 ] على التوالي، مما يسمح بوضع ملفات Make التي تستخدم سلوكًا محددًا من قِبل التنفيذ في مواقع منفصلة.

يستخدم

بشكل عام، وبناءً على ملف Makefile، يقوم Make بتحديث الملفات المستهدفة من الملفات المصدرية إذا كان أي ملف مصدري يحمل طابعًا زمنيًا أحدث من الملف المستهدف، أو إذا كان الملف المستهدف غير موجود. على سبيل المثال، قد يشمل ذلك تجميع ملفات C*.c إلى ملفات كائنية ، ثم ربط هذه الملفات الكائنية ببرنامج تنفيذي. أو قد يشمل ذلك تجميع ملفات TypeScript*.ts إلى JavaScript لاستخدامها في متصفح. ومن الأمثلة الأخرى: تحويل ملف صورة مصدرية إلى تنسيق آخر، ونسخ ملف إلى نظام إدارة محتوى، وإرسال بريد إلكتروني حول حالة البناء.

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

قم بتحديث الأهداف التي تم تمريرها كوسيطات:

make [ -f makefile ] [ options ] [ targets ]

إذا لم يتم تحديد هدف، يقوم Make بتحديث الهدف الأول في ملف makefile والذي غالبًا ما يكون هدفًا وهميًا لتنفيذ الإجراء الأكثر استخدامًا.

يتجاهل برنامج Make بعض إجراءات البناء إذا كان الطابع الزمني للملف الهدف أحدث من الطابع الزمني للملفات المصدرية. [ 38 ] يُحسّن هذا الإجراء عملية البناء بتجاهل الإجراءات عندما يكون الملف الهدف مُحدّثًا، ولكن في بعض الأحيان يتم تجاهل التحديثات عن طريق الخطأ بسبب مشاكل في الطابع الزمني للملف، بما في ذلك استعادة إصدار أقدم من ملف مصدري، أو عندما يكون نظام ملفات الشبكة مصدرًا للملفات ولا تتم مزامنة ساعته أو منطقته الزمنية مع الجهاز الذي يُشغّل برنامج Make. كذلك، إذا كان الطابع الزمني لملف مصدري في المستقبل، فإن برنامج Make يُشغّل إجراءات غير ضرورية بشكل متكرر، مما يُطيل وقت البناء.

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

تُنفذ عمليات الإنشاء خيارات سطر الأوامر بناءً على ملف الإنشاء المُحمّل.

ملف Makefile

لغة ملفات الإنشاء هي لغة برمجة تصريحية جزئياً ، حيث يتم وصف شروط النهاية، ولكن لا يتم تحديد ترتيب تنفيذ الإجراءات. [ 40 ] [ 41 ] [ 42 ] [ 43 ]

يمكن أن تحتوي ملفات Makefiles على البنى التالية: [ 44 ]

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

قواعد

تبدأ كل قاعدة بسطر تبعية يتكون من اسم الهدف الخاص بالقاعدة متبوعًا بنقطتين رأسيتين (:)، وقائمة اختيارية بالأهداف (المعروفة أيضًا بالمتطلبات الأساسية) التي يعتمد عليها هدف القاعدة. [ 45 ]

الهدف [الهدف ...]: [المكون ...] Tab ↹[الأمر 1] . . . Tab ↹[الأمر ن]

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

قد يتبع سطر التبعية وصفة: وهي سلسلة من سطور الأوامر المُنسقة باستخدام مفتاح TAB ، والتي تُحدد كيفية إنشاء الملف الهدف من المكونات (أي ملفات المصدر). إذا كان لأي متطلب مسبق طابع زمني أحدث من تاريخ إنشاء الملف الهدف، أو إذا لم يكن الملف الهدف موجودًا كملف، فسيتم تنفيذ الوصفة.

قد يظهر الأمر الأول في نفس السطر بعد المتطلبات الأساسية، مفصولاً بفاصلة منقوطة.

الأهداف : المتطلبات الأساسية ؛ الأمر

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

مرحباً : ; @ echo " مرحباً " 

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

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

ستيوارت فيلدمان [ 46 ]

يسمح برنامج GNU Make منذ الإصدار 3.82 باختيار أي رمز (حرف واحد) كبادئة للوصفة باستخدام المتغير الخاص .RECIPEPREFIX:

.RECIPEPREFIX := : all : :@echo "تم تعيين رمز بادئة الوصفة إلى '$(.RECIPEPREFIX)'"

يُنفَّذ كل أمر في نافذة طرفية منفصلة . ونظرًا لأن أنظمة التشغيل تستخدم نوافذ طرفية مختلفة، فقد يؤدي ذلك إلى ملفات Make غير قابلة للنقل. على سبيل المثال، يُنفِّذ GNU Make (وجميع إصدارات POSIX Make) الأوامر باستخدام /bin/sh افتراضيًا، حيث تُستخدم عادةً أوامر Unix مثل cp . في المقابل، يُنفِّذ nmake من Microsoft الأوامر باستخدام cmd.exe، حيث تتوفر أوامر الدفعات مثل copy ، ولكن ليس بالضرورة cp.

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

ريل كلين : تنظيف ديست كلين

يتم تقييم قاعدة المثال التالية عند تحديث ملف file.txt المستهدف make file.txt. إذا كان ملف file.html أحدث من ملف file.txt أو إذا كان ملف file.txt غير موجود، فسيتم تشغيل الأمر لإنشاء ملف file.txt من ملف file.html.

file.txt : file.html lynx -dump file.html > file.txt ​​

يمكن أن يحتوي الأمر على واحد أو أكثر من البادئات التالية (بعد علامة الجدولة):

يمكن بدلاً من ذلك تجاهل الأخطاء وإسكات الصدى من خلال الأهداف الخاصة .IGNOREو .SILENT. [ 47 ]

يحتوي برنامج NMAKE من مايكروسوفت على قواعد محددة مسبقًا يمكن حذفها من ملفات makefiles هذه، على سبيل المثال .c.obj$(CC)$(CFLAGS)

وحدات الماكرو

يمكن لملف Make تعريف واستخدام وحدات الماكرو. تُسمى وحدات الماكرو عادةً بالمتغيرات عندما تحتوي على تعريفات نصية بسيطة، مثل ` . يمكن تجاوز وحدات الماكرو في ملفات Make من خلال وسائط سطر الأوامر المُمررة إلى أداة Make. كما تتوفر متغيرات البيئة كوحدات ماكرو.CC=clang

على سبيل المثال، يُستخدم الماكرو CCبشكل متكرر في ملفات الإنشاء للإشارة إلى موقع مُصرّف لغة C. إذا استُخدم باستمرار في جميع أنحاء ملف الإنشاء، فيمكن تغيير المُصرّف المُستخدم بتغيير قيمة الماكرو بدلاً من تغيير كل أمر من أوامر القواعد التي تستدعي المُصرّف.

تُسمى وحدات الماكرو عادةً بأحرف كبيرة :

الماكرو = تعريف 

يمكن أن تتكون قيمة الماكرو من قيم ماكرو أخرى. يتم توسيع قيمة الماكرو عند كل استخدام بشكل كسول .

يُستخدم الماكرو بتوسيعه إما باستخدام $ NAME أو $( NAME ). يُعدّ الخيار الأخير أكثر أمانًا، إذ أن حذف الأقواس يؤدي إلى تفسير Make للحرف التالي للحرف على $أنه اسم المتغير بالكامل. يوجد شكل مكافئ يستخدم الأقواس المعقوفة بدلًا من الأقواس العادية، ${}وهو الأسلوب المُستخدم في BSD .

NEW_MACRO = $( MACRO ) - $( MACRO2 )

يمكن تكوين وحدات الماكرو من أوامر الصدفة باستخدام عامل استبدال الأوامر!= . [ 48 ]

YYYYMMDD != تاريخ 

صيغة سطر الأوامر لتجاوز الماكرو هي:

إنشاء ماكرو = "قيمة" [ ماكرو = "قيمة" ... ] هدف [ هدف ... ]

يمكن لملفات Makefiles الوصول إلى وحدات الماكرو الداخلية المعرفة مسبقًا ، والتي ?تكون @شائعة.

الهدف : المكون 1 المكون 2  # عرض المكونات الأصغر من الهدف عرض  # عرض اسم الهدف عرض $@

من الصيغ الشائعة عند تعريف وحدات الماكرو، والتي تعمل على أنظمة BSD و GNU Make، استخدام += و ?= و != بدلاً من علامة المساواة ( = ). [ 49 ]

قواعد اللواحق

تحتوي قواعد اللاحقة على "أهداف" بأسماء على شكل معين .FROM.TO، وتُستخدم لتنفيذ إجراءات بناءً على امتداد الملف. في سطور أوامر قواعد اللاحقة، يُحدد معيار POSIX [ 50 ] أن الماكرو الداخلي $<يُشير إلى الشرط المسبق الأول، بينما $@يُشير إلى الهدف. في هذا المثال، الذي يُحوّل أي ملف HTML إلى نص، يُعد رمز إعادة توجيه الصدفة >جزءًا من سطر الأوامر، بينما $<يُشير الماكرو إلى ملف HTML.

اللاحقات : .txt .html# من ملف .html إلى ملف .txt .html.txt : lynx -dump $< > $@

عند استدعاء المثال أعلاه من سطر الأوامر، فإنه يتوسع:

$ make -n file.txt lynx -dump file.html > file.txt

قواعد النمط

لا يمكن أن يكون لقواعد اللواحق أي متطلبات مسبقة خاصة بها. [ 51 ] إذا كان لها أي متطلبات مسبقة، فسيتم التعامل معها كملفات عادية بأسماء غير مألوفة، وليس كقواعد لواحق. يدعم GNU Make قواعد اللواحق للتوافق مع ملفات make القديمة، ولكنه يشجع استخدام قواعد الأنماط في غير ذلك . [ 52 ]

تبدو قاعدة النمط كقاعدة عادية، باستثناء أن هدفها يحتوي على %حرف واحد فقط ضمن السلسلة. يُعتبر الهدف نمطًا لمطابقة أسماء الملفات: إذ %يمكنه مطابقة أي سلسلة فرعية من صفر أو أكثر من الأحرف، [ 53 ] بينما تطابق الأحرف الأخرى نفسها فقط. وبالمثل، تُستخدم المتطلبات الأساسية %لتوضيح كيفية ارتباط أسمائها باسم الهدف.

سيبدو المثال أعلاه لقاعدة اللاحقة كما يلي:

# من %.html إلى %.txt %.txt : % .html lynx -dump $< > $@

تعليق

تبدأ التعليقات المكونة من سطر واحد برمز الهاش (#).

التوجيه

يحدد التوجيه سلوكًا خاصًا مثل تضمين ملف makefile آخر.

استمرار السطر

يُشار إلى استمرار السطر\ بعلامة الشرطة المائلة العكسية في نهاية السطر.

 الهدف: المكون عنصر Tab ↹يأمر ؛ \ أمر آخر | \ الأوامر الموجهة

أمثلة

الأوامر التالية تأتي في سياق ملف الإنشاء الذي يليه.

قم بتحديث الهدف الأول، 'all'، ثم قم بتحديث الهدف 'help' لعرض قائمة الأهداف، ثم قم بتحديث الهدف 'dist' لإنشاء حزمة التوزيع.
الحزمة = package الإصدار = ` التاريخ "+%Y.%m%d%" ` دليل_الإصدار = .. ملف_الإصدار = $( الحزمة ) - $( الإصدار )# الهدف الافتراضي # ملاحظة: المتغير LOGNAME يأتي من البيئة all : echo "مرحباً $( LOGNAME ) ، لا يوجد شيء للقيام به افتراضياً" echo "جرب 'make help'"# عرض الأهداف من خلال البحث في هذا الملف help : egrep "^# target:" [ Mm ] akefile # إنشاء ملف توزيع الإصدار : tar -cf $( RELEASE_DIR ) / $( RELEASE_FILE ) && gzip -9 $( RELEASE_DIR ) / $( RELEASE_FILE ) .tar 

فيما يلي ملف Makefile بسيط يقوم افتراضيًا (قاعدة "all" مذكورة أولًا) بتجميع ملف مصدر باسم "helloworld.c" باستخدام مُجمِّع لغة C الخاص بالنظام، كما يوفر هدف "clean" لحذف الملفات المُولَّدة إذا رغب المستخدم في البدء من جديد. يمثل كل من $@و $<اثنين من ما يُسمى بالمتغيرات الداخلية (المعروفة أيضًا بالمتغيرات التلقائية)، ويرمزان إلى اسم الهدف والمصدر "الضمني" على التوالي. في المثال أدناه، $^يتوسع إلى قائمة مفصولة بمسافات للمتطلبات الأساسية. يوجد عدد من المتغيرات الداخلية الأخرى. [ 50 ] [ 54 ]

CFLAGS ?= -g LDLIBS += -lmالكل : خارج . txtOut.txt : helloworld ./$< > $@helloworld : helloworld . o $( CC ) $( LDFLAGS ) -o $@ $^ $( LDLIBS )helloworld.o : مرحبا بالعالم . c $( CC ) $( CFLAGS ) -c -o $@ $<تنظيف : $( RM ) Out.txt helloworld helloworld.o 

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

الجميع : مرحباً بالعالمhelloworld : helloworld . o $( CC ) $( CFLAGS ) $( LDFLAGS ) -o $@ $^تنظيف : $( RM ) helloworld helloworld.o# قاعدة اللاحقة .co : $( CC ) $( CFLAGS ) -c $<اللواحق : .c

أصبح برنامج Make يتعامل تلقائيًا مع اعتماد الملف "helloworld.o" على الملف "helloworld.c". في مثال بسيط كهذا، لا يُعدّ هذا الأمر مهمًا، لكنّ قوة قواعد اللواحق تتضح عندما يزداد عدد ملفات المصدر في مشروع برمجي. يكفي كتابة قاعدة لخطوة الربط وتحديد ملفات الكائنات كمتطلبات أساسية. سيتولى Make حينها تحديد كيفية إنشاء جميع ملفات الكائنات والبحث عن أي تغييرات في جميع ملفات المصدر.

تُجدي قواعد اللواحق البسيطة نفعًا طالما أن ملفات المصدر لا تعتمد على بعضها البعض أو على ملفات أخرى كملفات الرأس. ومن الطرق الأخرى لتبسيط عملية البناء استخدام ما يُسمى بقواعد مطابقة الأنماط، والتي يمكن دمجها مع توليد التبعيات بمساعدة المُصرّف. كمثال أخير يتطلب مُصرّف gcc وGNU Make، إليك ملف Make عام يُصرّف جميع ملفات C في مجلد إلى ملفات الكائنات المُقابلة، ثم يربطها بالملف التنفيذي النهائي. قبل عملية التصريف، تُجمع التبعيات بتنسيق مُلائم لملف Make في ملف مخفي ".depend" يُضاف بعد ذلك إلى ملف Make. ينبغي للبرامج المحمولة تجنب البنى المستخدمة أدناه.

# ملف GNUMakefile عام# مقتطف برمجي للفشل في حال عدم وجود GNU ifneq (,) يتطلب ملف make هذا GNU Make. endifالبرنامج = foo C_FILES := $( wildcard *.c ) OBJS := $( patsubst %.c, %.o, $( C_FILES )) CC = cc CFLAGS = -Wall -pedantic LDFLAGS = LDLIBS = -lmالكل : $( البرنامج )$(PROGRAM) : . depend $( OBJS ) $( CC ) $( CFLAGS ) $( OBJS ) $( LDFLAGS ) -o $( PROGRAM ) $( LDLIBS )يعتمد : . يعتمد.depend : cmd = gcc - MM - MF depend $( var ) ; cat depend >> . depend ; .depend : @echo "إنشاء التبعيات..." @ $( foreach var, $( C_FILES ) , $( cmd )) @rm -f depend-include .depend# هذه هي قواعد مطابقة الأنماط. بالإضافة إلى المتغيرات التلقائية # المستخدمة هنا، يمكن أن يكون المتغير $* الذي يطابق أي شيء يمثله % مفيدًا في حالات خاصة. %.o : % .c $( CC ) $( CFLAGS ) -c $< -o $@% : %. o $( CC ) $( CFLAGS ) -o $@ $<تنظيف : rm -f .depend $( OBJS ).PHONY : clean depend

تتبع التبعيات

تتكون ملفات Makefile من تبعيات، وقد لا يلاحظ المستخدم وجود تبعية منسية أو زائدة على الفور، مما قد يؤدي إلى أخطاء دقيقة في البرنامج المُنشأ يصعب اكتشافها. يمكن استخدام طرق مختلفة لتجنب هذه المشكلة والحفاظ على تزامن التبعيات في ملفات المصدر وملفات Makefile. إحدى هذه الطرق هي استخدام المُصرّف لتتبع تغييرات التبعيات. يستطيع مُصرّف GCC تحليل شفرة المصدر بشكل ثابت وإنشاء قواعد للملف المُحدد تلقائيًا باستخدام المُبدّل -MM. أما الطريقة الأخرى فتتمثل في استخدام ملفات Makefile أو أدوات خارجية تُنشئ ملفات Makefile مع التبعيات (مثل مجموعة أدوات Automake من مشروع GNU ، التي تقوم بذلك تلقائيًا).

هناك نهج آخر يتمثل في استخدام أدوات البناء الشاملة مثل CMake و Meson وما إلى ذلك.

انظر أيضاً

مراجع

  1. "V7/usr/src/cmd/make/ident.c" . tuhs.org . 1 سبتمبر 2013. تم الاطلاع عليه بتاريخ 18 مارس 2018 .{{cite web}}: CS1 maint: deprecated archiveal service ( link )
  2. فيلدمان، إس. آي. (أبريل 1979). "Make --- برنامج لصيانة برامج الحاسوب". البرمجيات: الممارسة والخبرة . 9 (4): 255-265 . CiteSeerX 10.1.1.39.7058 . doi : 10.1002/spe.4380090402 . S2CID 33059412 .  
  3. 1 2 تومسون، تي جيه (نوفمبر 1980). "منصة عمل المصمم: توفير بيئة إنتاج". مجلة بيل سيستم التقنية . 59 (9): 1811-1825 . Bibcode : 1980BSTJ...59.1811T . doi : 10.1002/j.1538-7305.1980.tb03063.x . S2CID 27213583. في الصيانة العامة لمنصة عمل المصمم، استخدمنا نظام التحكم في شفرة المصدر وأداة make التي يوفرها نظام التشغيل التفاعلي PWB/UNIX* . 
  4. ماثيو دوار (2005). بيئات التنمية العملية . دار نشر أورايلي . ص 94. ISBN  978-0-596-00796-6.
  5. "مجموعات جوجل" . arquivo.pt . مؤرشف من الأصل بتاريخ 22 يناير 2011. تم الاطلاع عليه بتاريخ 18 مارس 2018 .{{cite web}}: CS1 maint: bot: حالة عنوان URL الأصلي غير معروفة ( رابط )
  6. "OpenSolaris at Two (Jim Grisanzio)" . 12 ديسمبر 2013. مؤرشف من الأصل في 12 ديسمبر 2013. تم الاطلاع عليه في 18 مارس 2018 .
  7. غريسانزيو، جيم. قصة أوبن سولاريس .
  8. 1 2 3 "التطوير/GBuild - ويكي مؤسسة الوثائق" . wiki.documentfoundation.org . مؤرشف من الأصل بتاريخ 19 مارس 2018. تم الاطلاع عليه بتاريخ 18 مارس 2018 .
  9. 1 2 "دليل بناء أباتشي أوبن أوفيس - ويكي أباتشي أوبن أوفيس" . wiki.openoffice.org . مؤرشف من الأصل بتاريخ 17 مارس 2018. تم الاطلاع عليه بتاريخ 18 مارس 2018 .
  10. شفرة المصدر لبرنامج FreeBSD 2.0.5 Make ، 1993، مؤرشفة من الأصل بتاريخ 2023-03-06 ، تم استرجاعها بتاريخ 2016-05-06
  11. 1 2 "Bmake(1)" . مؤرشف من الأصل بتاريخ 2020-08-03 . تم الاسترجاع بتاريخ 2020-04-01 .
  12. "دليل الأوامر العامة لـ fmake(1)" . مؤرشف من الأصل بتاريخ 20 أبريل 2021. تم الاطلاع عليه بتاريخ 30 نوفمبر 2020 .
  13. "make" . صفحات دليل NetBSD . مؤرشف من الأصل في 9 يوليو 2020. تم الاسترجاع في 9 يوليو 2020 .
  14. "make(1) - صفحات دليل OpenBSD" . man.openbsd.org . مؤرشف من الأصل في 5 فبراير 2018. تم الاطلاع عليه في 18 مارس 2018 .
  15. "make" . FreeBSD . مؤرشف من الأصل في 11 يوليو 2020. تم الاسترجاع في 9 يوليو 2020. يوفر برنامج make إمكانية تضمين ملفات Makefile، والهياكل الشرطية، وحلقات for التي تُذكّر بلغة البرمجة C.
  16. أرنولد روبنز (2005)، يونكس باختصار، الطبعة الرابعة ، أورايلي، مؤرشف من الأصل بتاريخ 21-11-2014 ، تم استرجاعه بتاريخ 28-05-2014
  17. "8. دوال لتحويل النصوص" ، GNU make ، مؤسسة البرمجيات الحرة، 2013، مؤرشف من الأصل بتاريخ 23-05-2014 ، تم استرجاعه بتاريخ 28-05-2014
  18. "8.5 دالة foreach" ، GNU make ، مؤسسة البرمجيات الحرة، 2013، مؤرشف من الأصل في 22-05-2014 ، تم استرجاعه في 28-05-2014
  19. "تغييرات سلسلة إصدارات GCC 3.4، والميزات الجديدة، والإصلاحات" . مؤسسة البرمجيات الحرة. 2006. مؤرشف من الأصل بتاريخ 24-10-2016 . تم الاطلاع عليه بتاريخ 22-07-2016 .
  20. خافيير مارتينيز كانياس (26 ديسمبر 2012). "Kbuild: نظام بناء نواة لينكس" . مجلة لينكس . مؤرشف من الأصل في 21 نوفمبر 2014. تم الاطلاع عليه في 28 مايو 2014 .
  21. غريغ كروه-هارتمان (2006)، نواة لينكس باختصار ، أورايلي، مؤرشف من الأصل بتاريخ 11 أغسطس 2014 ، تم استرجاعه بتاريخ 28 مايو 2014
  22. "تعليمات التركيب" . مؤرشف من الأصل بتاريخ 25-04-2017 . تم الاطلاع عليه بتاريخ 12-05-2017 .
  23. روكي بيرنشتاين. "إعادة صنع - برنامج GNU Make مع تتبع مفهوم ومصحح أخطاء" . مؤرشف من الأصل بتاريخ 21 يناير 2018. تم الاطلاع عليه بتاريخ 20 يناير 2018 .
  24. غلين فاولر (4 يناير 2012). "نظرة عامة على nmake" . أبحاث نظم المعلومات والبرمجيات، مختبرات أبحاث AT&T. مؤرشف من الأصل في 2 سبتمبر 2015. تم الاطلاع عليه في 26 مايو 2014 .
  25. "مرجع NMAKE لـ Visual Studio 2015" . مايكروسوفت. 2015. مؤرشف من الأصل بتاريخ 8 ديسمبر 2009. تم الاطلاع عليه بتاريخ 27 نوفمبر 2009 .
  26. "توجيهات المعالجة المسبقة لملف Makefile" . 2014. مؤرشف من الأصل بتاريخ 26-08-2014 . تم الاطلاع عليه بتاريخ 27-05-2014 .
  27. "عوامل المعالجة المسبقة لملف Makefile" . مايكروسوفت. 2014. مؤرشف من الأصل بتاريخ 26-08-2014 . تم الاطلاع عليه بتاريخ 27-05-2014 .
  28. "مسارات البحث في القواعد" . مايكروسوفت. 2014. مؤرشف من الأصل بتاريخ 26 أغسطس 2014. تم الاطلاع عليه بتاريخ 27 مايو 2014 .
  29. "صنع" . كود جير (TM). 2008. مؤرشف من الأصل في 2017-03-02 . تم الاسترجاع في 2014-08-24 .
  30. "Jom - Qt Wiki" . مشروع Qt. 2021. مؤرشف من الأصل بتاريخ 2021-02-02 . تم الاطلاع عليه بتاريخ 2021-01-26 .
  31. ماكيلروي، دكتور في الطب (1987). قارئ أبحاث يونكس: مقتطفات مشروحة من دليل المبرمج، 1971-1986 (ملف PDF) (تقرير فني). مختبرات بيل. CSTR 139.
  32. هيوم، أندرو ج.؛ فلاندرينا، بوب (2002). "حفظ الملفات على نظام Plan 9 باستخدام Mk" . دليل مبرمج Plan 9. مختبرات AT&T Bell. مؤرشف من الأصل في 11 يوليو 2015.
  33. "google/kati: نسخة تجريبية من GNU make" . GitHub . 30 نوفمبر 2020. مؤرشف من الأصل في 28 نوفمبر 2020. تم الاطلاع عليه في 30 نوفمبر 2020 .
  34. مولدر، فيليكس؛ جابلونسكي، كيم فيليب؛ ليتشر، برايس؛ هول، مايكل ب.؛ تومكينز-تينش، كريستوفر هـ.؛ سوشات، فانيسا؛ فورستر، جان؛ لي، سوهيون؛ تواردزيوك، سفين أ.؛ كانيتز، ألكسندر؛ ويلم، أندرياس (19 أبريل 2021). " تحليل البيانات المستدام باستخدام Snakemake" . F1000Research . 10 : 33. Bibcode : 2021JSPS...10...33M . doi : 10.12688/f1000research.29032.2 . ISSN 2046-1402 . PMC 8114187. PMID 34035898 .   
  35. "GNU 'make'مؤسسة البرمجيات الحرة . مؤرشف من الأصل بتاريخ 2018-06-05 . تم الاطلاع عليه بتاريخ 2014-04-16 .
  36. "Makepp" . مؤرشف من الأصل بتاريخ 15 أغسطس 2025. تم الاطلاع عليه بتاريخ 9 أغسطس 2025 .
  37. "Free BSD make" . مؤرشف من الأصل بتاريخ 2018-05-08 . تم الاطلاع عليه بتاريخ 2018-05-07 .
  38. كيفية فرز مخرجات أمر ls في لينكس ( مؤرشف بتاريخ 13 سبتمبر 2016 في أرشيف الإنترنت)
  39. "ملف الإنشاء" . وثائق مطوري Apple: مُعرّفات الأنواع الموحدة . شركة Apple . مؤرشف من الأصل بتاريخ 22-05-2023 . تم الاسترجاع بتاريخ 22-05-2023 .
  40. آدامز، ب. وسولومون، م.، 1993، نظرة عامة على بيئة تطوير البرمجيات CAPITL. في ورشة العمل الدولية حول إدارة تكوين البرمجيات (ص 1-34). برلين، هايدلبرغ: سبرينغر برلين هايدلبرغ.
  41. نظرة عامة على شبكات DSL. مؤرشفة في 23 أكتوبر 2007، على موقع Wayback Machine ، 27 فبراير 2007، ويكي فينيكس.
  42. ردًا على: تصميم الرقصات والراحة، مؤرشف في 12 سبتمبر 2016، على موقع Wayback Machine ، من كريستوفر ب. فيريس في 9 أغسطس 2002
  43. ملفات Target Junior Makefiles مؤرشفة في 7 يناير 2010 على موقع Wayback Machine ، من تأليف أندرو دبليو. فيتزجيبون وويليام أ. هوفمان
  44. 3.1 محتويات ملفات Makefiles ( مؤرشف بتاريخ 2021-05-05 على Wayback Machine ، GNU make ، مؤسسة البرمجيات الحرة)
  45. "أنواع المتطلبات الأساسية (GNU make)" . GNU.org . مشروع جنو . مؤرشف من الأصل في 2 ديسمبر 2020. تم الاطلاع عليه في 15 ديسمبر 2020 .
  46. 1 2 "الفصل 15. الأدوات: make: أتمتة وصفاتك"، فن برمجة يونكس ، إريك س. ريموند 2003
  47. مرجع الصدفة والأدوات المساعدة، مواصفات يونكس الموحدة ، الإصدار 5 من مجموعة Open Groupmake  
  48. "صنع" . مؤرشف من الأصل بتاريخ 2024-10-05 . تم الاطلاع عليه بتاريخ 2024-10-29 .
  49. دليل الأوامر العامة لنظام FreeBSDmake(1)  
  50. 1 2 "make" . www.opengroup.org . مؤرشف من الأصل في 31 أكتوبر 2010. تم الاطلاع عليه في 18 مارس 2018 .
  51. "دليل GNU make: قواعد اللواحق" . مؤسسة البرمجيات الحرة. مؤرشف من الأصل بتاريخ 22-05-2014 . تم الاطلاع عليه بتاريخ 24-05-2014 .
  52. "دليل GNU make: قواعد النمط" . مؤسسة البرمجيات الحرة. مؤرشف من الأصل بتاريخ 28-05-2014 . تم الاطلاع عليه بتاريخ 24-05-2014 .
  53. انظر قسم قواعد مطابقة الأنماط في صفحة دليل SunPro. مؤرشف بتاريخ 29 مايو 2014 في Wayback Machine
  54. المتغيرات التلقائية مؤرشفة في 25 أبريل 2016 على موقع Wayback Machine، GNU `make`