এমকিডিআর ব্যবহার করার সময় কীভাবে একটি মেকফিলের মধ্যে "ডিরেক্টরি ইতিমধ্যে ত্রুটি বিদ্যমান" রোধ করতে হয়


109

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

আমি মূলত মিংগ / এমএসই ব্যবহার করি তবে এমন কিছু চাই যা অন্যান্য শেল / সিস্টেমগুলিতেও কাজ করে।

আমি এটি চেষ্টা করেছিলাম কিন্তু এটি কার্যকর হয়নি, কোনও ধারণা?

ifeq (,$(findstring $(OBJDIR),$(wildcard $(OBJDIR) )))
-mkdir $(OBJDIR)
endif

উত্তর:


106

ইউনিক্সে কেবল এটি ব্যবহার করুন:

mkdir -p $(OBJDIR)

ডিরেক্টরি উপস্থিত থাকলে এমকেডির -p বিকল্পটি ত্রুটি বার্তাটিকে বাধা দেয়।


39
"সাধারণত, এই প্রোগ্রামগুলির ব্যাপক-সমর্থিত (সাধারণত পিক্সিক-নির্দিষ্ট) বিকল্পগুলি এবং বৈশিষ্ট্যগুলিকে আটকে রাখুন example উদাহরণস্বরূপ, 'এমকেডির-পি' ব্যবহার করুন যেমনটি উপযুক্ত হতে পারে না, কারণ কয়েকটি সিস্টেম এটি সমর্থন করে না একেবারে এবং অন্যের সাথেও, এটি সমান্তরাল মৃত্যুর জন্য নিরাপদ নয় "" gnu.org/s/hello/manual/make/Utilities-in-Makefiles.html
গ্রেগ.কিন্ডেল

8
-pউইন্ডোজে কাজ করে না, যা সম্ভবত প্রশ্নটি জিজ্ঞাসা করছে। এটি কীভাবে গ্রহণযোগ্য তা নিশ্চিত নয়।
অ্যান্টিমনি

2
উইন্ডোজের জন্য, এইটিকে
শেল

1
@ অ্যান্টিমনি আপনি যদি MinGW শেলের বাইরে জিএনইউ মেক ব্যবহার করছেন তবে আপনি সম্ভবত কিছু ভুল করেছেন। যদিও আপনার পছন্দ।
yyny

"ইউনিক্সে কেবল এটি ব্যবহার করুন ..." - make -pইউনিক্স বা লিনাক্স?
jww

122

অফিসিয়াল মেক ডকুমেন্টেশনগুলির দিকে তাকানো, এটি করার জন্য এখানে একটি ভাল উপায়:

OBJDIR := objdir
OBJS := $(addprefix $(OBJDIR)/,foo.o bar.o baz.o)

$(OBJDIR)/%.o : %.c
    $(COMPILE.c) $(OUTPUT_OPTION) $<

all: $(OBJS)

$(OBJS): | $(OBJDIR)

$(OBJDIR):
    mkdir -p $(OBJDIR)

এখানে আপনার ব্যবহার দেখতে হবে পাইপ অপারেটর, কেবলমাত্র পূর্বশর্ত নির্দিষ্ট করে order এর অর্থ বর্তমান টার্গেটটি তৈরি করতে লক্ষ্যটি $(OBJDIR)বিদ্যমান ( আরও সাম্প্রতিক পরিবর্তে ) থাকা উচিত ।

আমি ব্যবহার করেছি নোট করুন mkdir -p-pপতাকা ডক্স উদাহরণ তুলনায় যোগ করা হয়েছিল। অন্য বিকল্পের জন্য অন্যান্য উত্তর দেখুন।


4
এটি অবশ্যই এই সমস্যার সরকারী উপায়।
lcltj

@CraigMcQueen: আমি সত্যিই বোঝানো " $(OBJDIR)লক্ষ্য হওয়া উচিত অস্তিত্ব " । এটির লক্ষ্য নির্ধারণের প্রয়োজন কিনা তা সিদ্ধান্ত নিতে ফাইল উপস্থিতি (এবং টাইমস্ট্যাম্প) এর জন্য চেক তৈরি করুন। অত: পর এখানে, যদি $(OBJDIR)হয় অনুপস্থিত তা নির্মাণ করতে হবে, যাতে এটা অস্তিত্ব অর্ডার বর্তমান লক্ষ্য নির্মাণ করার জন্য $(OBJS), যে ভিতরে তৈরি করা হবে।
ofavre

