কমান্ড লাইন থেকে মেকফাইলে কীভাবে যুক্তিটি পাস করবেন?


109

কমান্ড লাইন থেকে মেকফাইলে কীভাবে যুক্তিটি পাস করবেন?

আমি বুঝতে পারি আমি করতে পারি

$ make action VAR="value"
$ value

সঙ্গে Makefile

VAR = "default"
action:
    @echo $(VAR)

আমি কীভাবে নীচের আচরণ করব?

$ make action value
value

?

কেমন

$make action value1 value2
value1 value2


উত্তর:


212

আপনার সম্ভবত এটি করা উচিত নয়; আপনি কীভাবে মেক কাজ করেন তার প্রাথমিক প্যাটার্নটি ভঙ্গ করছেন। তবে এটি এখানে:

action:
        @echo action $(filter-out $@,$(MAKECMDGOALS))

%:      # thanks to chakrit
    @:    # thanks to William Pursell

সম্পাদনা:
প্রথম আদেশটি ব্যাখ্যা করতে,

$(MAKECMDGOALS) কমান্ড লাইনে বানানো "লক্ষ্যগুলি" এর তালিকাটি হল, যেমন "ক্রিয়া মান 1 মান 2"।

$@এই ক্ষেত্রে "ক্রিয়া" এর ক্ষেত্রে নিয়মের টার্গেটের নামের জন্য একটি স্বয়ংক্রিয় পরিবর্তনশীল

filter-outএকটি ফাংশন যা তালিকা থেকে কিছু উপাদান সরিয়ে দেয়। সুতরাং $(filter-out bar, foo bar baz)রিটার্ন foo baz(এটি আরও সূক্ষ্ম হতে পারে, তবে আমাদের এখানে সূক্ষ্মতার প্রয়োজন নেই)।

এগুলি একসাথে রাখুন এবং $(filter-out $@,$(MAKECMDGOALS))"অ্যাকশন" ব্যতীত কমান্ড লাইনে নির্দিষ্ট করা লক্ষ্যগুলির তালিকা প্রদান করে, যা "মান 1 মান 2" হতে পারে।


1
$(shell echo $(MAKECMDGOALS) | sed 's!^.* $@ !!')আগে সমস্ত লক্ষ্যবস্তু বাদ দিতে এবং নিম্নলিখিতগুলি কেবল আর্গুমেন্ট হিসাবে বিবেচনা করুন:make target1 target2 action value1 value2
এভেজেনি জেনারালভ

1
আমার অজ্ঞতা ক্ষমা করুন। আমি গুগল করার চেষ্টা করেছি %:এবং @:সেই "নির্দেশাবলী" (বা তাদের বলা যাই হোক না কেন) কী করে তার তথ্য খুঁজে পাই না। আপনি দয়া করে ব্যাখ্যা করতে পারেন?
জন

15
@ জন: ম্যানুয়ালটি এখানে রয়েছে । অংশটি গঠিত %:এবং @:এটি একটি নিয়ম । লক্ষ্য নামের %অর্থ এটি কোনও নিয়মের সাথে মেলে যা কোনও কিছুর সাথে মেলে ; এটি হ'ল, মেক আপনি যে জিনিসটিকে এটি নির্মাণ করতে বলছেন সেটি তৈরির জন্য যদি অন্য কোনও উপায় না খুঁজে পায় তবে এটি সেই নিয়মটি কার্যকর করবে। @:একটি হল রেসিপি ; :মানে কিছুই করতে এবং @মানে চুপটি না।
বিটা

ধন্যবাদ। আমি সেই ম্যানুয়ালটি পড়ছিলাম এবং আমি প্রথমে বিবেচনা করি নি, এটি %:আসলে % :একটি ওয়াইল্ডকার্ড ধরণের লক্ষ্য নাম। @:যদিও এই ম্যানুয়াল পৃষ্ঠায় আমি কিছুই দেখতে পাচ্ছি না ... এটি সুপারিশ করে যে একটি "করণীয়" নিয়মে ;লক্ষ্য নির্দিষ্টকরণের পরে কেবল একটি ব্যবস্থা থাকবে , সুতরাং, % : ;"ওয়াইল্ডকার্ড ডু" হিসাবে লিখলে এটি আরও সঠিক হবে না -না কিছুই "নিয়ম?
জন

