জিএনইউতে লক্ষ্যগুলি / লক্ষ্যগুলি তালিকাভুক্ত করুন যা তাদের সংজ্ঞায় ভেরিয়েবল ধারণ করে


100

আমার কাছে মোটামুটি বড় একটি মেকফিল রয়েছে যা ভেরিয়েবলের কাছ থেকে নামগুলি গণনা করে ফ্লাইটিতে প্রচুর টার্গেট তৈরি করে। (যেমন foo $ (VAR): $ (PREREQS))। এই ভেরিয়েবলগুলি প্রসারিত করার পরে গনু যে কোনও উপায়ে লক্ষ্যগুলির একটি তালিকা ছুঁড়ে দেওয়ার বিষয়ে বিশ্বাসী হতে পারে?

আমি একটি এরিবিট্রি মেকফিলের জন্য লক্ষ্যগুলি অর্জন করতে সক্ষম হতে চাই। আমি আমার শেলের জন্য একটি সমাপ্তি ফাংশন লেখার চেষ্টা করছি।

উত্তর:


79

আপনি কি make -pn(যেমন make --print-data-base --dry-run) থেকে আউটপুট পার্স করতে পারবেন ? এটি সমস্ত ভেরিয়েবল, বিধি, অন্তর্নিহিত বিধিগুলি প্রিন্ট করে এবং কোন আদেশগুলি কঠোর বিবরণে চালিত হবে।


এই উত্তরটি অন্যটির চেয়ে বেশ সুন্দর দেখাচ্ছে।
ম্যাট জয়েনার

আমি সম্মত হই যে এটি অনেক সুন্দর। আমার প্রত্যাশার চেয়ে আরও বেশি কাজ, তবে আমি এটিকে উত্তর হিসাবে চিহ্নিত করব কারণ অন্য কোনও কিছুই যুক্তিসঙ্গত বলে মনে হচ্ছে না এবং জিএনইউতে আমার যা চাইবে তার জন্য সুবিধাজনক পতাকা নেই।
বিটশিফটার

6
সচেতন হন যে আউটপুটটি আপনার নির্দিষ্ট করা টার্গেটের উপর নির্ভর করতে পারে, যদি আপনার মেকফিল গতিশীলভাবে লক্ষ্যগুলি উত্পন্ন করে। আউটপুটটি পরিবেশের ভেরিয়েবলের মানগুলির উপর নির্ভর করে বা মেক কমান্ডের সাথে নির্দিষ্ট ভেরিয়েবলগুলি তৈরি করতে পারে।
পুনরায় পোস্টার

6
আমি ব্রুভিটি পছন্দ করি। +1 আমার নিজের স্পিন যুক্ত করেছে (নীচের উত্তরে বর্ণিত):make -pn | sed -rn '/^[^# \t\.%].*:[^=]?/p'
জেমি

পরামর্শ দিন make -pnr। অন্তর্ভুক্ত -rনিয়ম অপসারণ।
এসজেবিএক্স

114
make -qp | awk -F':' '/^[a-zA-Z0-9][^$#\/\t=]*:([^=]|$)/ {split($1,A,/ /);for(i in A)print A[i]}'     

মেক আরগের সমাপ্তি থেকে নেওয়া, যা কবজির মতো কাজ করে।


4
আমি এটির জন্য একটি উপনাম তৈরি করার চেষ্টা করেছি, এটি ডাবল উদ্ধৃতিতে রেখেছি, তবে এটি কেবল প্রথম কমাতে একটি সিনট্যাক্স ত্রুটিযুক্ত হয়ে উঠেছে ... একটি শেল (বাশ) ওরফে কীভাবে সঠিকভাবে এড়াতে হবে সে সম্পর্কে কোনও চিন্তা?
drfrogsplat

4
আমি মনে করি এটি সংজ্ঞায়িত যেখানে এটির সাথে কিছু করতে হবে। আমি মনে করি এটি যদি একটি উপাধিকার হিসাবে সংজ্ঞায়িত হয় তবে এটির কার্যকরী ডিরেক্টরিটি সেই ডিরেক্টরিতে পরিণত হয় যেখানে এটি সংজ্ঞায়িত হয় এবং স্পষ্টতই খালি অংশটি গোপন ডিরেক্টরিগুলিতে বিন্দু পছন্দ করে না। একটি ফাংশন সংজ্ঞায়িত কাজ করে।
ইব্রাহিম

