Makefile অন্য লক্ষ্য কার্যকর


123

আমার কাছে একটি মেকফাইল কাঠামোগত কিছু রয়েছে:

all : 
    compile executable

clean :
    rm -f *.o $(EXEC)

আমি বুঝতে পেরেছি যে আমি "মেক অল" চালানোর আগে আমার টার্মিনালে ধারাবাহিকভাবে "মেক ক্লিন" চালাচ্ছি এবং তার পরে "ক্লিয়ার" করব। আমি চেষ্টা করার আগে বাজে সি ++ সংকলন ত্রুটিগুলি পরীক্ষা করার আগে একটি পরিষ্কার টার্মিনাল রাখতে চাই। সুতরাং আমি তৃতীয় লক্ষ্য যুক্ত করার চেষ্টা করেছি:

fresh :
    rm -f *.o $(EXEC)
    clear
    make all

এটি কাজ করে, তবে এটি মেক করার দ্বিতীয় ঘটনাটি চালায় (আমি বিশ্বাস করি)। মেকের 2 য় দৃষ্টান্ত না চালিয়ে একই কার্যকারিতাটি পাওয়ার কি কোনও সঠিক উপায় আছে?

উত্তর:


172

আসলে আপনি ঠিক বলেছেন: এটি মেকের আরেকটি উদাহরণ চালায়। একটি সম্ভাব্য সমাধান হ'ল:

.PHONY : clearscr fresh clean all

all :
    compile executable

clean :
    rm -f *.o $(EXEC)

fresh : clean clearscr all

clearscr:
    clear

কল করে make freshআপনি প্রথমে cleanটার্গেটটি পাবেন, তারপরে clearscreenকোনটি চলে clearএবং শেষ পর্যন্ত allকোনটি কাজ করে।

4 আগস্ট সম্পাদনা করুন

মেকের -jবিকল্পের সাথে সমান্তরাল বিল্ডসের ক্ষেত্রে কী ঘটে ? অর্ডার ঠিক করার একটি উপায় আছে। মেকুয়াল ম্যানুয়াল থেকে বিভাগ ৪.২:

মাঝেমধ্যে, আপনার একটি পরিস্থিতি রয়েছে যেখানে আপনি যদি নিয়মগুলির মধ্যে কোনও একটি কার্যকর করা হয় তবে লক্ষ্য আপডেট করার জন্য জোর না করে নিয়মাবলীর উপর একটি নির্দিষ্ট ক্রম চাপিয়ে দিতে চান। সেক্ষেত্রে আপনি কেবল অর্ডার-পূর্ব শর্তাদি সংজ্ঞায়িত করতে চান। পূর্বশর্ত তালিকায় পাইপ প্রতীক (|) রেখে কেবল অর্ডার-পূর্ব শর্তাদি নির্দিষ্ট করা যেতে পারে: পাইপের প্রতীকের বামে যে কোনও পূর্বশর্ত স্বাভাবিক; ডানদিকে যে কোনও পূর্বশর্ত হ'ল কেবলমাত্র অর্ডার: লক্ষ্যগুলি: সাধারণ পূর্বশর্ত | অর্ডার কেবল--পূর্বশর্ত

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

তাই মেকফিল হয়ে যায়

.PHONY : clearscr fresh clean all

all :
    compile executable

clean :
    rm -f *.o $(EXEC)

fresh : | clean clearscr all

clearscr:
    clear

সম্পাদনা 5 ডিসেম্বর

একাধিক মেকফিল ইনস্ট্যান্স চালানো বড় বিষয় নয় যেহেতু কার্যের ভিতরে থাকা প্রতিটি কমান্ড যে কোনও উপায়ে শেল হবে । তবে কল ফাংশনটি ব্যবহার করে আপনার পুনরায় ব্যবহারযোগ্য পদ্ধতি থাকতে পারে

log_success = (echo "\x1B[32m>> $1\x1B[39m")
log_error = (>&2 echo "\x1B[31m>> $1\x1B[39m" && exit 1)

install:
  @[ "$(AWS_PROFILE)" ] || $(call log_error, "AWS_PROFILE not set!")
  command1  # this line will be a subshell
  command2  # this line will be another subshell
  @command3  # Use `@` to hide the command line
  $(call log_error, "It works, yey!")

uninstall:
  @[ "$(AWS_PROFILE)" ] || $(call log_error, "AWS_PROFILE not set!")
  ....
  $(call log_error, "Nuked!")

6
@ সাস 4740: মূলত সমস্ত কিছু অনুসরণ করে .PHONY : কিছু কীওয়ার্ড হিসাবে বিবেচনা করা হয় যা সর্বদা কার্যকর হয়, যখন অ-ফোনি লক্ষ্যগুলি ফাইল হতে পারে।
ডাকাভ

"কেবলমাত্র আদেশের পূর্বশর্ত" শর্তসাপেক্ষে? টার্গেট টি 2 এর জন্য আমি প্রথমে টি0 করতে চাই, কেবলমাত্র টি -০ টি টি -২০ চালা হলে, এবং উভয়ই সফল হলে টি -৩ তে কিছু কাজ চালায়
কল্পনা করে

1
@ ফ্যান্টাস্টোরি, না, আমি মনে করি তারা স্বাধীন। t2উপর নির্ভর করবে t0, t1এবং t3। আপনি করা উচিত আপনি এই প্রয়োজন t3যেমন প্রয়োজনীয় t2, t1যেমন প্রয়োজনীয় t3এবং t0যেমন প্রয়োজনীয় t1। এর অর্থ 3 টি আলাদা বিধি। তবে আপনার এটি যাচাই করা উচিত। আমি 100% নিশ্চিত নই।
ডাকাভ

3
"অর্ডার-শুধুমাত্র পূর্বশর্ত" স্বাধীন
fantastory

2
আমি দেখতে পাচ্ছি না যে 'পরিষ্কার' 'সকলের আগে' গ্যারান্টি দেয়? আপনি এগুলি থেকে ঠিক রেখেছেন সত্য তাদের ক্রম কার্যকর করতে না। কেবলমাত্র অর্ডার নির্ভরতা মানে এই জাতীয় ক্রিয়াকলাপের পরে প্রয়োজনীয়ভাবে আপডেট করা হয় না। নির্ভর উপাদানগুলির ক্রম দিয়ে এর কোনও যোগসূত্র নেই ... বা?
CygnusX1

6

যদি আপনি make allআপনার "তাজা" লক্ষ্য থেকে লাইনটি সরিয়ে থাকেন:

fresh :
    rm -f *.o $(EXEC)
    clear

আপনি কেবল কমান্ডটি চালাতে পারতেন make fresh allযা কার্যকর হবে make fresh; make all

কেউ কেউ এটিকে মেকের দ্বিতীয় উদাহরণ হিসাবে বিবেচনা করতে পারে তবে এটি অবশ্যই মেকের একটি উপ-উদাহরণ নয় (কোনও মেকের অভ্যন্তরে একটি মেক), যা আপনার প্রচেষ্টাটির ফলস্বরূপ বলে মনে হয়েছিল।

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