মেকফাইল ইফেক যৌক্তিক বা


94

আপনি কীভাবে মেকের ifeqঅপারেটর ব্যবহার করে একটি লজিক্যাল OR সম্পাদন করবেন ?

যেমন, আমি (সরলীকৃত) করেছি:

ifeq ($(GCC_MINOR), 4)
    CFLAGS += -fno-strict-overflow
endif
ifeq ($(GCC_MINOR), 5)
    CFLAGS += -fno-strict-overflow
endif

তবে এই লাইনগুলিকে একীভূত করতে চাই।

(হ্যাঁ, হ্যাঁ, অটটুলগুলি, কনফিগার করা ইত্যাদি; বর্তমান পরিস্থিতিতে খুব ভারী, মেকফিলের মধ্যে সমস্ত কিছু এখানে রাখতে চাই)

[এই প্রশ্নের যৌক্তিক বিপরীতে: 'ifeq' বিবৃতিতে একাধিক শর্তের ব্যবহার কীভাবে করবেন ]



4
ভাবেন না এটি একটি ডুপ, লিঙ্কযুক্ত প্রশ্নটি চেইন ifdefঅপারেটরগুলির সাথে সম্পর্কিত, এই প্রশ্নটি চেইনিং ifeqঅপারেটরগুলির সাথে সম্পর্কিত , অনুরূপ, তবে উত্তরগুলি অবশ্যই আলাদা।
প্যাট

উত্তর:


104

মেলিং তালিকার সংরক্ষণাগারে পাওয়া গেছে,

এক ফিল্টার ফাংশন ব্যবহার করতে পারেন ।

উদাহরণ স্বরূপ

 ifeq ($(GCC_MINOR),$(filter $(GCC_MINOR),4 5))

ফিল্টার এক্স, এবি এ, বি এর সমান এক্স সমান ফিরিয়ে দেবে

এটির একটি বৈকল্পিকতা

 ifneq (,$(filter $(GCC_MINOR),4 5))

যেখানে পরিবর্তে খালি স্ট্রিংয়ের বিরুদ্ধে নেতিবাচক তুলনা ব্যবহৃত হয় ( GCC_MINOR আর্গুমেন্টের সাথে মেলে না তবে ফিল্টার এন খালি স্ট্রিংটি ফিরে আসবে)

এই পদ্ধতিগুলির নেতিবাচক দিকটি হল আর্গুমেন্টগুলি এককথায় থাকতে হবে।


7
একটি দেরী দ্রষ্টব্য: আপনার উপরে দুটি পরিবর্তনের মধ্যে প্রথমে true (জিসিসি_মিনোর) ফাঁকা থাকলে সত্য হিসাবে সংশোধন করা হবে, অন্যদিকে এটি দ্বিতীয় হবে না (সুতরাং দ্বিতীয়টি সাধারণভাবে বলতে গেলে আরও ভাল সমাধান)।
জন

4
আসলে, এটি হওয়া উচিত ifneq (,$(filter 4 5,$(GCC_MINOR))):)
টাক্সডুড

4
সম্ভবত সরলতার জন্য ছেড়ে যাওয়া ভাল?
জেসন