আমি এটিকে একটি শাম স্ক্রিপ্টে রাখি ~/binবরং একটি উলাম ব্যবহার করার চেয়ে। দুর্দান্ত কাজ করে; ধন্যবাদ!
এমপন্টিলো

4
যে alias mkl="make -qp | awk -F':' '/^[a-zA-Z0-9][^\$#\/\t=]*:([^=]|\$)/ {split(\$1,A,/ /);for(i in A)print A[i]}' | sort"
উপন্যাসটি আপনাকে

4
| sort -uআরও দরকারী বলে মনে হচ্ছে :)
শেরপ্যা

14

আমি নিশ্চিত নই যে এটি কেবল গুণু তৈরির জিনিস, তবে এটি ভালভাবে কাজ করে:

make help


এটি বেশ সহজ, অন্য পদ্ধতির একটির জন্য কাস্টম ওরফে অপেক্ষা মনে রাখা সহজ।
ইব্রাহিম

8
GNU Make 3.81- এ সত্যিই কাজ করছেন না, সম্ভবত আপনার মেকফিলগুলিতে একটি লক্ষ্য: "করুন: ***
লক্ষ্য`

8
এটি কেবল মেকফাইলে "সহায়তা" লক্ষ্যকে আহ্বান করে। যদি এটি বিদ্যমান থাকে তবে এটি কিছু মুদ্রণ করবে ( লক্ষ্যগুলির সম্পূর্ণ তালিকাগুলি নয় ), যদি এটি না থাকে (সাধারণ পরিস্থিতি), তা জামিন দেয়।
pfalcon

4
সুসংবাদটি কমকে মনে হচ্ছে "সহায়তা" টার্গেটটি পড়ার পক্ষে একটি সহজ সহজ উত্সাহিত।
স্টাফেন

এটা সত্যিই দারুন! :) চলুন চড়ক
জিফ

10

বেশ কয়েকটি প্রতিক্রিয়াকারী ব্যবহারের পরামর্শ দিয়েছেন make -pn, যা নিয়মের ডাটাবেস মুদ্রণ করবে তবে কিছু চালানো হবে না - কমবেশি। এই পদ্ধতির সমস্যাটি হ'ল এটি -nএখনও সমস্ত পুনরাবৃত্তিকে তোলে এবং এটি প্রয়োজনের তুলনায় আরও অনেক বেশি কাজ করে, কারণ এটি নিয়মিতভাবে তৈরি হওয়া প্রতিটি আদেশকে মুদ্রণ করে। আরও কার্যকর সমাধান হ'ল এই বিষয়বস্তুগুলির সাথে একটি তুচ্ছ মেকফাইল, ডামি.এমকে তৈরি করা:

__all_targets__: ; #no-op

এখন হিসাবে অনুরোধ make -p -f Makefile -f dummy.mk __all_targets__। যে কোনও উল্লেখযোগ্য বিল্ডে, মেক দ্বারা উত্পাদিত আউটপুট পরিমাণের মধ্যে পার্থক্য উল্লেখযোগ্য। উদাহরণ স্বরূপ:

$ gmake -pn | wc
 138985 2632330 69612711
$ gmake -f Makefile -f /tmp/dummy.mk -pn __all_targets__ | wc
  21673   93437  878985

কার্যকর করার সময়টি নাটকীয়ভাবে আরও ভাল হয়েছিল - প্রথম সংস্করণের জন্য 2.063, দ্বিতীয়টির জন্য 0.059s 59


4
ঝরঝরে ধারণা, বিশাল বিল্ড সিস্টেমের সাথে কাজ করা প্রত্যেকে এটির প্রশংসা করবে। অ্যান্ড্রয়েড জিনজারব্রেড গাছের পরিসংখ্যান (পুনরাবৃত্ত মেক ব্যবহার করে না, তাই সঞ্চয়গুলি বিশাল নয়, ভাল): " time make -pn | wc -l": 1338738 real 0m47.754s." time make -f Makefile -f dummy.mk -pn __all_targets__ | wc -l": 938621 real 0m40.219s
pfalcon

ভাল যুক্তি. ম্যান makemake -p -f/dev/null
পেজটিতে

@ ডেভিড যা পুরোপুরি কার্যকর হবে না: নির্দিষ্ট করা নিয়মিত মেকফিলগুলি পার্স করা থেকে -f /dev/nullবিরত রাখবে make, সুতরাং আপনি কেবল বিল্ট-ইন বিধিগুলির একটি প্রিন্টআউট পাবেন। সে কারণেই আমার সমাধানটি নির্দিষ্ট করে -f Makefile -f dummy.mk। তবে এটি যথেষ্ট নয়, কারণ এর সাথে -n, makeএগিয়ে যাবে এবং প্রকৃতপক্ষে মেকফিলের নিয়মগুলি কার্যকর করাও শুরু করবে। দুর্ভাগ্যক্রমে আমি এমন কোনও পরিবর্তন সম্পর্কে সচেতন নই যা মূলত উপস্থাপিত হিসাবে সমাধানটিকে সহজতর করতে পারে।
এরিক মেলস্কি

অবশ্যই আপনি ঠিক। তবে মেক ম্যান পৃষ্ঠাটিতে একটি ত্রুটি রয়েছে, কারণ এতে বলা হয়েছে: "কোনও ফাইলের রিমেক করার চেষ্টা না করে ডেটা বেস মুদ্রণ করতে, মেক-পি-ফ / দেব / নাল ব্যবহার করুন"
ডেভিড

আমার আগের মন্তব্যে সামান্য সংশোধন: এটি "... কারণ ছাড়া -n ..." পড়তে হবে
এরিক মেলস্কি


7

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

#!/bin/bash

SCRIPT='
  /^# Make data base/,/^# Files/d             # skip until files section
  /^# Not a target/,+1          d             # following target isnt
  /^\.PHONY:/                   d             # special target
  /^\.SUFFIXES:/                d             # special target
  /^\.DEFAULT:/                 d             # special target
  /^\.PRECIOUS:/                d             # special target
  /^\.INTERMEDIATE:/            d             # special target
  /^\.SECONDARY:/               d             # special target
  /^\.SECONDEXPANSION/          d             # special target
  /^\.DELETE_ON_ERROR:/         d             # special target
  /^\.IGNORE:/                  d             # special target
  /^\.LOW_RESOLUTION_TIME:/     d             # special target
  /^\.SILENT:/                  d             # special target
  /^\.EXPORT_ALL_VARIABLES:/    d             # special target
  /^\.NOTPARALLEL:/             d             # special target
  /^\.ONESHELL:/                d             # special target
  /^\.POSIX:/                   d             # special target
  /^\.NOEXPORT:/                d             # special target
  /^\.MAKE:/                    d             # special target

# The stuff above here describes lines that are not
#  explicit targets or not targets other than special ones
# The stuff below here decides whether an explicit target
#  should be output.

  /^[^#\t:=%]+:([^=]|$)/ {                    # found target block
    h                                         # hold target
    d                                         # delete line
  }
  /^# File is an intermediate prerequisite/ { # nope
    s/^.*$//;x                                # unhold target
    d                                         # delete line
  }
  /^([^#]|$)/ {                               # end of target block
    s/^.*$//;x                                # unhold target
    s/:.*$//p                                 # write current target
    d                                         # hide any bugs
  }
'

make -npq .DEFAULT 2>/dev/null | sed -n -r "$SCRIPT" \
  | sort | uniq

এটি ডেবিয়ান ব্যাশ সম্পূর্ণ হওয়ার স্ক্রিপ্টের চেয়ে অনেক বেশি সম্পূর্ণ স্ক্রিপ্ট কারণ এটি উত্পন্ন নিয়মের ফলাফল সরবরাহ করে যা প্রশ্নটি জিজ্ঞাসা করে এবং শীর্ষে ভোট দেওয়া উত্তর (ডিবিয়ান গিট সার্ভারে ডেবিয়ান ব্যাশ সমাপ্তি স্ক্রিপ্ট) খুব বেশি যায় না।

এটি মূল লিপিটি নয় যা আমি সংযুক্ত করেছি তবে এটি অনেক সহজ এবং দ্রুত একটি স্পর্শ।


বিটিডাব্লু, মোডস, যদি এই উত্তরটি এর পাঠ্যের সংক্ষিপ্তসারের কারণে সমস্ত নীতিমালার সাথে পুরোপুরি সামঞ্জস্য না করে, মুছে ফেলার আগে মন্তব্য করুন comment আমি কোনও আইনী সামঞ্জস্যতা প্রয়োজনীয় করব যাতে এই প্রশ্নটি একটি সম্পূর্ণ এবং বৈধ উত্তর পায়।
কোডশট

দ্রুত পরীক্ষা হিসাবে আমি জিসিসি উত্স কোডটি ধরেছিলাম এবং দৌড়েছি / / কনফিগার এবং& সময় ~ / makecomp.sh | wc -l যেখানে ~ / makecomp.sh আমার উত্তর। ... আউটপুট কনফিগার করুন ... কনফিগারেশন: মেকফিল 3312 রিয়েল 0 এম0.401 এর ব্যবহারকারী 0 এম0.412
এস সিএস 0

অন্য পরীক্ষা হিসাবে আমি codeshot.blogspot.co.uk/2012/08/… এ ডেমো মেকফিল ব্যবহার করেছি যা ইউনিট-পরীক্ষার পাসগুলি তৈরি এবং চেক করার জন্য সিউডো-বিধি তৈরি করে। এই উদাহরণটি একটি সাধারণ ক্রস-প্ল্যাটফর্ম অটোকনফ প্রকল্পের চেয়ে মেকের আরও বৈশিষ্ট্যগুলি ব্যবহার করে তাই এই উত্তরের স্ক্রিপ্টটিতে 14 টি লক্ষ্যমাত্রা ফেরত আসে যখন উবুন্টুতে তৈরির জন্য ব্যাশ সমাপ্তি কেবল দুটি কার্যকর নিয়ম এবং তারপরে 5 উত্স ফাইল দেয়।
কোডশট

4

টড হডস সমাধানের উপর ভিত্তি করে এটিইর জন্য কোড

alias mtargets='make -qp | awk -F":" "/^[a-zA-Z0-9][^$#\/\t=]*:([^=]|$)/ {split(\$1,A,/ /);for(i in A)print A[i]}"'

3

এটি একটি সুন্দর আউটপুট দেবে:

make -pn | perl -F: -ane 'print "$F[0]\n" if /^\w+\s*:/' | sort


2

অনুমান করুন আমি এই পার্টিতে কিছুটা দেরি করেছি, তবে আপনি যদি একটি নির্দিষ্ট কমান্ড সন্ধান করেন তবে আপনি চেষ্টা করতে পারেন

make -qp | grep -v '^# ' | grep -v '^[[:space:]]' | grep --only-matching '^.*:'

এটি বেশিরভাগ ক্ষেত্রেই কাজ করে, যদিও এটিতে এখনও কোনও vpathনির্দেশকের মতো কিছু অ-টার্গেট স্টাফ অন্তর্ভুক্ত থাকতে পারে । যদি আপনি makeঅন্তর্নির্মিত নিয়মগুলির উপর নির্ভর না করেন তবে আপনি make -qpRপাইপলাইনে প্রথম কমান্ড হিসাবে ব্যবহার করতে পারেন ।


আমি এটি ফ্রিটজ (.org) দিয়ে চেষ্টা করেছি। অনেকগুলি অন্তর্ভুক্ত মেকফাইলগুলি তালিকাভুক্ত করে এবং সমস্ত লক্ষ্যগুলি তালিকাভুক্ত করে না।
রবার্ট সিমার

1

রুবি দ্রবণ:

`make -qp`.split("\n").select{|l| l =~ /^\w/ && l !~ /=/}.map{|l| l.sub(/:.*/,'')}

1

আমি সোলারিস 10 এন্ডা টার্বো সি শেলের উপর কাজ করছি। প্রদত্ত সমাধানটি আমার মেকফিল প্রকল্পের জন্য কাজ করে না। এমনকি tcsh সিনট্যাক্সের উপরের কমান্ড লাইনটি পরিবর্তন করার পরেও। তবে, আমি খুঁজে পেয়েছি আপনি ব্যবহার করে একটি সহজ সমাধান পেতে পারেন

remake --tasks | grep -v "clean some static output or just grep tabs on start of line" | awk ´{print $1}´

রিমেক সংস্করণ:

remake --version

হয়

GNU Make 3.82+dbg0.8
Built for sparc-sun-sparc2-9

এবং কিছু অন্যান্য গুরুত্বহীন সংস্করণ ডেটা


0

আমি একই প্রশ্নটি খুঁজতে গিয়ে এই স্পিনটি নিয়ে এসেছি:

make -pn | sed -rn '/^[^# \t\.%].*:/p'

এটি সমস্ত মন্তব্য লাইন, প্যাটার্নের নিয়ম (ট্যাবগুলি দিয়ে শুরু করা লাইন), সমস্ত অভ্যন্তরীণ (উদাহরণ .c.oএবং %.o: %.cনিদর্শন) সরিয়ে দেয়।


গৃহীত উত্তর থেকে মন্তব্যটি পড়েনি: জ্যাকের উত্তরের জন্য +1 ... gist.github.com/777954 - pvandenberk 13 জানুয়ারী 14:47
জেমি

0

এই সমাধানটি অন্য থ্রেডে পাওয়া গেছে:

sh -c "cat Makefile | egrep \"^[[:alnum:][:punct:]]{0,}:[[:space:]]{0,}[[:alnum:][:punct:][:space:]]{0,}$\""

আপনি এটিকে এটিতে যুক্ত করতে পারেন Makefile:

list:
    sh -c "cat Makefile | egrep \"^[[:alnum:][:punct:]]{0,}:[[:space:]]{0,}[[:alnum:][:punct:][:space:]]{0,}$\\""

এবং মৃত্যুদণ্ড কার্যকর make list


-1

অবশ্যই, তবে আপনি কখন তাদের থুতু ফেলতে চান?

নিয়মটি চালিত হলে লক্ষ্যটির নাম জানাতে, নিয়মে একটি লাইন রাখুন:

foo$(VAR): $(PREREQS)
    @echo now making the foo target: $@
    do_other_stuff...

একবারে তাদের সকলকে ছুঁড়ে ফেলার জন্য, আপনি একটি পৃথক PHONY টার্গেট করতে পারেন:

.PHONY: show_vars
show_vars:
    @echo foo$(VAR)
    @echo bar$(PARAM) blah$(FLAG)
    # and so on

এবং এটি আপনার ডিফল্ট টার্গেটের পূর্বশর্ত তৈরি করা যেতে পারে:

all: show_vars
    ...

সম্পাদনা:
আপনি একটি স্বেচ্ছাচারী মেকফিলের সমস্ত সম্ভাব্য লক্ষ্যগুলি দেখানোর একটি উপায় চান যা আমি মনে করি যে এটি হস্তক্ষেপহীন। আমরা হব...

এটি ঠিকঠাক করতে, এবং পরিশীলিত মেকফিলগুলি যেমন: evalবিবৃতি দ্বারা নির্মিত বিধিগুলি জড়িতগুলির সাথে মোকাবিলা করতে সক্ষম হতে আপনাকে মেক এমুলেটরটির নিকটে কিছু লিখতে হবে। অযৌক্তিক।

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

  1. সেড ব্যবহার করে মেকফিল থেকে সমস্ত টার্গেটের নাম পান।
  2. ভেরিয়েবলগুলি প্রসারণ করতে মেকফাইলটি এটি ব্যবহার করার জন্য অন্তর্ভুক্ত করুন।
  3. `Show_%: ব্যবহার করুন; প্রতিধ্বনি $$ * `সমস্ত লক্ষ্য মুদ্রণ করতে

এটি কাজের একটি চিত্তাকর্ষক অংশ হবে। আপনি কি নিশ্চিত যে লক্ষ্যটি চেষ্টাটির পক্ষে মূল্যবান?


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

-4
grep ^[a-z].*\:$ Makefile | sed s,:,,g

4
-1: এই পদ্ধতির এমনকি সহজ পরিবর্তনশীল অ্যাসাইনমেন্ট ( :=) এর জন্যও মিথ্যা ধনাত্মকতা তৈরি হয় ।
thiton

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