مشكلة makefile مع الشرطية المستخدمة في تحديد المستخدم في أوامر جزء من القاعدة
-
04-07-2019 - |
سؤال
لدي قسم من Makefile يحتوي على هذا النوع من الهيكل:
bob:
ifdef DEBUG
@echo running
endif
@echo chug chug chug
ifdef DEBUG
@echo done
endif
bobit:
@echo "before"
@make bob
@echo "after"
أنا أبسط كثيرًا هنا ، جميع الصدى هي في الواقع كتل غير تافهة للأوامر وهناك المزيد من الأشياء المشروطة ، لكن هذا يلتقط جوهر مشكلتي.
لأسباب تقنية لا أرغب في الدخول في الوقت الحالي ، أحتاج إلى التخلص من هذه الجعة الفرعية ، ولكن لأن الصدى يمثل كميات غير تافهة من التعليمات البرمجية التي لا أريد فقط نسخها وتجاوز جسم بوب بدلاً من جولة فرعية.
من الناحية المثالية ما أود فعله هو شيء من هذا القبيل
define BOB_BODY
ifdef DEBUG
@echo running
endif
@echo chug chug chug
ifdef DEBUG
@echo done
endif
endef
bob:
$(BOB_BODY)
bobit:
@echo "before"
$(BOB_BODY)
@echo "after"
لسوء الحظ ، يبدو أن الشروطات تنفصل عني ، وهي تنتج أخطاء "IFDEF: أمر غير موجود" ، لقد حاولت الالتفاف على هذا مع مجموعات مختلفة من التقييم والاتصال ، لكن لا يمكن أن تكتشف طريقة لجعلها تعمل.
كيف أجعل هذا العمل؟ وهل هي الطريقة الصحيحة للتعامل مع المشكلة؟
المحلول
الطريقة التي قمت بإصلاحها هي استخدام شرطية Bash بدلاً من ذلك ، مما يجعل من المعنى بعض الشيء لأننا نلعب بأوامر وعدم وضع القواعد.
لذا فإن حلي المثالي من الأعلى يصبح شيئًا مثل
define BOB_BODY
@if [[ -n "$(DEBUG)" ]]; then \
echo running; \
fi;
@echo chug chug chug
@if [[ -n "$(DEBUG)" ]]; then \
echo done; \
fi
endef
بوب: $ (bob_body)
bobit: echo "قبل" $ (bob_body) @echo "بعد"
نصائح أخرى
يمكنك ببساطة تغيير ترتيب IFDEF/تعريف:
ifdef DEBUG
define BOB_BODY
@echo running
@echo chug chug chug
@echo done
endef
else
define BOB_BODY
@echo chug chug chug
endef
endif
تحديث
define CHUG
@echo chug chug chug
endef
ifdef DEBUG
define BOB_BODY
@echo running
$(CHUG)
@echo done
endef
else
define BOB_BODY
$(CHUG)
endef
endif