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

يصنع
نموذجماكرو ، إعلاني
صمم بواسطةستيوارت فيلدمان
ظهرت لأول مرةأبريل 1976 ؛ منذ 48 عامًا ( 1976-04 )
لغة التنفيذج
نظام التشغيلشبيه يونكس ، الجحيم
تنسيقات الملفاتملف ماكفايل
التنفيذات الرئيسية
BSD، GNU، nmake
اللهجات
BSD make، GNU make، Microsoft nmake
متأثر
Ant و Rake و MSBuild وغيرها

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

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

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

أصل

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

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

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

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

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

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

المتغيرات

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

  • ظهر Sun DevPro Make في عام 1986 مع SunOS-3.2. مع SunOS-3.2. تم تقديمه كبرنامج اختياري؛ مع SunOS-4.0، تم جعل SunPro Make برنامج Make الافتراضي. [5] [ مطلوب مصدر أفضل ] في ديسمبر 2006، تم جعل Sun DevPro Make مفتوح المصدر كجزء من الجهود المبذولة لجعل Solaris مفتوح المصدر . [6] [7]
  • dmake أو Distributed Make الذي جاء مع Sun Solaris Studio كإصدار افتراضي، ولكن ليس كإصدار افتراضي على نظام التشغيل 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] ومن المميز أنه يحتوي على شرطيات وحلقات تكرارية يتم تطبيقها في مرحلة التحليل ويمكن استخدامها لبناء ملف make بشكل مشروط وبرمجي، [15] بما في ذلك إنشاء الأهداف في وقت التشغيل. [ بحاجة لمصدر ]
  • GNU Make (اختصارًا gmake ) هو التنفيذ القياسي لـ Make لنظامي Linux وmacOS. [16] يوفر العديد من الامتدادات على Make الأصلي، مثل الشرطيات. كما يوفر العديد من الوظائف المضمنة التي يمكن استخدامها للتخلص من الحاجة إلى برمجة shell في قواعد ملف make بالإضافة إلى التلاعب بالمتغيرات المحددة والمستخدمة في ملف make. [17] على سبيل المثال، يمكن استخدام وظيفة foreach للتكرار على قائمة من القيم، مثل أسماء الملفات في دليل معين. [18] يعد GNU Make مطلوبًا لبناء العديد من أنظمة البرامج، بما في ذلك GNU Compiler Collection (GCC) (منذ الإصدار 3.4 [19] )، ونواة Linux، [20] [21] Apache OpenOffice، [9] LibreOffice، [8] و Mozilla Firefox . [22]
  • Rocky Bernstein's Remake [23] هو شوكة من GNU Make ويوفر العديد من الامتدادات عبر GNU Make، مثل الموقع الأفضل وتقارير موقع الخطأ، وتتبع التنفيذ، وملف تعريف التنفيذ، ويحتوي على مصحح أخطاء.
  • إن برنامج nmake الخاص بـ Glenn Fowler [24] (غير المرتبط بمتغير Microsoft الذي يحمل نفس الاسم) غير متوافق مع متغير UNIX، ولكنه يوفر ميزات تقلل، وفقًا لبعض الأشخاص، من حجم ملفات make بعامل 10.
  • يتم تثبيت Microsoft nmake عادةً مع Visual Studio . [25] وهو يدعم توجيهات المعالج المسبق مثل التضمينات والتعبيرات الشرطية التي تستخدم المتغيرات المعينة على سطر الأوامر أو داخل ملفات make. [26] [27] تختلف قواعد الاستدلال عن Make؛ على سبيل المثال، يمكنها تضمين مسارات البحث. [28]
  • يحتوي برنامج Embarcadero make على خيار سطر أوامر "يتسبب في محاكاة MAKE لبرنامج NMAKE من Microsoft". [29]
  • أداة Jom الخاصة بمشروع Qt هي نسخة طبق الأصل من nmake. [30]
  • حلت Mk محل Make في Research Unix ، بدءًا من الإصدار 9. [31] وهي إعادة تصميم للأداة الأصلية بواسطة مبرمج Bell Labs Andrew G. Hume، وتتميز بتركيب نحوي مختلف. أصبحت Mk أداة البناء القياسية في Plan 9 ، خليفة Bell Labs المقصود لنظام Unix. [32]
  • Kati هو بديل GNU Make من Google، والذي تم استخدامه في إصدارات نظام التشغيل Android اعتبارًا من عام 2020. يقوم بترجمة ملف make إلى ninja من أجل عمليات بناء تدريجية أسرع (على غرار أداة cmake metatool). [33]
  • Snakemake هو تنفيذ مدفوع بلغة Python لتجميع وتشغيل سير عمل المعلومات الحيوية . [34]

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

