"রান" করতে আর্গুমেন্ট পাস


354

আমি মেকফিল ব্যবহার করি।

আমার একটি টার্গেট রয়েছে runযা বিল্ড টার্গেটটি চালায়। সরলীকৃত, এটি নীচের মত দেখাচ্ছে:

prog: ....
  ...

run: prog
  ./prog

যুক্তি দেওয়ার কোনও উপায় আছে কি? যাতে

make run asdf --> ./prog asdf
make run the dog kicked the cat --> ./prog the dog kicked the cat

ধন্যবাদ!


উত্তর:


264

আপনি যা চান ঠিক তা করার কোনও উপায় আমি জানি না, তবে কার্যনির্বাহী হতে পারে:

run: ./prog
    ./prog $(ARGS)

তারপর:

make ARGS="asdf" run
# or
make run ARGS="asdf"

27
@ রব: $ () আরও পোর্টেবল, এটি নেমকে পাশাপাশি তৈরিতেও কাজ করে।
জন নোয়েলার

7
@ রব: ম্যাম্রো প্রসারণের জন্য নিমাকে কখনও $ {supported সমর্থন করেনি এবং এটি এখন একটি প্রত্নতাত্ত্বিক রূপ বলে মনে হচ্ছে। looked () আমি দেখেছি প্রতিটি অনলাইন টিউটোরিয়াল দ্বারা প্রস্তাবিত। $ () অন্যান্য সরঞ্জাম যেমন বাশের সাথে আরও সুসংগত।
জন নোয়েলার

10
এটি প্রত্নতাত্ত্বিক হতে পারে। আমি সর্বদা $ {} ব্যবহার করেছি, তবে জিএনইউর জন্য ম্যানুয়ালটি রাজ্যগুলি তৈরি করে "একটি ভেরিয়েবলের মান প্রতিস্থাপনের জন্য, বন্ধনী বা ব্রেসেসে ভেরিয়েবলের নাম অনুসারে একটি ডলার চিহ্ন লিখুন: হয় $(foo)' or $ oo foo} 'একটি বৈধ রেফারেন্স পরিবর্তনশীল `foo '" এবং কেবলমাত্র $ () ব্যবহৃত হয় এমন উদাহরণ দিতে এগিয়ে যায়। আহ ভালো.
জাকব বোর্গ

7
জন এবং শান্ত প্রশংসায়, আমি ফিরে গিয়ে দেখলাম যে পরামর্শটি আমার প্রথম সংস্করণ ওরিলি বই "মেকিং প্রজেক্টস উইথ মেক" এর অনুলিপি থেকে এসেছে। লেখক সংরক্ষণাগার প্রতিস্থাপন সম্পর্কে নিয়মটি () এর এবং ম্যাক্রো উভয়ই করতে সক্ষম বলে ব্যবহার করেছেন তবে পার্থক্য করার জন্য {} এর ব্যবহারের পরামর্শ দিয়েছেন। তবে .... নতুন সংস্করণটি এখন "জিএনইউ মেকের সাহায্যে প্রকল্প পরিচালনা করা" হিসাবে ব্যবহারগুলি () এর সর্বশেষ হিসাবে পুনঃবিখ্যাত হয়েছে। ফিগার যান .... অনুমান করুন আমাকে আধুনিকায়ন করতে হবে! (-: আমি এখনও অবাক হয়েছি যে এমএস এন মেক তার বারফেসে ফেলেছে
রব ওয়েলস

1
@ উদ্বেগ এটি নিশ্চিত - এখানে
হেলভেট

198

এই প্রশ্নটি প্রায় তিন বছরের পুরানো, তবে যাইহোক ...

আপনি যদি জিএনইউ মেক ব্যবহার করছেন তবে এটি করা সহজ। একমাত্র সমস্যা হ'ল makeকমান্ড লাইনে অ-বিকল্প যুক্তিগুলিকে লক্ষ্য হিসাবে ব্যাখ্যা করবে। সমাধানটি হ'ল কিছুই না করে লক্ষ্যগুলিতে পরিণত করা, তাই makeঅভিযোগ করবেন না:

# If the first argument is "run"...
ifeq (run,$(firstword $(MAKECMDGOALS)))
  # use the rest as arguments for "run"
  RUN_ARGS := $(wordlist 2,$(words $(MAKECMDGOALS)),$(MAKECMDGOALS))
  # ...and turn them into do-nothing targets
  $(eval $(RUN_ARGS):;@:)
endif

prog: # ...
    # ...

.PHONY: run
run : prog
    @echo prog $(RUN_ARGS)

এটি চালানো দেয়:

$ make run foo bar baz
prog foo bar baz

2
এটি ড্যাশ দিয়ে শুরু হওয়া যুক্তিগুলির জন্য কাজ করছে বলে মনে হচ্ছে না তা বাদ দিলে:prog foo bar --baz
ingydotnet

22
এটা খুবই যে ক্ষেত্রে কাজ করে, কিন্তু আপনি বলতে হবে makeব্যাখ্যা করা না --bazএকটি কমান্ড লাইন বিকল্প হিসাবে: make -- prog foo bar --baz। এর --অর্থ "এর পরে সমস্ত কিছু একটি যুক্তি, কোনও বিকল্প নয়"।
আইডেলিক

এটি RUN_ARGSব্যবহারের জন্য আমি কীভাবে একটি ডিফল্ট মান নির্ধারণ করব ?
বুকে

সম্ভবত একটি elseশাখা যোগ করুন ifeqএবং RUN_ARGSসেখানে সেট ?
ইডেলিক

1
গুড পয়েন্ট নীলচে! তবে এর জন্য একটি সমাধান রয়েছে: 'alভাল' লাইনটি প্রতিস্থাপন করুন $(eval $(RUN_ARGS):dummy;@:), কোনও ডামি লক্ষ্য নির্ধারিত নয়।
লুকাস সিমন

52

মানসম্পন্ন করার জন্য আপনি এই জাতীয় ম্যাক্রো সংজ্ঞায়িত করে তর্কগুলি পাস করতে পারেন

make run arg1=asdf

তারপরে এগুলি ব্যবহার করুন

run: ./prog $(arg1)
   etc

মাইক্রোসফ্টের এনমেক করার জন্য উল্লেখগুলি


34

আপনি ভেরিয়েবলটি নীচের মতো মেকফাইলে পাস করতে পারেন:

run:
    @echo ./prog $$FOO

ব্যবহার:

$ make run FOO="the dog kicked the cat"
./prog the dog kicked the cat

বা:

$ FOO="the dog kicked the cat" make run
./prog the dog kicked the cat

বিকল্পভাবে বিটা সরবরাহিত সমাধানটি ব্যবহার করুন :

run:
    @echo ./prog $(filter-out $@,$(MAKECMDGOALS))
%:
    @:

%:- কোনও কাজের নামের সাথে মেলে এমন নিয়ম; @:- খালি রেসিপি = কিছুই করবেন না

ব্যবহার:

$ make run the dog kicked the cat
./prog the dog kicked the cat

22

টিএল; ডিআর এটি করার চেষ্টা করবেন না

$ 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

12

এখানে আরও একটি সমাধান যা ব্যবহারের ক্ষেত্রে এটির ক্ষেত্রে সহায়তা করতে পারে:

test-%:
    $(PYTHON) run-tests.py $@

অন্য কথায়, কিছু উপসর্গ বাছুন ( test-এই ক্ষেত্রে) এবং তারপরে সরাসরি প্রোগ্রাম / রানারকে লক্ষ্য নামটি দিন। আমি অনুমান করি যে এটি যদি বেশ কয়েকটি রানার স্ক্রিপ্টের সাথে জড়িত থাকে যা অন্তর্নিহিত প্রোগ্রামের জন্য দরকারী নামের মধ্যে টার্গেটের নামটি মোড়ানো করতে পারে তবে এটি বেশিরভাগ ক্ষেত্রেই কার্যকর।


2
আপনি $*যে লক্ষ্যটি মেলে তার কেবলমাত্র সেই অংশে পাস করতে ব্যবহার করতে পারেন %
মালভাইনাস

9

জিএনইউ মেক করার জন্য ম্যান পৃষ্ঠা থেকে বাক্য গঠনটি দেখছেন

[-f মেকফিল] [বিকল্পগুলি] করুন ... [লক্ষ্যগুলি] ...

আপনি একাধিক লক্ষ্য নির্দিষ্ট করতে পারেন, অতএব 'না' (আপনার নির্দিষ্ট পদ্ধতিতে কমপক্ষে কোনও নয়)।


4

আপনি কমান্ড লাইনে প্রতিটি এন-তর্ক যুক্তি স্পষ্টভাবে নিষ্কাশন করতে পারেন। এটি করার জন্য, আপনি পরিবর্তনশীল MAKECMDGOALS ব্যবহার করতে পারেন, এটি 'মেক' কে প্রদত্ত কমান্ড লাইন আর্গুমেন্টের তালিকা ধারণ করে, যা এটি লক্ষ্যগুলির তালিকা হিসাবে ব্যাখ্যা করে। আপনি যদি এন-থ আর্গুমেন্টটি বের করতে চান, তবে আপনি "শব্দ" ফাংশনের সাথে মিলিয়ে সেই পরিবর্তনশীলটি ব্যবহার করতে পারেন, উদাহরণস্বরূপ, আপনি যদি দ্বিতীয় যুক্তি চান তবে আপনি এটি একটি পরিবর্তনশীলতে নীচে সংরক্ষণ করতে পারেন:

second_argument := $(word 2, $(MAKECMDGOALS) )

এটি সেই যুক্তির জন্য মেক কমান্ডও চালায়। make: *** No rule to make target 'arg'. Stop.
টমাসরেগি

2

আনন , run: ./progকিছুটা অদ্ভুত দেখাচ্ছে, যেমন ডান অংশটি একটি লক্ষ্য হওয়া উচিতrun: prog আরও ভাল দেখাচ্ছে।

আমি সহজভাবে পরামর্শ দিতে হবে:

.PHONY: run

run:
        prog $(arg1)

এবং আমি যুক্ত করতে চাই, যে যুক্তিগুলি পাস করা যেতে পারে:

  1. যুক্তি হিসাবে: make arg1="asdf" run
  2. বা পরিবেশ হিসাবে সংজ্ঞায়িত করা: arg1="asdf" make run

2

এখানে আমার উদাহরণ। নোট করুন যে আমি উইন্ডোজ 7 এর অধীনে লিখছি, মিংডব্লু 32-মেক.এক্সই ব্যবহার করে যা দেব-সিপ্পি সঙ্গে আসে। (আমার সি আছে: \ উইন্ডোজ \ সিস্টেম 32 \ মেক.বাট, সুতরাং কমান্ডটি এখনও "মেক" নামে পরিচিত))

clean:
    $(RM) $(OBJ) $(BIN) 
    @echo off
    if "${backup}" NEQ "" ( mkdir ${backup} 2> nul && copy * ${backup} )

নিয়মিত পরিষ্কারের জন্য ব্যবহার:

make clean

Mydir / এ ব্যাকআপ পরিষ্কার করার জন্য এবং ব্যবহারের জন্য ব্যবহার:

make clean backup=mydir

2

এটি নিয়ে খুব বেশি গর্বিত নয়, তবে আমি পরিবেশের ভেরিয়েবলগুলিতে পাস করতে চাইনি তাই আমি একটি ক্যানড কমান্ড চালনার উপায়টি উল্টে দিলাম:

run:
    @echo command-you-want

এটি আপনাকে চালিত করতে চান সেই কমান্ডটি মুদ্রণ করবে, সুতরাং এটি কেবল একটি সাব-শেইলে মূল্যায়ন করুন:

$(make run) args to my command

4
এই উত্তরটির পিছনে দু'বছর পরে ফিরে তাকানো - কেন আমি এতটা অনড় ছিল যে আমি পরিবেশের পরিবর্তনশীলগুলি ব্যবহার করতে চাই না এবং কেন আমি অন্য কমান্ডের প্রজন্মকে অন্তর্ভুক্ত করা ভাল বলে মনে করি?
কনরাড.ডায়ান

0

আমি একটি সমান চিহ্ন (=) দিয়ে যুক্তিগুলি পাওয়ার একটি উপায় পেয়েছি! উত্তরটি বিশেষত @lesmana এর উত্তরের একটি সংযোজন (এটি এখানে সর্বাধিক সম্পূর্ণ এবং ব্যাখ্যা করা হয়েছে), তবে এটি মন্তব্য হিসাবে লেখা খুব বড় হবে না। আবারও, আমি তাঁর বার্তার পুনরাবৃত্তি করেছি: টিএল; ডিআর এটি করার চেষ্টা করবেন না!

আমার যুক্তিটির চিকিত্সা করার জন্য আমার একটি উপায়ের প্রয়োজন ছিল --xyz-enabled=false(যেহেতু ডিফল্টটি সত্য), যা আমরা সকলেই জানি যে এটি কোনও লক্ষ্য লক্ষ্য নয় এবং এভাবে অংশ নয় $(MAKECMDGOALS)

মধ্যে খুঁজছেন যদিও করতে সব ভেরিয়েবল অনুনাদী দ্বারা $(.VARIABLES)আমি এই আকর্ষণীয় আউটপুট করেছেন:

[...] -*-command-variables-*- --xyz-enabled [...]

এটি আমাদের দুটি উপায়ে যেতে দেয়: হয় একটি দিয়ে সমস্ত শুরু করা --(যদি এটি আপনার ক্ষেত্রে প্রযোজ্য), বা জিএনইউতে সুনির্দিষ্ট (সম্ভবত আমাদের ব্যবহারের উদ্দেশ্যে নয়) পরিবর্তনশীল -*-command-variables-*-। ** অতিরিক্ত বিকল্পের জন্য পাদলেখ দেখুন ** আমার ক্ষেত্রে এই পরিবর্তনশীলটি অনুষ্ঠিত:

--xyz-enabled=false

এই ভেরিয়েবলের সাথে আমরা এটি ইতিমধ্যে বিদ্যমান সমাধানের সাথে একত্রিত করতে পারি $(MAKECMDGOALS)এবং এভাবে সংজ্ঞা দিয়ে:

# the other technique to invalidate other targets is still required, see linked post
run:
    @echo ./prog $(-*-command-variables-*-) $(filter-out $@,$(MAKECMDGOALS))`

এবং এটি দিয়ে (সুস্পষ্টভাবে যুক্তির ক্রম মেশানো):

make run -- config --xyz-enabled=false over=9000 --foo=bar show  isit=alwaysreversed? --help

ফিরে

./prog isit=alwaysreversed? --foo=bar over=9000 --xyz-enabled=false config show --help

আপনি দেখতে পাচ্ছেন, আমরা আরগের মোট ক্রমটি looseিলে .ালা করেছি। "অ্যাসাইনমেন্ট" -আরগগুলির অংশটি বিপরীত হয়েছে বলে মনে হচ্ছে, "টার্গেট" -অর্গগুলির ক্রম রাখা হয়েছে। আমি শুরুতে "অ্যাসাইনমেন্ট" -আরগস রেখেছি, আশা করি আপনার প্রোগ্রামটি কোথায় আর্গুমেন্টটি স্থাপন করেছে সেদিকে খেয়াল রাখেনি।


আপডেট: নিম্নলিখিত পরিবর্তনগুলি পাশাপাশি প্রতিশ্রুতিবদ্ধ দেখায়:

MAKEFLAGS =  -- isit=alwaysreverse? --foo=bar over=9000 --xyz-enabled=false
MAKEOVERRIDES = isit=alwaysreverse? --foo=bar over=9000 --xyz-enabled=false

-2

আমি অন্য কৌশলটি ব্যবহার করি তা হ'ল -nপতাকা, যা makeশুকনো রান করতে বলে । উদাহরণ স্বরূপ,

$ make install -n 
# Outputs the string: helm install stable/airflow --name airflow -f values.yaml
$ eval $(make install -n) --dry-run --debug
# Runs: helm install stable/airflow --name airflow -f values.yaml --dry-run --debug
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.