كيفية جعل الفشل $ (شل) قيادة المقاطعة جعل

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

  •  03-07-2019
  •  | 
  •  

سؤال

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

وحاليا، أفعل شيئا من هذا القبيل (المستوى الأعلى، أي العمود 1):

$(info Generating build rules...)
$(shell python collect_sources.py)
include BuildRules.mk

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

وإذا كان ذلك ممكنا، فإن الحل يجب أن تعمل حتى عندما بسيطة قذيفة MS-DOS هي قذيفة نظام القياسية.

وأي اقتراح؟

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

المحلول 2

وطيب، وهنا حل بلدي، والتي للأسف لا تستند إلى قانون الأحوال من السيناريو collect_sources.py، ولكن الذي يعمل بالنسبة لي (TM)، ويتيح لي أن نرى أي إخراج السيناريو تنتج:

SHELL_OUTPUT := $(shell python collect_sources.py 2>&1)
ifeq ($(filter error: [Errno %],$(SHELL_OUTPUT)),)
  $(info $(SHELL_OUTPUT))
else
  $(error $(SHELL_OUTPUT))
endif

وكتب السيناريو بحيث ينتج أي خطأ ناتج بدءا "collect_sources: error:". بالإضافة إلى ذلك، إذا الثعبان لا يمكن العثور على أو تنفيذ البرنامج النصي معين، فإنه إخراج رسالة خطأ تحتوي على "[Errno 2]" رسالة أو ما شابه ذلك. وحتى هذه قطعة صغيرة من التعليمات البرمجية يلتقط مجرد الإخراج (إعادة توجيه ستدير إلى المعياري) والبحث عن رسائل الخطأ. إذا تم العثور على أي، فإنه يستخدم ببساطة $(info) لطباعة الإخراج، وإلا فإنه يستخدم $(error)، الأمر الذي يجعل فعال جعل توقف.

لاحظ أن المسافة البادئة في ifeq ... endif يتم بمسافات. إذا تم استخدام علامات التبويب، وجعل يفكر كنت تحاول استدعاء أمر ويشكو حول هذا الموضوع.

نصائح أخرى

وربما تكون هناك طريقة أفضل، لكنني حاولت يلي ويعمل:

$(if $(shell if your_command; then echo ok; fi), , $(error your_command failed))

وهنا فعلت نفترض أن your_command لا تعطي أي الإخراج، ولكن لا ينبغي أن يكون من الصعب للتغلب على مثل هذه الحالة.

وتحرير: لتجعل من العمل مع ويندوز قذيفة الافتراضية (وربما أي قذيفة لائقة) يمكن أن تكتب your_command && echo ok بدلا من if ضمن الدالة shell. أنا لا أعتقد أن هذا هو الممكن ل(القديمة) قذائف DOS. لهذه ربما كنت ترغب في التكيف مع your_command أو كتابة السيناريو المجمع لطباعة شيء على الخطأ (أو النجاح).

ويجب عليك استخدام هدفا متكررا لخلق BuildRules.mk:

BuildRules.mk: collect_sources.py
        python $< >$@

include BuildRules.mk

وهذا هو خدعة القياسية لاستخدامها عند توليد تبعيات تلقائيا.

https://stackoverflow.com/a/226974/192373

.PHONY: BuildRules.mk

BuildRules.mk: collect_sources.py
        echo Generating build rules...)
        python $< >$@
        $(MAKE) -f BuildRules.mk

تأكد من أنك لا تحتكم إجراء / gmake مع الخيار -k.

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