يستخدم

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

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

إجراء تحديثات للأهداف التي تم تمريرها كحجج:

إنشاء [ -f makefile ] [ خيارات ] [ أهداف ]    

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

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

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

جعل العمليات خيارات سطر الأوامر استنادًا إلى ملف makefile المحمل.

ملف ماكفايل

ملف ماكفايل
معرف النوع الموحد (UTI)public.make-source [39]

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

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

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

قواعد

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

realclean : تنظيف distclean  

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

file.txt : ملف . html lynx -dump file.html > file.txt
 
	    

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

  • يشير minus (-) إلى تجاهل الخطأ من الأمر
  • يشير (@) إلى عدم إخراج الأمر قبل تنفيذه
  • يشير الجمع (+) إلى تنفيذ الأمر حتى إذا تم استدعاء Make في وضع "عدم التنفيذ"

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

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

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

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

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

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

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

يمكن أن تتكون قيمة الماكرو من قيم ماكرو أخرى. يتم توسيع قيمة الماكرو عند كل استخدام ( ببطء ).

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

NEW_MACRO = $( MACRO ) - $( MACRO2 )  

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

YYYYMMDD != تاريخ
  

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

جعل MACRO = "قيمة" [ MACRO = "قيمة" ... ] الهدف [ الهدف ... ]      

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

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

	 

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

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

تحتوي قواعد اللواحق على "أهداف" تحمل أسماء في النموذج .FROM.TOوتُستخدم لتشغيل الإجراءات استنادًا إلى امتداد الملف. في أسطر أوامر قواعد اللواحق، يحدد POSIX [50] أن الماكرو الداخلي $<يشير إلى المتطلب الأساسي الأول $@ويشير إلى الهدف. في هذا المثال، الذي يحول أي ملف HTML إلى نص، يكون رمز إعادة توجيه shell >جزءًا من سطر الأوامر بينما $<يشير الماكرو إلى ملف 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 ↹الأمر؛ \
    الأمر | \
    الأمر الموجه
Tab ↹Tab ↹

أمثلة

الأوامر التالية موجودة في سياق الملف makefile الذي يليه.

قم بإجراء # تحديثات على الهدف الأول، "الكل"، 
قم بإجراء مساعدة # تحديثات على الهدف "مساعدة" لإدراج الأهداف، 
قم بإجراء dist # تحديثات على الهدف "dist" للبناء للتوزيع                            
الحزمة = الحزمة
 الإصدار = ` التاريخ "+%Y.%m%d%" ` RELEASE_DIR = ..
 RELEASE_FILE = $( PACKAGE ) - $( VERSION )	  	     
     

# الهدف الافتراضي 
# ملاحظة: المتغير LOGNAME يأتي من البيئة 
all : 
echo "Hello $( LOGNAME ) , nothing to do by default" echo "Try 'make help'"	 
	 

# عرض الأهداف عن طريق البحث عن هذا الملف 
help :
	 egrep "^# target:" [ Mm ] akefile  


# قم بإنشاء توزيع إصدار :
	 tar  -cf $( RELEASE_DIR ) / $( RELEASE_FILE ) && \ gzip -9 $( RELEASE_DIR ) / $( RELEASE_FILE ) .tar
    
	   

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

CFLAGS ؟= -g  

الكل : مرحبا بالعالم 

مرحبا بالعالم : مرحبا بالعالم . o $( CC ) $( LDFLAGS ) -o $@ $^ 
	    

helloworld.o : مرحبا بالعالم . c $( CC ) $( CFLAGS ) -c -o $@ $< 
	     

نظيف : 
$( RM ) مرحبا بالعالم مرحبا بالعالم.o
	  

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

الكل : مرحبا بالعالم 

مرحبا بالعالم : مرحبا بالعالم . o $( CC ) $( CFLAGS ) $( LDFLAGS ) -o $@ $^ 
	     

نظيف : 
$( RM ) مرحبا بالعالم مرحبا بالعالم.o	  

# قاعدة اللاحقة 
.co : 
$( CC ) $( CFLAGS ) -c $<	   

.اللاحقات :  . ج


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

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

# ملف GNUMakefile عام