আমি মনে করি এটির সমাধানের আগে আমি আক্ষরিক অর্থেই এই সমস্যাটি সমাধানের প্রতিটি অন্যান্য সংমিশ্রণ চেষ্টা করেছি (আমি উইন্ডোজ / লিনাক্সের মধ্যে যতটা জেনেরিক হতে পারি এমন মেকফাইলগুলি তৈরি করার চেষ্টা করছি) - এটি কেবলমাত্র আমিই কাজ করতে পারলাম তবে এটি এত ভাল কাজ করে! :)
কোড_ফড্ডার

67

আপনি পরীক্ষা আদেশটি ব্যবহার করতে পারেন:

test -d $(OBJDIR) || mkdir $(OBJDIR)

7
আপনার উইন্ডোজ উভয় (gnuwin32 এবং PowerShell সহ) এবং POSIX- অনুবর্তী OS এর কাজ করার জন্য আপনার মেকফিলগুলি প্রয়োজন হলে এটি পছন্দীয় উপায়।
ক্রিস হার্ডি

6
'পরীক্ষা' ইউটিলিটি সরবরাহ করার জন্য আপনার কাছে gnuwin32 CoreUtils প্যাকেজ সরবরাহ করা হয়েছে।
davenpcj

2
এখানে দেরি হয়ে গেছে, তবে আমি উল্লেখ করতে চাই যে make -jযখন এই ডিরেক্টরিটি যখন অস্তিত্বের জন্য পরীক্ষা করা হয় এবং এটি তৈরি করা হয় তখন এর মধ্যে একটি দৌড় শর্তের কারণে সমান্তরাল ( ) বিল্ডিংয়ের সময় ভেঙে যেতে পারে । একটি কাজ পরীক্ষা করতে পারে যে এটি সেখানে নেই তবে এটি তৈরি করার আগে, অন্য একটি কাজ ডিরেক্টরি তৈরি করে। তারপরে যখন প্রথম এটি তৈরির চেষ্টা করে, এটি ব্যর্থ হবে কারণ ডিরেক্টরিটি ইতিমধ্যে বিদ্যমান। এই ক্ষেত্রে সর্বোত্তম সমাধান হ'ল @ টেকার উত্তরে বর্ণিত শর্তাদি কেবল পূর্বশর্ত ব্যবহার করা (যা গ্রহণযোগ্য উত্তর হওয়া উচিত)।
C0deH4cker

@ মার্কাসজে আমার ওএস এক্স এল ক্যাপিটেনে কাজ করে। কোন সংস্করণটি এটি ভেঙেছে?
ফ্রাঙ্কলিন ইউ

@ C0deH4cker - আমার অজ্ঞতা ক্ষমা করুন ... টেকা কোন উত্তর? আমার মনে হয় আপনি মন্তব্য করার পর থেকে টেকা তার নাম পরিবর্তন করেছেন।
jww

18

সংকলক-আউটপুট ডিরেক্টরি তৈরি করার জন্য আমি জিএনইউ দিয়ে তৈরি একটি কৌশল। প্রথমে এই নিয়মটি সংজ্ঞায়িত করুন:

  %/.d:
          mkdir -p $(@D)
          touch $@

তারপরে ডিরেক্টরিতে যাওয়া সমস্ত ফাইল সেই ডিরেক্টরিতে .d ফাইলের উপর নির্ভর করে তৈরি করুন:

 obj/%.o: %.c obj/.d
    $(CC) $(CFLAGS) -c -o $@ $<

নোট instead <এর পরিবর্তে Note use ব্যবহার করুন ^

অবশেষে .d ফাইলগুলি স্বয়ংক্রিয়ভাবে সরানো থেকে রোধ করুন:

 .PRECIOUS: %/.d

.D ফাইলটি এড়িয়ে যাওয়া, এবং সরাসরি ডিরেক্টরিতে নির্ভর করে কাজ করবে না, কারণ ডিরেক্টরি পরিবর্তনের সময়টি প্রতিবার সেই ডিরেক্টরিতে কোনও ফাইল লেখার সময় আপডেট করা হয় যা মেকের প্রতিটি অনুরোধে পুনর্নির্মাণকে বাধ্য করবে।