অন্য দ্রষ্টব্য: এটি সাধারণ বা বিবৃতি হিসাবে কাজ করে না । আমাদের কিছু আছে যেখানে আমরা যাচাই করতে চাই if(flagA == TRUE || flagB == true), তবে আপনি যদি করেন $(filter true, $(flagA) $(flagB)এবং উভয়ই সত্য হন তবে আপনি পাবেনifeq(true, true true)
চার্লি সু

27

আপনি অন্য পরিবর্তনশীল প্রবর্তন করতে পারেন। এটি উভয় চেককে একীভূত করতে পারে না, তবে এটি কমপক্ষে দু'বার দেহে প্রবেশ করা এড়িয়ে যায়:

do_it = 
ifeq ($(GCC_MINOR), 4)
    do_it = yes
endif
ifeq ($(GCC_MINOR), 5)
    do_it = yes
endif
ifdef do_it
    CFLAGS += -fno-strict-overflow
endif

7
স্কেল এটির রক্ষণাবেক্ষণ আমার পক্ষে খুব ভাল মনে হয় না: / তারপরে আবার আমরা স্কেল কথা বলা শুরু করি, আমি অনুমান করি আমরা অটোটুলগুলি বলছি
প্যাট

4
@ প্যাট: আমি বরং এই পদ্ধতিকেই প্রাধান্য দিচ্ছি যেখানে আমি মেকফিলের এক জায়গায় অ্যাসাইনমেন্টটি পৃথক করতে পারি, সম্ভবত আরও বেশি মানগুলির সাথে তুলনা করে ইফেক / অন্য ইফেক / অন্য কোনও ব্যবহার না করে বরং ফিল্টার ফাংশনটি ব্যবহার করে যা কেবলমাত্র লাইনগুলি পড়ার পক্ষে দীর্ঘতর কঠিন করতে পারে ।
jcarballo

15

আমি মনে করি না যে এটি করার জন্য একটি সংক্ষিপ্ত, বুদ্ধিমান উপায় আছে, তবে ভারবস, বুদ্ধিমান উপায় (যেমন ফু বাহের মতো) এবং সংক্ষিপ্ত, প্যাথলজিকাল উপায় রয়েছে যেমন

ifneq (,$(findstring $(GCC_MINOR),4-5))
    CFLAGS += -fno-strict-overflow
endif

(যা প্রদত্ত কমান্ডটি কার্যকর করবে যে স্ট্রিং G (GCC_MINOR) 4-5 স্ট্রিংয়ের ভিতরে উপস্থিত হয়)।


4
ভাল বা খারাপ (সম্ভবত আরও খারাপ) জন্য, আমি যে ধরণের নোংরা হ্যাক খুঁজছিলাম; ধন্যবাদ
প্যাট

4
আমি মনে করি না এই সব সময়ে আবেগপূর্ণ যে, আসলে ছাড়া অন্য হয় না সবকিছু একটি Makefile মধ্যে আবেগপূর্ণ হয়। এটি সত্যিই বেশ মার্জিত। এটি সম্পাদন করার জন্য আমি চার বা পাঁচটি বিভিন্ন উপায় পড়েছি এবং এটি আপনার পক্ষে বোঝার পক্ষে সবচেয়ে সহজ।
মাইকেল গ্যারি

8

এখানে আরও নমনীয় বৈকল্পিক: এটি বাহ্যিক শেল ব্যবহার করে, তবে স্বেচ্ছাসেবী শর্তগুলির জন্য পরীক্ষা করতে দেয়:

ifeq ($(shell test ".$(GCC_MINOR)" = .4  -o  \
                   ".$(GCC_MINOR)" = .5  -o  \
                   ".$(TODAY)"     = .Friday  &&  printf "true"), true)
    CFLAGS += -fno-strict-overflow
endif

1
ifeq ($(GCC_MINOR), 4)
    CFLAGS += -fno-strict-overflow
endif
ifeq ($(GCC_MINOR), 5)
    CFLAGS += -fno-strict-overflow
endif

আপনি এই ক্ষেত্রে ব্যবহার করে বিবেচনা করতে পারেন অন্যটি হ'ল:

GCC42_OR_LATER = $(shell $(CXX) -v 2>&1 | $(EGREP) -c "^gcc version (4.[2-9]|[5-9])")

# -Wstrict-overflow: http://www.airs.com/blog/archives/120
ifeq ($(GCC42_OR_LATER),1)
  CFLAGS += -Wstrict-overflow
endif

আমি আসলে আমার কোডটিতে একই ব্যবহার করি কারণ আমি আলাদা configবা রক্ষণ করতে চাই না Configure

তবে আপনাকে পোর্টিক্স নয়, makeজিএনইউ মেক ( gmake) এর মতো পোর্টেবল, অ-অ্যানিমিক ব্যবহার করতে হবে make

এবং এটি যৌক্তিক ANDএবং এর সমস্যার সমাধান করে না OR

আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.