# مقطع يفشل إذا لم يكن GNU 
ifneq (,) 
يتطلب هذا الملف make. endif GNU Make    


البرنامج = foo
 C_FILES := $( wildcard *.c ) OBJS := $( patsubst %.c, %.o, $( C_FILES )) CC = cc
 CFLAGS = -Wall -pedantic
 LDFLAGS = LDLIBS = -lm     
     
      
  

الكل : $( البرنامج ) 

(البرنامج) :  . يعتمد على  ( OBJS ) 
( CC ) ( CFLAGS ) ( OBJS ) ( LDFLAGS ) -o ( البرنامج ) ( LDLIBS )	      

تعتمد :  . تعتمد

.depend : cmd = gcc - MM - MF depend $( var ) ; cat depend >> .depend ;
 .depend : @echo "إنشاء التبعيات..." @ $( foreach var, $( C_FILES ) , $( cmd )) @rm -f depend    
	 
	   
	  

-تتضمن .depend

# هذه هي قواعد مطابقة الأنماط. بالإضافة إلى المتغيرات التلقائية المستخدمة هنا، 
يمكن أن يكون المتغير $* الذي يطابق أيًا كان ما يمثله % مفيدًا في حالات خاصة. 
%.o : %.c $ ( CC ) $( CFLAGS ) -c $< -o $@
 
	     

% :  %.o $ 
( CC ) $( CFLAGS ) -o $@ $<	    

تنظيف :
	 rm  -f  .depend $( OBJS ) 

.PHONY : تعتمد على النظافة  

تتبع التبعية

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

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

انظر أيضا

