উত্তর:
আপনার মেকফিলের বাইরে থেকে ভেরিয়েবল সেট আপ করার জন্য আপনার কাছে বেশ কয়েকটি বিকল্প রয়েছে:
পরিবেশ থেকে - প্রতিটি পরিবেশের ভেরিয়েবল একই নাম এবং মান সহ একটি মেকফিল ভেরিয়েবলে রূপান্তরিত হয়।
আপনি -e
বিকল্প (ওরফে --environments-override
) চালু করতেও পারেন , এবং আপনার পরিবেশের ভেরিয়েবলগুলি মেকফাইলে তৈরি অ্যাসাইনমেন্টগুলিকে ওভাররাইড করবে (যদি না এই অ্যাসাইনমেন্টগুলি নিজেরাই override
নির্দেশিকা ব্যবহার না করে However তবে, এটি প্রস্তাবিত নয়, এবং ?=
অ্যাসাইনমেন্টটি ব্যবহার করার ক্ষেত্রে এটি আরও ভাল এবং নমনীয় (শর্তাধীন ভেরিয়েবল) অ্যাসাইনমেন্ট অপারেটর, ভেরিয়েবলটি এখনও সংজ্ঞায়িত না হলে এর কেবলমাত্র একটি প্রভাব রয়েছে):
FOO?=default_value_if_not_set_in_environment
নোট করুন যে কিছু পরিবর্তনশীল পরিবেশ থেকে উত্তরাধিকার সূত্রে প্রাপ্ত নয়:
MAKE
স্ক্রিপ্টের নাম থেকে প্রাপ্তSHELL
হয় একটি মেকফিলের মধ্যে সেট করা হয়, বা এতে ডিফল্ট হয় /bin/sh
(যুক্তি: কমান্ডগুলি মেকফিলের মধ্যে নির্দিষ্ট করা হয়, এবং সেগুলি শেল-নির্দিষ্ট)।কমান্ড লাইন থেকে - make
তার কমান্ড লাইনের অংশ হিসাবে লক্ষ্যগুলি মিশ্রিত করে পরিবর্তনীয় অ্যাসাইনমেন্ট গ্রহণ করতে পারে:
make target FOO=bar
কিন্তু তারপর সব বরাদ্দকরণ FOO
Makefile মধ্যে পরিবর্তনশীল উপেক্ষা করা হবে যদি না আপনি ব্যবহার override
ডিরেক্টিভের নিয়োগ হবে। (প্রভাবটি -e
ভেরিয়েবলের বিকল্প হিসাবে একই )
পিতামাতার মেক থেকে রফতানি করা - যদি আপনি মেকফাইল থেকে মেক কল করেন তবে আপনার সাধারণত স্পষ্টভাবে এই জাতীয় পরিবর্তনশীল অ্যাসাইনমেন্টগুলি লেখা উচিত নয়:
# Don't do this!
target:
$(MAKE) -C target CC=$(CC) CFLAGS=$(CFLAGS)
পরিবর্তে, আরও ভাল সমাধান হতে পারে এই ভেরিয়েবলগুলি রফতানি করা। একটি ভেরিয়েবল রফতানি করা প্রতিটি শেল আবেদনের পরিবেশে এটি তৈরি করে এবং এই আদেশগুলি থেকে কলগুলি উপরে উল্লিখিত হিসাবে এই পরিবেশটি পরিবর্তনশীল চয়ন করে।
# Do like this
CFLAGS=-g
export CFLAGS
target:
$(MAKE) -C target
আপনি তর্ক ছাড়াই ব্যবহার করে সমস্ত পরিবর্তনশীল রফতানি করতে পারেন export
।
export PROJECT_MAKE_ARGS = CC=$(CC) CFLAGS=$(CFLAGS)
এবং পাশাপাশি পাস করা make -C folder $(PROJECT_MAKE_FLAGS)
। লাইব্রেরির মেকফিলকে পরিবেশ উপেক্ষা করার জন্য যদি কোনও উপায় থাকে তবে তা আদর্শ হবে (-e এর বিপরীতে)।
make target FOO=bar
make FOO=bar target
?
সবচেয়ে সহজ উপায়:
make foo=bar target
তারপরে আপনার মেকফাইলে আপনি উল্লেখ করতে পারেন $(foo)
। মনে রাখবেন এটি স্বয়ংক্রিয়ভাবে সাব-মেকগুলিতে প্রচার করবে না।
আপনি যদি সাব-মেক ব্যবহার করছেন তবে এই নিবন্ধটি দেখুন: একটি সাব-মেকের সাথে চলকগুলি যোগাযোগ করা
included
মূল মেকফিলের মেকফিলগুলি বোঝাতে চান ?
ম্যানুয়াল থেকে :
মেক ইন ভেরিয়েবলগুলি এমন পরিবেশ থেকে আসতে পারে যেখানে মেক তৈরি হয়। প্রতিটি পরিবেশ পরিবর্তনশীল যা দেখতে শুরু করে তা একই নাম এবং মান সহ একটি মেক ভেরিয়েবলে রূপান্তরিত হয়। যাইহোক, মেকফাইলে একটি স্পষ্ট স্পেসমেন্ট বা কমান্ড আর্গুমেন্ট সহ পরিবেশকে ওভাররাইড করে।
সুতরাং আপনি (বাশ থেকে) করতে পারেন:
FOOBAR=1 make
FOOBAR
আপনার মেকফাইলে পরিবর্তনের ফলে ।
এখানে আর একটি বিকল্প উদ্ধৃত হয়নি যা স্টলম্যান এবং ম্যাকগ্রাথের জিএনইউ মেক বইয়ে অন্তর্ভুক্ত রয়েছে (দেখুন http://www.chemie.fu-berlin.de/chemnet/use/info/make/make_7.html )। এটি উদাহরণ প্রদান করে:
archive.a: ...
ifneq (,$(findstring t,$(MAKEFLAGS)))
+touch archive.a
+ranlib -t archive.a
else
ranlib archive.a
endif
এটিতে কোনও প্রদত্ত প্যারামিটার উপস্থিত থাকলে যাচাই করা জড়িত MAKEFLAGS
। উদাহরণস্বরূপ .. ধরুন যে আপনি সি ++ 11 এ থ্রেড সম্পর্কে অধ্যয়ন করছেন এবং আপনি একাধিক ফাইল ( class01
, ...,,classNM
) এবং আপনি চান: তারপরে সমস্ত সংকলন করুন এবং স্বতন্ত্রভাবে চালনা করুন বা একটিতে একটি সংকলন করুন সময় এবং এটি চালান যদি একটি পতাকা নির্দিষ্ট করা হয় ( -r
উদাহরণস্বরূপ)। সুতরাং, আপনি নিম্নলিখিতটি নিয়ে আসতে পারেন Makefile
:
CXX=clang++-3.5
CXXFLAGS = -Wall -Werror -std=c++11
LDLIBS = -lpthread
SOURCES = class01 class02 class03
%: %.cxx
$(CXX) $(CXXFLAGS) -o $@.out $^ $(LDLIBS)
ifneq (,$(findstring r, $(MAKEFLAGS)))
./$@.out
endif
all: $(SOURCES)
.PHONY: clean
clean:
find . -name "*.out" -delete
যে থাকার পরে, আপনি:
make -r class02
;make
বা নির্মাণ make all
;make -r
(মনে করুন যে এগুলির মধ্যে কিছু নির্দিষ্ট ধরণের স্টোর স্টাফ রয়েছে এবং আপনি কেবল সেগুলি সব পরীক্ষা করতে চান)এটা দেখতে
কমান্ড আরোগুলি এনভায়রনমেন্ট ভেরিয়েবল ওভাররাইট করে
Makefile নামক
send:
echo $(MESSAGE1) $(MESSAGE2)
উদাহরণ চালান
$ MESSAGE1=YES MESSAGE2=NG make send MESSAGE2=OK
echo YES OK
YES OK
আপনি যদি মেকফাইল নামে একটি ফাইল তৈরি করেন এবং এই জাতীয় unit (ইউনিটেস্ট) এর মতো একটি ভেরিয়েবল যুক্ত করেন তবে আপনি ওয়াইল্ডকার্ড সহ এমনকি মেকফিলের অভ্যন্তরে এই পরিবর্তনশীলটি ব্যবহার করতে সক্ষম হবেন
উদাহরণ:
make unittest=*
আমি BOOST_TEST ব্যবহার করি এবং --run_test = $ (ইউনিটেস্ট) প্যারামিটারে একটি ওয়াইল্ডকার্ড দিয়ে আমি তারপরে আমার মেকফিলটি চালানোর জন্য পরীক্ষার ফিল্টার করতে নিয়মিত অভিব্যক্তি ব্যবহার করতে সক্ষম হব
make A='"as df"'