1
filter-outকমান্ড লাইনে নির্দিষ্ট করা লক্ষ্যটির নির্ভরতা হলে ক্রিয়াটি কাজ করে না, কারণ $@নির্ভরতার নামে সেট করা হবে , কমান্ড লাইনে ডাকা মূল যুক্তি নয়। পরিবর্তে, আমি MAKECMDGOALSএকটি শেল অ্যারের বরাদ্দ করি এবং তারপরে প্রথম উপাদানটি সরিয়ে @ args=($(MAKECMDGOALS)); args=("$${args[@]:1}")
ফেলি

18

এখানে @ বিটা এর ভিত্তিতে একটি জেনেরিক ওয়ার্কিং সলিউশন রয়েছে

আমি SHELL=/bin/bashআমার মেকফিলের শীর্ষে জিএনইউ মেক 4.1 ব্যবহার করছি , তাই ওয়াইএমএমভি!

এটি আমাদের অতিরিক্ত যুক্তি গ্রহণ করার অনুমতি দেয় (ত্রুটি ছোঁড়ার পরিবর্তে যখন এমন কোনও চাকরি মেলে না যা কিছু মিলবে না তখনই কিছু না করে)।

%:
    @:

এবং এটি এমন ম্যাক্রো যা আমাদের জন্য আর্গুমেন্টগুলি পায়:

args = `arg="$(filter-out $@,$(MAKECMDGOALS))" && echo $${arg:-${1}}`

এখানে এমন একটি কাজ রয়েছে যা এটির জন্য কল করতে পারে:

test:
    @echo $(call args,defaultstring)

ফলাফলটি হবে:

$ make test
defaultstring
$ make test hi
hi

বিঃদ্রঃ! আপনি "টাস্কফিল" ব্যবহার করা আরও ভাল হতে পারেন, যা কেবল মেকটোলের স্নিগ্ধতা ছাড়াই তৈরি করার জন্য একইভাবে কাজ করে এমন একটি বাশ প্যাটার্ন। Https://github.com/adriancooney/Taskfile দেখুন


এটা কাজ করেছে!! অন্যান্য লোকেরা এটি চেষ্টা করে দেখে নিশ্চিত হন যে সেখানে tabআগে রয়েছে @echo, নেই space
আবদুল্লাহ আল মারুফ - তুহিন

11

অনেক সহজ এপ্রোচ। একটি কাজ বিবেচনা করুন:

provision:
        ansible-playbook -vvvv \
        -i .vagrant/provisioners/ansible/inventory/vagrant_ansible_inventory \
        --private-key=.vagrant/machines/default/virtualbox/private_key \
        --start-at-task="$(AT)" \
        -u vagrant playbook.yml

এখন যখন আমি এটি বলতে চাই তখন আমি ঠিক এর মতো কিছু চালাই:

AT="build assets" make provision

বা শুধু:

make provisionএই ক্ষেত্রে ATএকটি খালি স্ট্রিং


-2

এটি করার চেষ্টা করবেন না

$ make action value1 value2

পরিবর্তে স্ক্রিপ্ট তৈরি করুন:

#! /bin/sh
# rebuild if necessary
make
# do action with arguments
action "$@"

এবং এটি করুন:

$ ./buildthenaction.sh value1 value2

আরও কীভাবে তা ব্যাখ্যা করার জন্য এবং মেকফাইল হ্যাকারিগুলির সতর্কতাগুলি অন্য একটির সাথে আমার উত্তরটি খুব একই রকমের বলে মনে হয় তবে আপাতদৃষ্টিতে সদৃশ প্রশ্নের সদৃশ নয়: "চালিয়ে যাও"

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