مراجع

  1. ^ "V7/usr/src/cmd/make/ident.c". tuhs.org . 1 سبتمبر 2013. مؤرشف من الأصل في 1 سبتمبر 2013. اطلع عليه بتاريخ 18 مارس 2018 .
  2. ^ Feldman, SI (أبريل 1979). "Make --- A Program for Maintenanceing Computer Programs". Software: Practice and Experience . 9 (4): 255–265. CiteSeerX 10.1.1.39.7058 . doi :10.1002/spe.4380090402. S2CID  33059412. 
  3. ^ ab Thompson, TJ (نوفمبر 1980). "Designer's Workbench: Provide a Production Environment". Bell System Technical Journal . 59 (9): 1811–1825. doi :10.1002/j.1538-7305.1980.tb03063.x. S2CID  27213583. في الصيانة العامة لـ DWB، استخدمنا نظام التحكم في الكود المصدري والأداة المساعدة التي يوفرها نظام التشغيل التفاعلي 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. ^ جريسانزيو، جيم. قصة OpenSolaris.
  8. ^ abc "Development/Gbuild - The Document Foundation Wiki". wiki.documentfoundation.org . تم الاسترجاع في 18 مارس 2018 .
  9. ^ "دليل بناء Apache OpenOffice - Apache OpenOffice Wiki". wiki.openoffice.org . تم الاسترجاع في 18 مارس 2018 .
  10. ^ FreeBSD 2.0.5 Make Source Code، 1993
  11. ^ من "Bmake(1)".
  12. ^ "دليل الأوامر العامة لـ fmake(1)".
  13. ^ "make". صفحات دليل NetBSD . تم الاسترجاع في 9 يوليو 2020 .
  14. ^ "make(1) - صفحات دليل OpenBSD". man.openbsd.org . تم الاسترجاع في 18 مارس 2018 .
  15. ^ "make". FreeBSD . تم الاسترجاع في 9 يوليو 2020 . يتم توفير تضمين ملفات Make، والهياكل الشرطية، وحلقات for التي تذكرنا بلغة البرمجة C في make.
  16. ^ أرنولد روبنز (2005)، يونكس في جوهره، الطبعة الرابعة، أوريلي
  17. ^ "8. وظائف لتحويل النص"، GNU make ، مؤسسة البرمجيات الحرة، 2013
  18. ^ "8.5 دالة foreach"، GNU make ، مؤسسة البرمجيات الحرة، 2013
  19. ^ "تغييرات وميزات جديدة وإصلاحات في سلسلة إصدارات GCC 3.4". مؤسسة البرمجيات الحرة. 2006.
  20. ^ خافيير مارتينيز كانيلاس (26 ديسمبر 2012). "Kbuild: نظام بناء نواة لينكس". مجلة لينكس .
  21. ^ جريج كرواه هارتمان (2006)، نواة لينكس في جوهرها، أوريلي
  22. ^ "تعليمات البناء".
  23. ^ روكي بيرنشتاين. "إعادة صنع – GNU Make مع تتبع مفهوم ومصحح أخطاء".
  24. ^ Glenn Fowler (4 يناير 2012). "نظرة عامة على nmake". أبحاث أنظمة المعلومات والبرمجيات، AT&T Labs Research. مؤرشف من الأصل في 2 سبتمبر 2015. تم الاسترجاع في 26 مايو 2014 .
  25. ^ "مرجع NMAKE في Visual Studio 2015". Microsoft. 2015.
  26. ^ "توجيهات المعالجة المسبقة لملف Makefile". 2014.
  27. ^ "مشغلات المعالجة المسبقة لملفات Makefile". Microsoft. 2014.
  28. ^ "مسارات البحث في القواعد". مايكروسوفت. 2014.
  29. ^ "MAKE". CodeGear(TM). 2008.
  30. ^ “جوم – كيو تي ويكي”. مشروع كيو تي. 2021.
  31. ^ McIlroy, MD (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.
  34. ^ مولدر، فيليكس؛ جابلونسكي، كيم فيليب؛ ليتشر، برايس؛ هول، مايكل ب؛ تومكينز-تينش، كريستوفر هـ؛ سوشات، فانيسا؛ فورستر، جان؛ لي، سوهيون؛ تواردزيوك، سفين أو؛ كانيتز، ألكسندر؛ ويلم، أندرياس (2021-04-19). "تحليل البيانات المستدامة باستخدام Snakemake". F1000Research . 10 : 33. doi : 10.12688/f1000research.29032.2 . ISSN  2046-1402. PMC 8114187. PMID 34035898  . 
  35. ^ "GNU 'make'". مؤسسة البرمجيات الحرة.
  36. ^ "ماكيب".
  37. ^ "صنع BSD مجاني".
  38. ^ كيفية فرز مخرجات ملف أمر ls في Linux محفوظ في 13 سبتمبر 2016، على موقع Wayback Machine
  39. ^ "makefile". وثائق مطوري Apple: معرفات النوع الموحد . Apple Inc.
  40. ^ Adams, P. and Solomon, M., 1993, An Overview of the software development Environment CAPITL. In International Workshop on Software Configuration Management (pp. 1-34). Berlin, Heidelberg: Springer Berlin Heidelberg.
  41. ^ نظرة عامة على dsls محفوظ في 23 أكتوبر 2007، على موقع Wayback Machine ، 2007/02/27، phoenix wiki
  42. ^ Re: تصميم الرقصات وREST محفوظ في 12 سبتمبر 2016، على موقع Wayback Machine ، من Christopher B Ferris في 2002-08-09
  43. ^ Target Junior Makefiles Archived January 7, 2010, at the Wayback Machine , Andrew W. Fitzgibbon and William A. Hoffman
  44. ^ 3.1 ما تحتويه ملفات Makefiles، GNU make ، مؤسسة البرمجيات الحرة
  45. ^ "أنواع المتطلبات الأساسية (GNU make)". GNU.org . GNU Project . تم الاسترجاع في 15 ديسمبر 2020 .
  46. ^ "الفصل 15. الأدوات: صنع: أتمتة وصفاتك"، فن برمجة يونكس ، إريك س. رايموند 2003
  47. ^ make  – مرجع Shell and Utilities، مواصفات UNIX الفردية ، الإصدار 4 من The Open Group
  48. ^ https://pubs.opengroup.org/onlinepubs/9799919799/utilities/make.html
  49. ^ make(1)  –  دليل الأوامر العامة لـ FreeBSD
  50. ^ ab "make". www.opengroup.org . تم الاسترجاع في 18 مارس 2018 .
  51. ^ "دليل GNU make: قواعد اللواحق". مؤسسة البرمجيات الحرة.
  52. ^ "دليل GNU make: قواعد النمط". مؤسسة البرمجيات الحرة.
  53. ^ انظر قسم قواعد مطابقة الأنماط في صفحة دليل SunPro المؤرشفة في 29 مايو 2014، على موقع Wayback Machine
  54. ^ المتغيرات التلقائية أرشيف 25 أبريل 2016، على موقع Wayback Machine GNU 'make'
  • الصفحة الرئيسية لبرنامج GNU Make


Retrieved from "https://en.wikipedia.org/w/index.php?title=Make_(software)&oldid=1254130927#Makefile"
Original text
Rate this translation
Your feedback will be used to help improve Google Translate