بأي ترتيب سيتم تنفيذ المتطلبات الأساسية بواسطة GNU؟

StackOverflow https://stackoverflow.com/questions/1647480

  •  22-07-2019
  •  | 
  •  

سؤال

لنفترض أن لدينا القاعدة:

a: b c d e

و b, c, d و e مستقلة عن بعضها البعض.

هو ترتيب صنع b, c, d, e مُعرف؟يبدو أنه سيتم ترتيبها بشكل عام b, c, d, e, ولكن هل يمكن أن يحدث في بعض الأحيان أن يكون الترتيب مختلفًا؟

هل كانت مفيدة؟

المحلول

وبالتأكيد، إذا كنت تستخدم make -j a، لأنها قد بنيت جميعا الحصول على في نفس الوقت (اعتمادا على ما إذا b، c، d، أو e بدورها لها تبعيات أخرى / المترابطة).

نصائح أخرى

لا، لم يتم تعريف النظام. هذا هو كله <م> نقطة في استخدام التعريفي البرمجة الموجهة التبعية: أن الكمبيوتر يمكن اختيار ترتيب التقييم الأمثل، أو في الواقع، وتقييم لهم حتى في نفس الوقت <. / P>

<اقتباس فقرة>   

في ما الشروط وسوف يكون النظام الذي أحرزته GNU جعل؟

وهذا يعتمد على نوع من الشرط. ووفقا ثو في GNU جعل دليل ، القسم 4.2:

<اقتباس فقرة>   

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

     

وعادة، وهذا هو بالضبط ما تريد: إذا شرط هدفا هو   المحدثة، ثم يجب أن يتم تحديث الهدف أيضا.

     

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

   targets: normal-prerequisites | order-only-prerequisites
     

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

     

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

OBJDIR := objdir
OBJS := $(addprefix $(OBJDIR)/,foo.o bar.o baz.o)

$(OBJDIR)/%.o : %.c
    $(COMPILE.c) $(OUTPUT_OPTION) $<

all: $(OBJS)

$(OBJS): | $(OBJDIR)

$(OBJDIR):
    mkdir $(OBJDIR)
     

والآن حكم لخلق سيتم تشغيل "objdir" دليل، إذا لزم الأمر،   قبل أي '. س "هو مبني، ولكن لا". س "سيبنى لأن   تغيرت "objdir" الطابع الزمني الدليل.

في ترتيب الحق ، على أساس القواعد التي تقدمها. على سبيل المثال معينة، يمكن أن يعني أي واحد من عدد مختلف (4! = 24، من الذاكرة) أوامر.

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

إذا كنت تحتاج إلى الاعتماد على ترتيب معين، سوف تحتاج مزيد من القواعد لإنفاذه. إلا make تستطيع أن تفعل ما يحلو لها. و للحصول على GNU تبذل الدول فقط كيف <م> قواعد يتم معالجتها، وليس الترتيب الذي تبعيات داخل قاعدة يتم معالجتها. الأمر الأكثر منطقية (بالنسبة لي، على أي حال) سيكون الترتيب الذي كنت المدرجة ولكن هذا ليس مضمونا.

لا، لا يمكنك الاعتماد على الترتيب في حالة عدم وجود علاقات تبعية.

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

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

a: b c
    $(MAKE) d
    $(MAKE) e
    # Additional steps to make a

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

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top