যেহেতু এটি ইউনিক্সের জন্য, এক্সিকিউটেবলের কোনও এক্সটেনশন নেই।
একটি বিষয় লক্ষণীয় root-config একটি ইউটিলিটি যা সঠিক সংকলন এবং পতাকা লিঙ্ক সরবরাহ করে; এবং মূলের বিরুদ্ধে অ্যাপ্লিকেশন তৈরির জন্য সঠিক লাইব্রেরি। এই দস্তাবেজের মূল শ্রোতার সাথে সম্পর্কিত কেবল এটিই বিশদ।
আমাকে বাচ্চা বানান
অথবা আপনি যে প্রথমবার তৈরি করেছিলেন তা কখনই ভুলে যান না
মেকের একটি প্রাথমিক ভূমিকা এবং কীভাবে একটি সাধারণ মেকফিল লিখতে হয়
মেক কি? এবং কেন আমার যত্ন নেওয়া উচিত?
মেক নামক সরঞ্জামটি একটি বিল্ড নির্ভরতা পরিচালক। এটি হ'ল সোর্স ফাইল, অবজেক্ট ফাইল, লাইব্রেরি, শিরোনাম, ইত্যাদি ইত্যাদি সংগ্রহ থেকে আপনার সফ্টওয়্যার প্রকল্পটি গ্রহণ করার জন্য কোন আদেশগুলি কার্যকর করতে হবে তা জানার যত্ন নেওয়া হয়েছে ---- যার কয়েকটি পরিবর্তিত হতে পারে সম্প্রতি --- এবং তাদের প্রোগ্রামের একটি সঠিক আপ টু ডেট সংস্করণে রূপান্তরিত করা।
আসলে, আপনি অন্য জিনিসগুলির জন্যও মেক ব্যবহার করতে পারেন, তবে আমি সে সম্পর্কে কথা বলব না।
একটি তুচ্ছ Makefile
মনে করুন যে আপনার একটি ডিরেক্টরি রয়েছে: tool tool.cc tool.o support.cc support.hhএবং support.oযা নির্ভর করে rootএবং একটি কল করা প্রোগ্রামে সংকলিত হওয়ার কথা tool, এবং ধরুন যে আপনি উত্স ফাইলগুলিতে হ্যাক করছেন (যার অর্থ বর্তমানে বিদ্যমানটি toolপুরানো হয়ে গেছে) এবং চান প্রোগ্রামটি সংকলন করুন
আপনি নিজেই এটি করতে পারেন
হয় কিনা তার চেয়ে নতুন support.ccবা support.hhনতুন কিনা তা পরীক্ষা করে দেখুন support.ocommand
g++ -g -c -pthread -I/sw/include/root support.cc
এর চেয়ে কম support.hhবা tool.ccনতুন কিনা তা যাচাই করুন tool.oএবং যদি এরকম একটি কমান্ড চালান
g++ -g -c -pthread -I/sw/include/root tool.cc
এর tool.oচেয়ে আরও নতুন কিনা তা পরীক্ষা করুন toolএবং যদি এর মতো একটি কমান্ড চালান
g++ -g tool.o support.o -L/sw/lib/root -lCore -lCint -lRIO -lNet -lHist -lGraf -lGraf3d -lGpad -lTree -lRint \
-lPostscript -lMatrix -lPhysics -lMathCore -lThread -lz -L/sw/lib -lfreetype -lz -Wl,-framework,CoreServices \
-Wl,-framework,ApplicationServices -pthread -Wl,-rpath,/sw/lib/root -lm -ldl
রাম রাম! কী ঝামেলা! অনেক কিছু মনে রাখার এবং ভুল করার বিভিন্ন সম্ভাবনা রয়েছে। (বিটিডব্লিউ-- - এখানে প্রদর্শিত কমান্ড লাইনের বিবরণগুলি আমাদের সফ্টওয়্যার পরিবেশের উপর নির্ভর করে ones এগুলি আমার কম্পিউটারে কাজ করে))
অবশ্যই, আপনি প্রতিবার কেবল তিনটি কমান্ড চালাতে পারেন। এটি কাজ করবে, তবে এটি সফটওয়্যারটির যথেষ্ট পরিমাণে ভাল স্কেল করে না (যেমন ডগস যেমন আমার ম্যাকবুকের উপর থেকে গ্রাউন্ড আপ সংকলন করতে 15 মিনিটেরও বেশি সময় নেয়)।
পরিবর্তে আপনি makefileএই নামে পরিচিত একটি ফাইল লিখতে পারেন:
tool: tool.o support.o
g++ -g -o tool tool.o support.o -L/sw/lib/root -lCore -lCint -lRIO -lNet -lHist -lGraf -lGraf3d -lGpad -lTree -lRint \
-lPostscript -lMatrix -lPhysics -lMathCore -lThread -lz -L/sw/lib -lfreetype -lz -Wl,-framework,CoreServices \
-Wl,-framework,ApplicationServices -pthread -Wl,-rpath,/sw/lib/root -lm -ldl
tool.o: tool.cc support.hh
g++ -g -c -pthread -I/sw/include/root tool.cc
support.o: support.hh support.cc
g++ -g -c -pthread -I/sw/include/root support.cc
এবং শুধু টাইপ করুন make কমান্ড লাইনে । যা উপরে প্রদর্শিত তিনটি পদক্ষেপ স্বয়ংক্রিয়ভাবে সম্পাদন করবে।
এখানে আনইনডেন্টেড রেখাগুলিতে "টার্গেট: নির্ভরতা" ফর্ম রয়েছে এবং বলুন যে লক্ষ্যগুলি তুলনায় নির্ভরতাগুলির কোনও নতুন হলে সংশ্লিষ্ট কমান্ডগুলি (ইনডেন্টড লাইনগুলি) চালানো উচিত। এটি হ'ল নির্ভরতা লাইনগুলি বিভিন্ন ফাইলে পরিবর্তনের জন্য পুনর্নির্মাণের প্রয়োজনীয়তার যুক্তি বর্ণনা করে। যদি support.ccপরিবর্তনগুলি এর অর্থ হয় তবে এটি support.oঅবশ্যই পুনর্নির্মাণ tool.oকরতে হবে তবে একা থাকতে পারে। যখন support.oপরিবর্তন toolপুনর্নির্মিত করা আবশ্যক।
প্রতিটি নির্ভরতা রেখার সাথে যুক্ত কমান্ডগুলি একটি ট্যাব দিয়ে সেট করা হয় (নীচে দেখুন) লক্ষ্যটি পরিবর্তন করতে হবে (বা কমপক্ষে পরিবর্তনের সময়টি আপডেট করতে এটি স্পর্শ করুন)।
ভেরিয়েবলস, বিল্ট ইন বিলেস এবং অন্যান্য সামগ্রী
এই মুহুর্তে, আমাদের মেকফিলটি কেবল সেই কাজটির কথা স্মরণ করছে যা করা দরকার, তবে আমাদের এখনও প্রতিটি প্রয়োজনীয় কমান্ডটি সম্পূর্ণরূপে খুঁজে বের করতে হয়েছিল এবং টাইপ করতে হয়েছিল। এটি সেভাবে হওয়ার দরকার নেই: মেকটি ভেরিয়েবল, টেক্সট ম্যানিপুলেশন ফাংশন এবং সম্পূর্ণ বিল্ট-ইন বিধি সহ একটি শক্তিশালী ভাষা যা আমাদের পক্ষে এটি আরও সহজ করে তুলতে পারে।
ভেরিয়েবলগুলি তৈরি করুন
কোনও মেক ভেরিয়েবল অ্যাক্সেস করার সিনট্যাক্সটি হ'ল $(VAR)।
মেক ভেরিয়েবলকে নির্ধারণের জন্য বাক্য গঠনটি হ'ল: VAR = A text value of some kind
(বা VAR := A different text value but ignore this for the moment)।
আপনি আমাদের মেকফিলের এই উন্নত সংস্করণের মতো নিয়মে ভেরিয়েবলগুলি ব্যবহার করতে পারেন:
CPPFLAGS=-g -pthread -I/sw/include/root
LDFLAGS=-g
LDLIBS=-L/sw/lib/root -lCore -lCint -lRIO -lNet -lHist -lGraf -lGraf3d -lGpad -lTree -lRint \
-lPostscript -lMatrix -lPhysics -lMathCore -lThread -lz -L/sw/lib -lfreetype -lz \
-Wl,-framework,CoreServices -Wl,-framework,ApplicationServices -pthread -Wl,-rpath,/sw/lib/root \
-lm -ldl
tool: tool.o support.o
g++ $(LDFLAGS) -o tool tool.o support.o $(LDLIBS)
tool.o: tool.cc support.hh
g++ $(CPPFLAGS) -c tool.cc
support.o: support.hh support.cc
g++ $(CPPFLAGS) -c support.cc
যা কিছুটা বেশি পঠনযোগ্য তবে এখনও অনেক টাইপিংয়ের প্রয়োজন
ফাংশন করুন
জিএনইউ মেক সিস্টেমের ফাইল সিস্টেম বা অন্যান্য কমান্ডের তথ্য অ্যাক্সেসের জন্য বিভিন্ন ফাংশন সমর্থন করে। এই ক্ষেত্রে আমরা আগ্রহী যেটি $(shell ...)আর্গুমেন্ট (গুলি) এর আউটপুট প্রসারিত করে এবং $(subst opat,npat,text)যা পাঠ্যের opatসাথে সমস্ত দৃষ্টান্তের পরিবর্তে npat।
এর সুবিধা গ্রহণ আমাদের দেয়:
CPPFLAGS=-g $(shell root-config --cflags)
LDFLAGS=-g $(shell root-config --ldflags)
LDLIBS=$(shell root-config --libs)
SRCS=tool.cc support.cc
OBJS=$(subst .cc,.o,$(SRCS))
tool: $(OBJS)
g++ $(LDFLAGS) -o tool $(OBJS) $(LDLIBS)
tool.o: tool.cc support.hh
g++ $(CPPFLAGS) -c tool.cc
support.o: support.hh support.cc
g++ $(CPPFLAGS) -c support.cc
যা টাইপ করা সহজ এবং আরও অনেক বেশি পাঠযোগ্য।
লক্ষ্য করুন
- আমরা এখনও প্রতিটি বস্তুর ফাইল এবং চূড়ান্ত সম্পাদনযোগ্য এর জন্য স্পষ্টভাবে নির্ভরতা উল্লেখ করছি
- উভয় উত্স ফাইলের জন্য আমাদের স্পষ্টভাবে সংকলন নিয়ম টাইপ করতে হয়েছিল
অন্তর্নিহিত এবং প্যাটার্ন বিধি
আমরা সাধারণত প্রত্যাশা করব যে সমস্ত সি ++ উত্স ফাইলগুলি একইরকম আচরণ করা উচিত এবং মেকটি এটিকে বর্ণনা করার জন্য তিনটি উপায় সরবরাহ করে:
- প্রত্যয় বিধি (জিএনইউ তৈরিতে অপ্রচলিত হিসাবে বিবেচিত, তবে পিছনের সামঞ্জস্যের জন্য রাখা হয়েছে)
- অন্তর্নিহিত বিধি
- প্যাটার্ন বিধি
অন্তর্নিহিত নিয়মগুলি অন্তর্নির্মিত, এবং কয়েকটি নীচে আলোচনা করা হবে। প্যাটার্ন বিধি যেমন একটি ফর্ম নির্দিষ্ট করা হয়
%.o: %.c
$(CC) $(CFLAGS) $(CPPFLAGS) -c $<
যার অর্থ হ'ল কমান্ডটি চালিয়ে সি উত্স ফাইলগুলি থেকে অবজেক্ট ফাইলগুলি উত্পন্ন হয়, যেখানে "স্বয়ংক্রিয়" ভেরিয়েবলটি $<প্রথম নির্ভরতার নামে প্রসারিত হয়।
অন্তর্নির্মিত বিধি
মেকের অন্তর্নির্মিত নিয়মের পুরো হোস্ট রয়েছে যার অর্থ খুব সহজেই খুব সহজেই একটি প্রকল্প খুব সাধারণ মেকফাইল দ্বারা সংকলন করা যায়।
সি উত্স ফাইলগুলির জন্য নিয়মে অন্তর্নির্মিত GNU হ'ল উপরের প্রদর্শিত। একইভাবে আমরা সি ++ উত্স ফাইলগুলি থেকে একটি নিয়মের মতো অবজেক্ট ফাইল তৈরি করি $(CXX) -c $(CPPFLAGS) $(CFLAGS)।
একক অবজেক্ট ফাইলগুলি ব্যবহার করে লিঙ্কযুক্ত $(LD) $(LDFLAGS) n.o $(LOADLIBES) $(LDLIBS), তবে এটি আমাদের ক্ষেত্রে কার্যকর হবে না, কারণ আমরা একাধিক অবজেক্ট ফাইলগুলি লিঙ্ক করতে চাই।
বিল্ট-ইন বিধি দ্বারা ব্যবহৃত ভেরিয়েবলগুলি
অন্তর্নির্মিত নিয়মগুলিতে স্ট্যান্ডার্ড ভেরিয়েবলগুলির একটি সেট ব্যবহার করা হয় যা আপনাকে সমস্ত বিধিগুলি পুনরায় না লিখে স্থানীয় পরিবেশের তথ্য (যেমন আরওটি ফাইলগুলি অন্তর্ভুক্ত করা উচিত যেখানে সন্ধান করতে পারে) নির্দিষ্ট করতে দেয়। আমাদের সবচেয়ে আকর্ষণীয় হওয়ার সম্ভাবনাগুলি হ'ল:
CC - সি সংকলকটি ব্যবহার করতে হবে
CXX - সি ++ ব্যবহারের জন্য সংকলক
LD - লিঙ্কার ব্যবহার করতে
CFLAGS - সি উত্স ফাইলগুলির জন্য সংকলন পতাকা
CXXFLAGS - সি ++ উত্স ফাইলগুলির জন্য সংকলন পতাকাগুলি
CPPFLAGS - সি এবং সি ++ দ্বারা ব্যবহৃত সি-প্রিপ্রেসেসরের জন্য পতাকাগুলি (সাধারণত কমান্ড লাইনে সংযুক্ত ফাইলের পাথ এবং চিহ্নগুলি অন্তর্ভুক্ত)
LDFLAGS - লিঙ্কার পতাকা
LDLIBS - লাইব্রেরি লিঙ্ক
একটি বেসিক Makefile
অন্তর্নির্মিত নিয়মের সুযোগ নিয়ে আমরা আমাদের মেকফিলকে এখানে সহজতর করতে পারি:
CC=gcc
CXX=g++
RM=rm -f
CPPFLAGS=-g $(shell root-config --cflags)
LDFLAGS=-g $(shell root-config --ldflags)
LDLIBS=$(shell root-config --libs)
SRCS=tool.cc support.cc
OBJS=$(subst .cc,.o,$(SRCS))
all: tool
tool: $(OBJS)
$(CXX) $(LDFLAGS) -o tool $(OBJS) $(LDLIBS)
tool.o: tool.cc support.hh
support.o: support.hh support.cc
clean:
$(RM) $(OBJS)
distclean: clean
$(RM) tool
আমরা বেশ কয়েকটি মানক লক্ষ্যও যুক্ত করেছি যা বিশেষ ক্রিয়াগুলি সম্পাদন করে (যেমন উত্স ডিরেক্টরিটি পরিষ্কার করা)।
নোট করুন যে যখন কোনও যুক্তি ছাড়াই মেক করা হয়, তখন এটি ফাইলটিতে পাওয়া প্রথম টার্গেট ব্যবহার করে (এই ক্ষেত্রে সমস্তটি) তবে আপনি লক্ষ্যটি নামকরণ করতে পারেন যা যা তৈরি করে make clean এই ক্ষেত্রে অবজেক্ট ফাইলগুলি সরিয়ে দেয়।
আমাদের এখনও সমস্ত নির্ভরতা হার্ড-কোডড।
কিছু রহস্যময় উন্নতি
CC=gcc
CXX=g++
RM=rm -f
CPPFLAGS=-g $(shell root-config --cflags)
LDFLAGS=-g $(shell root-config --ldflags)
LDLIBS=$(shell root-config --libs)
SRCS=tool.cc support.cc
OBJS=$(subst .cc,.o,$(SRCS))
all: tool
tool: $(OBJS)
$(CXX) $(LDFLAGS) -o tool $(OBJS) $(LDLIBS)
depend: .depend
.depend: $(SRCS)
$(RM) ./.depend
$(CXX) $(CPPFLAGS) -MM $^>>./.depend;
clean:
$(RM) $(OBJS)
distclean: clean
$(RM) *~ .depend
include .depend
লক্ষ্য করুন
- সোর্স ফাইলগুলির জন্য আর কোনও নির্ভরতা লাইন নেই!!!
- । নির্ভর ও নির্ভর সম্পর্কিত কিছু অদ্ভুত যাদু আছে
- যদি আপনি তা করেন
makeতবে ls -Aআপনি .dependএমন একটি ফাইল দেখবেন যার মধ্যে এমন জিনিস রয়েছে যা দেখতে নির্ভরতা রেখাগুলি তৈরি করে
অন্যান্য পঠন
বাগ এবং orতিহাসিক নোটগুলি জানুন
মেকের জন্য ইনপুট ভাষাটি হোয়াইটস্পেস সংবেদনশীল। বিশেষত, নির্ভরতা অনুসরণের ক্রিয়া লাইনগুলি অবশ্যই একটি ট্যাব দিয়ে শুরু করা উচিত । তবে শূন্যস্থানগুলির একটি সিরিজ একই দেখতে পারে (এবং প্রকৃতপক্ষে এমন সম্পাদক রয়েছে যা নিঃশব্দে ট্যাবগুলিকে স্পেসে বা তদ্বিপরীত রূপান্তরিত করবে) যার ফলস্বরূপ একটি মেক ফাইল তৈরি হয় যা সঠিক দেখায় এবং এখনও কাজ করে না। এটি প্রথম দিকে বাগ হিসাবে চিহ্নিত করা হয়েছিল, তবে ( গল্পটি যায় ) এটি ঠিক করা হয়নি, কারণ ইতিমধ্যে 10 জন ব্যবহারকারী ছিলেন।
(আমি পদার্থ বিজ্ঞানের স্নাতক শিক্ষার্থীদের জন্য লিখেছি এমন একটি উইকি পোস্ট থেকে এটি অনুলিপি করা হয়েছিল))