مشكلة makefile مع الشرطية المستخدمة في تحديد المستخدم في أوامر جزء من القاعدة

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

  •  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
مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top