আপনি কি ট্যাব অক্ষর ছাড়া বৈধ Makefiles করতে পারেন?


114
target: dependencies
    command1
    command2

আমার সিস্টেমে (ম্যাক ওএস এক্স) makeমনে হচ্ছে যে মেকফিলসের প্রতিটি commandলাইনের সামগ্রীর আগে একটি ট্যাব অক্ষর রয়েছে বা এটি একটি সিনট্যাক্স ত্রুটি ছুঁড়েছে।

মেকফিলগুলি তৈরি বা সম্পাদনা করার সময় এটি একটি বিরক্তি কারণ কারণ আমার সম্পাদকটি সর্বদা-সর্বদা-স্থান হিসাবে সেট আপ করা আছে।

আপনি কি ট্যাব অক্ষর ছাড়া বৈধ Makefiles করতে পারেন?


4
আমি আমার সম্পাদককে ফাঁকা জায়গায় ট্যাবগুলি অনুকরণ করতেও কনফিগার করেছি। তবে, আমার সম্পাদক আমাকে বিরল ইভেন্টগুলিতেও সিটিআরএল-ট্যাব টাইপ করার অনুমতি দেয় যখন আমার একেবারে, ইতিবাচকভাবে ম্যাকফিলসের মতো একটি ট্যাব থাকতে হবে। সম্ভবত আপনার সম্পাদকও এটি করেন।
সরঞ্জামিক

উত্তর:


118

এটি একটি সিনট্যাক্সের বিজোড়তা / প্রয়োজনীয়তা make, ম্যাক ওএস এক্স এর সাথে এর কোনও যোগসূত্র নেই Unfortunately দুর্ভাগ্যক্রমে, আপনি যদি ব্যবহার করতে যাচ্ছেন তবে এটি সম্পর্কে আপনি কিছুই করতে পারবেন না make

সম্পাদনা করুন : GNU Make এখন একটি কাস্টম রেসিপি উপসর্গ সমর্থন করে। এই উত্তর দেখুন ।

এর দিকটি অপছন্দকারী আপনি প্রথম নন makeইউনিক্স হ্যাটার্সের হ্যান্ডবুকটি উদ্ধৃত করতে :

ডেনিসের মেকফিলের সমস্যাটি হ'ল তিনি যখন মন্তব্য মন্তব্যটি যুক্ত করেছিলেন, অজান্তেই তিনি লাইন ২-এর শুরুতে ট্যাব চরিত্রের আগে একটি স্থান সন্নিবেশ করান ট্যাব চরিত্রটি মেকফিলসের বাক্য গঠনটির একটি অত্যন্ত গুরুত্বপূর্ণ অংশ। সমস্ত কমান্ড লাইন (আমাদের উদাহরণে সিসি দিয়ে শুরু হওয়া লাইনগুলি) অবশ্যই ট্যাব দিয়ে শুরু করা উচিত। তিনি তার পরিবর্তন করার পরে, লাইন 2 করেনি, সুতরাং ত্রুটি।

"তাতে কি?" আপনি জিজ্ঞাসা করেন, "এতে কী হয়েছে?"

এটি নিজে থেকে কোনও দোষ নেই। এটি ঠিক যখন আপনি ইউনিক্সে অন্যান্য প্রোগ্রামিং সরঞ্জামগুলি কীভাবে কাজ করে তা বিবেচনা করার সময়, ট্যাবগুলি সিনট্যাক্সের অংশ হিসাবে ট্যাবগুলি ব্যবহার করার জন্য গ্রীন বেরেটসের সেই পাঞ্জি স্টিকের ফাঁদের মতো: কানসাসের দরিদ্র বাচ্চা জন ওয়েনের সামনে হাঁটছে এবং ' ট্রিপের তারে দেখুন। সর্বোপরি, কানসাস ভুট্টা ক্ষেতগুলিতে নজর রাখার জন্য কোনও ট্রিপ তার নেই। Wham!


5
ট্যাবগুলি সহ যে সমস্যাটি ব্যবহার করা শিখতে পারে তা প্রথম জিনিস - আমি কখনই এটি আসল সমস্যা হিসাবে পাইনি।

2
@ নীল, আমিও না: আমি কখনও বলিনি যে আমি ইউএইচএইচে সম্মতি জানাই, আমি কেবল বলছিলাম কিছু লোক এটি পছন্দ করেন না। :-)
অলোক সিংহল

2
চতুর ব্যবহারের জন্য ভাল প্লাগের মতো মনে হচ্ছে। সিনট্যাক্স তৈরিতে একমাত্র হতাশাব্যঞ্জকতা নয়।
orodbhen

