টিএল; ডিআর এটি করার চেষ্টা করবেন না
$ make run arg
পরিবর্তে স্ক্রিপ্ট তৈরি করুন:
#! /bin/sh
# rebuild prog if necessary
make prog
# run prog with some arguments
./prog "$@"
এবং এটি করুন:
$ ./buildandrunprog.sh arg
বর্ণিত প্রশ্নের উত্তর:
আপনি রেসিপি একটি পরিবর্তনশীল ব্যবহার করতে পারেন
run: prog
./prog $(var)
তারপরে আর্গুমেন্ট হিসাবে ভেরিয়েবল অ্যাসাইনমেন্টটি পাস করুন
$ make run var=arg
এটি কার্যকর করা হবে ./prog arg
।
তবে ক্ষতি থেকে সাবধান থাকুন। আমি এই পদ্ধতির অসুবিধাগুলি এবং আরও নীচে অন্যান্য পদ্ধতির বিষয়ে বিস্তারিত জানাব।
প্রশ্নের পিছনে অনুমিত উদ্দেশ্য উত্তর:
অনুমান: আপনি চালাতে চান prog
কিছু যুক্তি দিয়ে তবে প্রয়োজনে চালানোর আগে এটি পুনর্নির্মাণ করুন।
উত্তর: একটি স্ক্রিপ্ট তৈরি করুন যা পুনর্নির্মাণের প্রয়োজন হলে প্রয়োজন হয় আরগস সহ প্রগতি চালায়
#! /bin/sh
# rebuild prog if necessary
make prog
# run prog with some arguments
./prog "$@"
এই স্ক্রিপ্ট উদ্দেশ্য খুব স্পষ্ট করে তোলে। বিল্ডিং: এটি মেকটি এটির জন্য ভাল যা করতে পারে তা ব্যবহার করে। এটি শেল স্ক্রিপ্টটি এটির জন্য ভাল যা করতে তা ব্যবহার করে: ব্যাচ প্রসেসিং।
প্লাস আপনি কোনও মেকফিলের সমস্ত সতর্কতা ছাড়াই শেল স্ক্রিপ্টের সম্পূর্ণ নমনীয়তা এবং অভিব্যক্তি সহ আপনার যা যা প্রয়োজন প্রয়োজন তা করতে পারেন।
এছাড়াও কলিং সিনট্যাক্স এখন কার্যত অভিন্ন:
$ ./buildandrunprog.sh foo "bar baz"
তুলনা করা:
$ ./prog foo "bar baz"
বিপরীতে
$ make run var="foo bar\ baz"
পটভূমি:
মেক কোনও লক্ষ্যকে তর্ক করার জন্য ডিজাইন করা হয়নি। কমান্ড লাইনের সমস্ত আর্গুমেন্টকে লক্ষ্য (ওরফে টার্গেট), বিকল্প হিসাবে বা ভেরিয়েবল অ্যাসাইনমেন্ট হিসাবে ব্যাখ্যা করা হয়।
সুতরাং আপনি যদি এটি চালান:
$ make run foo --wat var=arg
করতে কী ব্যাখ্যা দেবেন run
এবং foo
তাদের রেসিপি অনুযায়ী গোলস (লক্ষ্যমাত্রা) আপডেটে হিসাবে। --wat
মেক করার জন্য একটি বিকল্প হিসাবে। এবংvar=arg
একটি ভেরিয়েবল অ্যাসাইনমেন্ট হিসাবে।
আরও তথ্যের জন্য দেখুন: https://www.gnu.org/software/make/manual/html_node/Goals.html#Goals
পরিভাষার জন্য দেখুন: https://www.gnu.org/software/make/manual/html_node/Rule-Irrifications.html#Rule- ভূমিকা
ভেরিয়েবল অ্যাসাইনমেন্ট পদ্ধতি এবং কেন আমি এর বিপরীতে সুপারিশ করি about
$ make run var=arg
এবং রেসিপি মধ্যে পরিবর্তনশীল
run: prog
./prog $(var)
এটি কোনও রেসিপিতে যুক্তিগুলি সর্বাধিক "সঠিক" এবং সহজ উপায়। কিন্তু এটা যখন করতে আর্গুমেন্ট সহ একটি প্রোগ্রাম চালানোর জন্য ব্যবহার করা যেতে এটা অবশ্যই যে ভাবে ব্যবহার করা ডিজাইন করা হয় না। দেখতে https://www.gnu.org/software/make/manual/html_node/Overriding.html#Overriding
আমার মতে এটির একটি বড় অসুবিধা রয়েছে: আপনি যা করতে চান তা prog
যুক্তি দিয়ে চালানো arg
। লেখার পরিবর্তে:
$ ./prog arg
তুমি লিখছ:
$ make run var=arg
স্থানগুলি সহ একাধিক যুক্তি বা যুক্তিগুলি পাস করার চেষ্টা করার সময় এটি আরও বিশ্রী হয়ে ওঠে:
$ make run var="foo bar\ baz"
./prog foo bar\ baz
argcount: 2
arg: foo
arg: bar baz
তুলনা করা:
$ ./prog foo "bar baz"
argcount: 2
arg: foo
arg: bar baz
রেকর্ডটির জন্য এটি আমার prog
চেহারাগুলির মতো:
#! /bin/sh
echo "argcount: $#"
for arg in "$@"; do
echo "arg: $arg"
done
এছাড়াও মনে রাখবেন যে আপনাকে $(var)
মেকফাইলে উদ্ধৃতিগুলি দেওয়া উচিত নয় :
run: prog
./prog "$(var)"
কারণ তখন prog
সর্বদা কেবল একটি যুক্তি পাবেন:
$ make run var="foo bar\ baz"
./prog "foo bar\ baz"
argcount: 1
arg: foo bar\ baz
এই কারণেই আমি এই রুটের বিরুদ্ধে সুপারিশ করছি।
সম্পূর্ণতার জন্য এখানে "রান করার পক্ষে যুক্তিগুলি পাস করার" জন্য আরও কয়েকটি পদ্ধতি রয়েছে।
পদ্ধতি 1:
run: prog
./prog $(filter-out $@, $(MAKECMDGOALS))
%:
@true
সুপার সংক্ষিপ্ত বিবরণ: লক্ষ্য তালিকা থেকে বর্তমান লক্ষ্য ফিল্টার আউট। সমস্ত লক্ষ্য ধরা ( %
) তৈরি করুন যা চুপচাপ অন্যান্য লক্ষ্যগুলি উপেক্ষা করতে কিছুই করে না।
পদ্ধতি 2:
ifeq (run, $(firstword $(MAKECMDGOALS)))
runargs := $(wordlist 2, $(words $(MAKECMDGOALS)), $(MAKECMDGOALS))
$(eval $(runargs):;@true)
endif
run:
./prog $(runargs)
সুপার সংক্ষিপ্ত বিবরণ: যদি লক্ষ্যটি হয় run
তবে প্রথম লক্ষ্যটি সরিয়ে ফেলুন এবং ব্যবহার করে অবশিষ্ট লক্ষ্যের জন্য কোনও লক্ষ্য তৈরি করবেন না eval
।
উভয়ই আপনাকে এরকম কিছু লিখতে দেয়
$ make run arg1 arg2
গভীর ব্যাখ্যার জন্য ম্যানুয়ালটির অধ্যয়ন করুন: https://www.gnu.org/software/make/manual/html_node/index.html
পদ্ধতি 1:
ড্যাশ দিয়ে শুরু হওয়া যুক্তিগুলি মেক দ্বারা ব্যাখ্যা করা হবে এবং লক্ষ্য হিসাবে পাস করা হবে না।
$ make run --foo --bar
কার্যসংক্রান্ত
$ make run -- --foo --bar
সমান চিহ্ন সহ যুক্তিগুলি মেক দ্বারা ব্যাখ্যা করা হবে এবং পাস করা হয়নি
$ make run foo=bar
কোন কর্মসূচী
স্থানগুলির সাথে যুক্তিগুলি বিশ্রী
$ make run foo "bar\ baz"
কোন কর্মসূচী
যদি কোনও আর্গুমেন্ট run
(টার্গেটের সমান) হয় তবে এটিও সরানো হবে
$ make run foo bar run
./prog foo bar
পরিবর্তে চালানো হবে./prog foo bar run
পদ্ধতি 2 দিয়ে কার্যকরী সম্ভব
যদি কোনও যুক্তি বৈধ লক্ষ্য হয় তবে তা চালানো হবে।
$ make run foo bar clean
চলবে ./prog foo bar clean
তবে লক্ষ্যটির clean
রেসিপিও (ধরে নিলে এটি বিদ্যমান)
পদ্ধতি 2 দিয়ে কার্যকরী সম্ভব
আপনি যখন কোনও বৈধ লক্ষ্যকে ভুল টাইপ করেন তখন সমস্ত লক্ষ্য ধরা পড়ার কারণে এটি চুপচাপ উপেক্ষা করা হবে।
$ make celan
চুপচাপ উপেক্ষা করা হবে celan
।
workaround হ'ল সবকিছু ভার্বোজ করা। সুতরাং আপনি কি দেখতে পাবেন। তবে এটি বৈধ আউটপুটটির জন্য প্রচুর শব্দ তৈরি করে।
পদ্ধতি 2:
যদি কোনও যুক্তি একটি বিদ্যমান লক্ষ্য হিসাবে একই নামে থাকে তবে মেকটি একটি সতর্কতা মুদ্রণ করবে যে এটি ওভাররাইট করা হচ্ছে।
আমি জানি না এমন কোন কর্মসূচী
সমান চিহ্ন সহ যুক্তিগুলি এখনও মেক দ্বারা ব্যাখ্যা করা হবে এবং পাস করা হয়নি
কোন কর্মসূচী
স্থানগুলির সাথে যুক্তিগুলি এখনও বিশ্রী
কোন কর্মসূচী
স্থান বিরতি দিয়ে যুক্তিগুলি eval
লক্ষ্য করার চেষ্টা করে না।
কার্যকারণ: উপরের মতো কিছুই না করে সমস্ত লক্ষ্য তৈরি করে বিশ্বব্যাপী ধরুন। উপরের সমস্যা হিসাবে এটি আবার চুপি চুপি ভুল টাইপ করা বৈধ লক্ষ্যগুলি উপেক্ষা করবে।
এটি eval
রানটাইমের সময় মেকফিলটি পরিবর্তন করতে ব্যবহার করে। আপনি পাঠযোগ্যতা এবং ডিবাগিবিলিটি এবং সর্বনিম্ন বিস্ময়ের নীতিতে কত খারাপ হতে পারেন ।
কার্যক্ষম: এটি করবেন না! 1 পরিবর্তে একটি শেল স্ক্রিপ্ট লিখুন যা মেক করে এবং তারপরে চলে prog
।
আমি শুধুমাত্র gnu মেক ব্যবহার করে পরীক্ষা করেছি। অন্যান্য করা বিভিন্ন আচরণ থাকতে পারে।
টিএল; ডিআর এটি করার চেষ্টা করবেন না
$ make run arg
পরিবর্তে স্ক্রিপ্ট তৈরি করুন:
#! /bin/sh
# rebuild prog if necessary
make prog
# run prog with some arguments
./prog "$@"
এবং এটি করুন:
$ ./buildandrunprog.sh arg