1
আহ, ধন্যবাদ, আমি কাজ করার জন্য এই জাতীয় কিছু পাওয়ার চেষ্টা করছিলাম। আমি বেশ কয়েকটি লক্ষ্য নিয়ে "টেস্ট-ডি foo || mkdir foo" চাই না, তার পর থেকে "মেক-জে 2" ব্যবহার করে তাদের একই সময়ে পরীক্ষা করা হবে, উভয় পরীক্ষা মিথ্যা প্রদান করবে এবং তারপরে দুটি প্রক্রিয়া এমকেডির চেষ্টা করবে, তাদের শেষ ব্যর্থ।
অহংকার

13

ডিরেক্টরিটি ইতিমধ্যে উপস্থিত থাকলে যদি আপনার সমস্যা না হয় তবে আপনি ত্রুটি বার্তা থেকে মুক্তি পেয়ে কেবল এই আদেশটির জন্য স্টডারকে পুনর্নির্দেশ করতে পারেন:

-mkdir $(OBJDIR) 2>/dev/null

এটি উইন্ডোতেও কাজ করার সুবিধা রয়েছে। কমান্ডের সামনে '-' ভুলে যাবেন না তাই মেকিং জামিন দেয় না।
মাইকেল বুড়

11

আপনার মেকফিলের ভিতরে:

target:
    if test -d dir; then echo "hello world!"; else mkdir dir; fi

10

উইন্ডোজ এ

if not exist "$(OBJDIR)" mkdir $(OBJDIR)

ইউনিক্সে | লিনাক্স

if [ ! -d "$(OBJDIR)" ]; then mkdir $(OBJDIR); fi

এটি উইন্ডোজের জন্য।
চেকসাম

/bin/sh: 1: Syntax error: end of file unexpected (expecting "then")
wotanii

প্রথম সংস্করণটি উইন্ডোজের জন্য, দ্বিতীয় বিকল্পটি লিনাক্সে কাজ করে যেমন @ চেকসাম বলেছিলেন
এডগার্ড

প্রথমটি, উইন্ডোজ, সংস্করণটি পারমাণবিক নয় তাই এটি যখন কাজ করে না তখন অন্য একটি প্রক্রিয়া (যেমন সমান্তরাল মোডে একটি নিয়ম) "অস্তিত্ব নেই" এবং "এমকেডির" এর মধ্যে ডিরেক্টরি তৈরি করে।
পেট্রা ভেপেক


6
$(OBJDIR):
    mkdir $@

যা একাধিক ডিরেক্টরিতেও কাজ করে যেমন, যেমন।

OBJDIRS := $(sort $(dir $(OBJECTS)))

$(OBJDIRS):
    mkdir $@

$(OBJDIR)প্রথম লক্ষ্য হিসাবে যুক্ত করা ভাল কাজ করে।


3

এটি mingw32 / msys / সাইগউইন / লিনাক্সের অধীনে কাজ করে

ifeq "$(wildcard .dep)" ""
-include $(shell mkdir .dep) $(wildcard .dep/*)
endif

0

আপনি যদি স্পষ্টরূপে রিটার্ন কোডটিকে উপেক্ষা করেন এবং ত্রুটি প্রবাহটি ডাম্প করেন তবে আপনার মেইক ত্রুটিটি যদি তা ঘটে তা উপেক্ষা করবে:

mkdir 2>/dev/null || true

এটি প্যারালাল মেকের ক্ষেত্রে প্রতিযোগিতার ঝুঁকির কারণ হবে না - তবে আমি এটি নিশ্চিত হওয়ার জন্য পরীক্ষা করে দেখিনি।


0

লারসের উত্তরের চেয়ে কিছুটা সহজ:

something_needs_directory_xxx : xxx/..

এবং জেনেরিক নিয়ম:

%/.. : ;@mkdir -p $(@D)

পরিষ্কার করার বা তৈরি করার জন্য কোনও টাচ-ফাইল নেই RE

আপনি যদি আরেকটি সাধারণ জেনেরিক গেমাক ট্রিক দেখতে চান বা আপনি যদি ন্যূনতম স্ক্যাফোোল্ডিংয়ের সাথে অ-পুনরাবৃত্ত মেকিং করতে আগ্রহী হন তবে আপনি সেই ব্লগে আরও দুটি সস্তা সস্তা মেক কৌশল এবং অন্যান্য মেক-সম্পর্কিত পোস্টগুলি পরীক্ষা করে দেখতে পারেন

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