3
আমি সবেমাত্র gnu.org/software/make/manual/html_node/Special-Variables.html (দেখুন .RECIPEPREFIX) খুঁজে পেয়েছি । নীচের উত্তরগুলির মধ্যে একটিতে উল্লেখ করা হয়েছে যে, এবং আমার পরিবর্তে "সঠিক" হিসাবে চিহ্নিত করা উচিত। stackoverflow.com/a/21920142
অলোক সিংহল

3
এটি কোনও বিশাল সমস্যা নয়, তবে এটি বিরক্তিকর। প্রতিটি এবং প্রতিটি সময়। এটি নির্ভরযোগ্যভাবে বিরক্তিকর, এবং এটি অক্স্রোন লিনিয়ার সময়ে বিরক্তিকর।
পার্থিয়ান শট

60

যেহেতু এই প্রশ্নটি প্রাথমিকভাবে জিজ্ঞাসা করা হয়েছিল, সেই সময়ের মধ্যে জিএনইউ মেকের একটি সংস্করণ প্রকাশিত হয়েছে যা আপনাকে Tabউপসর্গের চরিত্র হিসাবে ছাড়া অন্য কিছু ব্যবহার করতে দেয় । মেলিং তালিকার ঘোষণা থেকে :

নতুন বিশেষ পরিবর্তনশীল: .RECIPEPREFIX আপনাকে রেসিপি ভূমিকা অক্ষরটিকে ডিফল্ট (টিএবি) থেকে অন্য কোনও কিছুতে পুনরায় সেট করতে দেয়। এই পরিবর্তনশীল মানের প্রথম অক্ষরটি নতুন রেসিপি ভূমিকা অক্ষর character যদি ভেরিয়েবলটি খালি স্ট্রিংয়ে সেট করা থাকে তবে আবার ট্যাব ব্যবহার করা হবে। এটি ইচ্ছামতো সেট এবং রিসেট করা যেতে পারে; রেসিপিগুলি প্রথম পার্স করার সময় সক্রিয় মানটি ব্যবহার করবে। এই বৈশিষ্ট্যটি সনাক্ত করতে $ (। RECIPEPREFIX) এর মানটি পরীক্ষা করুন।

এই বৈশিষ্ট্যটি GNU Make 3.82 এ যুক্ত হয়েছিল, যা জুলাই ২০১০ এ প্রকাশিত হয়েছিল (এই প্রশ্নের মূল জিজ্ঞাসার তারিখের ছয় মাস পরে)। যেহেতু এটি ঘুরে ফিরে তিন বছর হয়েছে এবং তার পর থেকে পরিবর্তন হয়েছে, সম্ভবত অন্যান্য মেক স্বাদগুলি জিএনইউ মেক অনুসরণ করেছে।


51

ট্যাব ছাড়াই বৈধ মেকফাইল রাখার একটি বিভ্রান্তিকর উপায় রয়েছে।

আপনি যদি আপনার মেকফিলটি পড়তে পরিবর্তন করেন:

target: dependencies; command1; command2

কাজ হবে যদি। যদি আপনি এটি একাধিক লাইনে চান তবে আপনি এটি করতে পারেন:

target: dependencies; \
command1; \
command2

অগোছালো তবে এটি কাজ করে।


সমর্থন করে .RECIPEPREFIXএমন একটি সংস্করণে আপগ্রেড করা সম্ভবত সেরা পন্থা। যাইহোক, যেহেতু আমার এটি করার মতো মনে হয়নি, তাই আমি এর ভিত্তিতে একটি সমাধান ব্যবহার করে শেষ করেছি। লাইন 1 target:\ :, লাইন 2: [চার স্পেস ইন্ডেন্টেশন] এরপরে;command
এল এস

33

আপনার প্রোফাইলে যদি একটি ভিএমআরসি থাকে আপনি ভিএমকে স্পেসে পরিবর্তন থেকে রোধ করতে এই লাইনটি যুক্ত করতে পারেন:

autocmd FileType make setlocal noexpandtab

আমিও এটির সাথে লড়াই করে যাচ্ছিলাম এবং এটি আমার জন্য এটি স্থির করেছে। ভাল কথা ছড়িয়ে দিন!


19

আপনি স্পেস ব্যবহার করতে চাইলে এটি আমার জন্য এটি করে

.RECIPEPREFIX +=

উদাহরণ


কোন সংস্করণ এটি সমর্থন করে? এটি GNU Make 4.1 এ কাজ করে না।
সেরিন

