কয়েক মাস আগে, আমি Makefile
স্কুল কাজের জন্য নিম্নলিখিত জেনেরিক নিয়ে এসেছি :
# ------------------------------------------------
# Generic Makefile
#
# Author: yanick.rochon@gmail.com
# Date : 2010-11-05
#
# Changelog :
# 0.01 - first version
# ------------------------------------------------
# project name (generate executable with this name)
TARGET = projectname
CC = gcc -std=c99 -c
# compiling flags here
CFLAGS = -Wall -I.
LINKER = gcc -o
# linking flags here
LFLAGS = -Wall
SOURCES := $(wildcard *.c)
INCLUDES := $(wildcard *.h)
OBJECTS := $(SOURCES:.c=*.o)
rm = rm -f
$(TARGET): obj
@$(LINKER) $(TARGET) $(LFLAGS) $(OBJECTS)
@echo "Linking complete!"
obj: $(SOURCES) $(INCLUDES)
@$(CC) $(CFLAGS) $(SOURCES)
@echo "Compilation complete!"
clean:
@$(rm) $(TARGET) $(OBJECTS)
@echo "Cleanup complete!"
এটি মূলত প্রতিটি .c
এবং .h
ফাইলকে একই ফোল্ডারে .o
ফাইল এবং এক্সিকিউটেবল projectname
সব উত্পন্ন করতে সংকলন করবে ।
এখন, আমি এটাকে একটু চাপ দিতে চাই। নিম্নলিখিত ডিরেক্টরি কাঠামোর সাথে একটি সি প্রকল্প সংকলন করতে আমি কীভাবে একটি মেকফিল লিখতে পারি?
./
./Makefile
./src/*.c;*.h
./obj/*.o
./bin/<executable>
অন্য কথায়, আমি একটি মেকফিল রাখতে চাই যা সি সূত্রগুলি থেকে সংকলন ./src/
করে ./obj/
এবং তারপরে এক্সিকিউটেবলটি তৈরি করতে সমস্ত কিছু লিঙ্ক করে ./bin/
।
আমি বিভিন্ন মেকফিলগুলি পড়ার চেষ্টা করেছি, তবে আমি কেবল তাদের উপরের প্রকল্প কাঠামোর জন্য কাজ করতে পারি না; পরিবর্তে, প্রকল্পটি ত্রুটিগুলির সকল প্রকারের সাথে সংকলন করতে ব্যর্থ। অবশ্যই, আমি পূর্ণ ব্লোড আইডিই (মনোডাভলভ, অঞ্জুতা, ইত্যাদি) ব্যবহার করতে পারি, তবে আমি সত্যিই জিইডিট এবং ভাল ওল 'টার্মিনালটি দিয়ে থাকতে পছন্দ করি।
এমন কোনও গুরু আছেন যিনি আমাকে একটি কার্যনির্বাহী সমাধান দিতে পারেন, বা কীভাবে এটি করা যায় সে সম্পর্কে পরিষ্কার তথ্য দিতে পারেন? ধন্যবাদ!
** আপডেট (ভি 4) **
চূড়ান্ত সমাধান:
# ------------------------------------------------
# Generic Makefile
#
# Author: yanick.rochon@gmail.com
# Date : 2011-08-10
#
# Changelog :
# 2010-11-05 - first version
# 2011-08-10 - added structure : sources, objects, binaries
# thanks to http://stackoverflow.com/users/128940/beta
# 2017-04-24 - changed order of linker params
# ------------------------------------------------
# project name (generate executable with this name)
TARGET = projectname
CC = gcc
# compiling flags here
CFLAGS = -std=c99 -Wall -I.
LINKER = gcc
# linking flags here
LFLAGS = -Wall -I. -lm
# change these to proper directories where each file should be
SRCDIR = src
OBJDIR = obj
BINDIR = bin
SOURCES := $(wildcard $(SRCDIR)/*.c)
INCLUDES := $(wildcard $(SRCDIR)/*.h)
OBJECTS := $(SOURCES:$(SRCDIR)/%.c=$(OBJDIR)/%.o)
rm = rm -f
$(BINDIR)/$(TARGET): $(OBJECTS)
@$(LINKER) $(OBJECTS) $(LFLAGS) -o $@
@echo "Linking complete!"
$(OBJECTS): $(OBJDIR)/%.o : $(SRCDIR)/%.c
@$(CC) $(CFLAGS) -c $< -o $@
@echo "Compiled "$<" successfully!"
.PHONY: clean
clean:
@$(rm) $(OBJECTS)
@echo "Cleanup complete!"
.PHONY: remove
remove: clean
@$(rm) $(BINDIR)/$(TARGET)
@echo "Executable removed!"