لن يقوم ملف Makefile الرئيسي للمشاريع الفرعية بتجميع المشاريع الفرعية

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

  •  22-08-2019
  •  | 
  •  

سؤال

لدي مشروع أعمل على إصداره ويحتوي في الواقع على 3 مشاريع فرعية، ويجب تجميعها جميعًا دفعة واحدة.يبدو ملف التعريف الخاص بي تقريبًا مثل هذا:

all: a b c

a:
    @cd a && make

b:
    @cd b && make

c:
    @cd c && make

يتم تجميع المشروعين A وB بشكل جيد ولكن بالنسبة للمشروع الثالث، يخبرني أنه لا يوجد شيء يجب القيام به على الرغم من أن التبديل إلى الدليل C وتشغيل make يؤدي في الواقع إلى تجميع التعليمات البرمجية.

لكي نكون أكثر تحديدًا:المشروع C في المثال أعلاه هو في الواقع SpiderMonkey من Mozilla.في حين أن A وB هما كود/ملفات إنشاء قمت بكتابتها، فإن C هو مجرد نسخة أولية من SpiderMonkey من موقع Mozilla الإلكتروني.أمر الترجمة الفعلي له هو:

make JS_DIST=/usr JS_THREADSAFE=1 JS_HAS_FILE_OBJECT=1

في ملف Makefile الرئيسي الخاص بي، لدي:

spidermonkey:
    @cd spidermonkey/src && $(MAKE) JS_DIST=/usr JS_THREADSAFE=1 JS_HAS_FILE_OBJECT=1

تشغيل مخرجات "make Spidermonkey" "make:لا يوجد شيء يمكن القيام به من أجل `spidermonkey'." كيف يمكنني تشغيل الأمر؟

يحرر:لقد حاولت إضافة الأسطر التالية إلى ملف التعريف الخاص بي:

.PHONY: spidermonkey

بالإضافة إلى إعادة تسمية قاعدة Spidermonkey إلى sm، ولكن لم يحدث أي تغيير حتى الآن.

يحرر:خطأي!كان لدي مسافات عندما كان يجب أن يكون لدي علامة تبويب.دوه!

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

المحلول

من المحتمل أن يكون لديك ملف أو دليل في المستوى الأعلى يسمى "spidermonkey".يعتقد Make أن هذا هو ما من المفترض أن ينشئه، وبما أنه موجود بالفعل، توقف.

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

 a:
       <some command>

يجب أن ينتج هذا الأمر ملفًا واحدًا يسمى "a".

القواعد التي لا تنتج ملفات ولكنها موجودة فقط كعناصر نائبة تسمى أهداف زائفة, ، ويجب إعلانها على النحو التالي:

 .PHONY: a

سوف يفترض Make دائمًا أنه يجب إعادة صنعه.

وأيضا كقاعدة عامة لا تستخدم "make" لاستدعاء make بشكل متكرر، استخدم $(MAKE) بدلاً من ذلك.

يحرر:تم تغيير "الزائفة" إلى "زائفة"

نصائح أخرى

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

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

والحديث عن جعل متكررة من جانب الطريق، وهذا هو يست بالضرورة فكرة جيدة، يمكنك الاطلاع على العودية جعل تعتبر ضارة .

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