2
GNU Make 4.1 x86_64-pc-linux-gnu এর জন্য নির্মিত আমি দুঃখিত তবে এটি কাজ করে
নওক

সম্ভবত, এটি উল্লেখ করা দরকার, এই পরিবর্তনশীলটি নিজেই ফাইল তৈরি করতে হবে (স্পট না করা সহজ বিন্দু উপস্থাপন)
urusai_na

কমপক্ষে ৪.২ সংস্করণে এটি কাজ করা উচিত। ডকুমেন্টেশনটির ব্যাখ্যায় বলা হয়েছে .RECIPEPREFIX"যদি ভেরিয়েবলটি খালি থাকে (যেমন এটি ডিফল্ট হিসাবে হয় ) তবে সেই অক্ষরটি স্ট্যান্ডার্ড ট্যাব অক্ষর।" এর অর্থ চলকটি ডিফল্টরূপে সংজ্ঞায়িত হয়। এটি ব্যবহার করে নিশ্চিত হয়ে গেছে ifeq ($(origin .RECIPEPREFIX), undefined)। কারণ +=পরিশেষে যোগ একটি একক স্থান এবং LHS করার RHS, var +=সেট varএকটি একক স্থান (প্লাস একটি খালি স্ট্রিং) এর যতদিন varইতিমধ্যে সংজ্ঞায়িত করা হয়েছে। (যদি varসংজ্ঞায়িত না হয় +=তবে এটি একইরকম =))
ynn

1
এই উত্তর আর কাজ করে না। সর্বশেষ সমাধানের জন্য আমার উত্তর দেখুন ।
ynn

11

ভিমের সন্নিবেশ মোডে, Ctrl-v <TAB>কোনও শাব্দিক ট্যাব সন্নিবেশ করতে ব্যবহার করতে পারেন , এমনকি যদি আপনি ফাঁকা স্থান সারণির জন্য ট্যাব কী সেট করে রেখেছেন। এটি অবশ্যই আপনার প্রশ্নের উত্তর দেয় না, তবে আক্ষরিক ট্যাবগুলি এড়াতে উপলব্ধ পদ্ধতির বিকল্প হতে পারে।


10

আপনি যদি সম্পাদককনফিগ ব্যবহার করছেন তবে আপনার আইডিইকে.editorconfig ফাঁকা স্থানগুলির পরিবর্তে ইনডেন্টেশনের জন্য ট্যাব ব্যবহার করতে বাধ্য করতে আপনি আপনার ফাইলে নিম্নলিখিত লাইনগুলি যুক্ত করতে পারেন Makefile:

[Makefile]
indent_style = tab

4

GNU অবধি 4.2 করুন Make

স্টিভেন পেনির উত্তর কাজ করে।

.RECIPEPREFIX +=

কেন এই কাজ করে তা আমার মন্তব্যে বর্ণিত ।


GNU Make 4.3 (19 জানুয়ারী 2020 এ প্রকাশিত হয়েছে)

+=অপারেটরের আচরণটি পশ্চাৎপদ-অসামঞ্জস্যভাবে পরিবর্তিত হয়েছে । যদি বাম অপারেন্ডের খালি মান থাকে তবে একটি স্থান আর যুক্ত করা হবে না

আপনি পরিবর্তে ব্যবহার করতে পারেন

.RECIPEPREFIX := $(.RECIPEPREFIX)<space>

, যেখানে <space>একটি একক স্থান। যদিও $(.RECIPEPREFIX)খালি মান হিসাবে প্রসারিত করা হয় তবে এটি GNU এড়ানো উচিত নয় <space>। নোট করুন এই কোডটি জিএনইউতেও সংস্করণ 4.3 এর চেয়ে পুরানো তৈরিতে কাজ করে।


1

উবুন্টুতে: vi মেকফিলগুলি ট্যাব দ্বারা স্থানটি প্রতিস্থাপন করে (বা অন্য কিছু যা আপনি চান):

:%s/<space chars>/^I/g

প্রাক্তনের জন্য ট্যাব দ্বারা 8 টি স্পেস প্রতিস্থাপন করুন:

:%s/        /^I/g

মনোযোগ দিন: tab আমি ট্যাব কী দিয়ে সন্নিবেশ করি ^ এবং আমি অক্ষরগুলি না: ডি


-6

বহনযোগ্য নয়। কিছু স্বাদ তৈরির জন্য একেবারে ট্যাব অক্ষর প্রয়োজন। ফাঁকা জায়গাগুলির চেয়ে ট্যাবগুলিকে প্রাধান্য দেওয়ার আরও একটি কারণ :-)

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