মেক ব্যবহারের সময় "কোনও লক্ষ্য" ত্রুটি


12

আমি কীভাবে ব্যবহার makeএবং মেকফাইলগুলি শিখছি , তাই আমি এই ছোট্ট ফাইলটি লিখেছিলাম:

%.markdown: %.html
    pandoc -o $< $@

কিন্তু আমি যখন দৌড়ে যাই make, তখন আমার যা হয় make: *** No targets. Stop.তা হ'ল কী হচ্ছে?


pandocকমান্ডের সামনে সেই স্পেসগুলি বা কোনও ট্যাব রয়েছে । মেকগুলি খালি জায়গাগুলি নয় এমন একটি ট্যাব হওয়ার বিষয়ে কুখ্যাত pick
slm

@ এসএলএম: এটি একটি ট্যাব। আমি কোথাও পড়েছি যে উইন্ডোজের EOL সামঞ্জস্যপূর্ণ নয়, তাই আমি পুরো ফাইলটিকে ইউনিক্সের সামঞ্জস্যপূর্ণ EOL এ রূপান্তর করি।
আহমেদ

উত্তর:


17

সমস্যা:

আপনার সমস্যাটি হ'ল এটি makeআপনার লক্ষ্যগুলি সম্পর্কে জানে না।

make stackoverflow.markdownউদাহরণস্বরূপ আপনি আপনার উপরের মেকফিলটি চালাতে পারেন এবং এটি কার্যকর হবে।

make শুধুমাত্র, তবে, ব্যর্থ হবে, যেহেতু আপনি কেবলমাত্র কীভাবে আপনার লক্ষ্যগুলি তৈরি করবেন তা নির্দিষ্ট করেছেন, তবে কোনটি নয়।

যেহেতু লিয়াজ পয়েন্টের উপরোক্ত প্যাটার্নের নিয়মটিকে অন্তর্নিহিত নিয়ম বলা হয় ।

Makefile নামক:

SRC = $(wildcard *.html)
TAR = $(SRC:.html=.markdown)

.PHONY: all clean

all: $(TAR)

%.markdown: %.html
    pandoc -o $< $@

clean:
    rm -f $(TAR)

ব্যাখ্যা:

SRC.htmlমেকফিলের মাধ্যমে সমস্ত উত্স ফাইল (যারা শেষ হয় ) পান wildcard

টিএআর কর্মের পরিবর্তে প্রতিটি উৎস তালিকাভুক্ত ফাইল SRCএকটি টার্গেট দিয়ে শেষ সঙ্গে .markdownপরিবর্তে .html

.ফোনটি অ-শারীরিক লক্ষ্যগুলি তালিকাভুক্ত করে যা সর্বদা অতিক্রান্ত থাকে এবং তাই সর্বদা কার্যকর করা হয় - এগুলি প্রায়শই allএবং clean

লক্ষ্যall (ডান দিকে তালিকাভুক্ত ফাইল নির্ভরতা যেমন রয়েছে :সব) *.markdownফাইল। এর অর্থ এই সমস্ত লক্ষ্যমাত্রা কার্যকর করা হয়।

%.markdown: %.html
    pandoc -o $< $@

এই স্নিপেটটি বলে: প্রতিটি টার্গেটের সমাপ্তি .markdownএকই নামের একটি ফাইলের উপর নির্ভর করে, নির্ভরতাটি শেষ হয়ে যাওয়া ব্যতীত .htmlওয়াইল্ডকার্ড% একটি হিসেবে দেখা যেতে হয় *শেল মত। %ডান দিকে অবশ্য বাম পাশে ম্যাচ সাথে তুলনা করা হয়। উত্স

নোট করুন যে শ্বেত স্পেস সিকোয়েন্স ইনফ্রন্টটি pandocহ'ল একটি TAB, যেহেতু makeএটি একটি স্ট্যান্ডার্ড হিসাবে সংজ্ঞায়িত হয়।

অবশেষে, ফোনি cleanটার্গেটে এই মেকফিলের সাহায্যে তৈরি করা ফাইলগুলি থেকে আপনার সিস্টেমকে কীভাবে পরিষ্কার করা যায় তা চিত্রিত করা হয়। এই ক্ষেত্রে, এটি সমস্ত লক্ষ্যবস্তু মুছে ফেলছে (সেই ফাইলগুলির নাম দেওয়া হয়েছিল) *.markdown


1
দুর্দান্ত উত্তর এবং এটি অন্যান্য লিঙ্কগুলি এটি আরও বোঝার চেষ্টা করার সময় আমি খুঁজে পেয়েছি: ওয়াইল্ডকার্ড ফাংশন , প্রতিস্থাপনের রেফারেন্স এবং ফনি লক্ষ্যগুলি
আহমেদ

আরও একটি প্রশ্ন দয়া করে: makefileস্ক্র্যাচ থেকে ফাইল তৈরি করতে পারে বা এটি কেবল বিদ্যমান ফাইলগুলি আপডেট করে? কারণ আমি যখন উত্পন্ন ফাইলগুলি মুছব তখন এটি কাজ করা বন্ধ করে দেয়। নির্বোধ প্রশ্ন আমি জানি, তবে এটি আমার কাছে নিউফাউন্ডল্যান্ড ^^ "
আহমদ

1
আপনি বোঝাতে চাইছেন যদি সেখানে .মার্কডাউন ফাইল নেই, তবে সেগুলি তৈরি করা হবে? হাঁ এটা যে করা উচিৎ যেমন যতদূর আমি জানি
polym

1
তাহলে ঠিকআছে. আমি আরও কিছু খনন করব। আপনার উত্তরের জন্য ধন্যবাদ, আপনাকে ধন্যবাদ আমি এখন সঠিক পথে:)
আহমদ

1
দুর্দান্ত উত্তরের জন্য আপনাকে কেবল ধন্যবাদ জানাতে চেয়েছিলাম। আপনি যেভাবে ব্যাখ্যা করেছেন সেটি হ'ল কমান্ডটি কার্যকারী না হওয়ার পেছনের কারণ এবং কীভাবে এগিয়ে যেতে হবে সে সম্পর্কে একটি বিস্তৃত নির্দেশাবলী বোঝা খুব সহজ। আবার ধন্যবাদ.
জ্যানোনা

5

প্যাটার্ন বিধিগুলি অন্তর্ভুক্ত নিয়ম।

আপনার মেকফাইলে আপনার কোনও লক্ষ্য নির্ধারিত নেই। কমান্ড লাইনে বিভিন্ন লক্ষ্য নির্দিষ্ট করতে পারেন: make something.markdownতৈরি করতে রেসিপি ব্যবহার করবে something.markdownথেকে something.html

অথবা আপনি আপনার Makefile এ একটি বিধি যুক্ত করতে পারেন যা ডিফল্ট লক্ষ্যগুলি নির্দিষ্ট করে।

all: file1.markdown file2.markdown

বা ওয়াইল্ডকার্ড সহ:

all: *.markdown

আপনি যখন ঠিক রান করেন make, প্রথম নিয়মের প্রথম লক্ষ্যটি হ'ল ডিফল্ট লক্ষ্য । এটি বলার দরকার নেই all

সুতরাং উপরে, লক্ষ্যটিতে allআপনার পূর্ববর্তী পূর্বশর্ত হিসাবে তৈরি করতে চান এমন সমস্ত ফাইল রয়েছে, সুতরাং যখন আপনি make allএটি করবেন তখন এটি তালিকাভুক্ত সমস্ত ফাইল তৈরি করবে।

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