আকর্ষণীয়, আমি জানতাম না যে উত্স ফাইলগুলি সম্পর্কিত সি সংকলক প্রদত্ত নিয়মগুলি ব্যবহার করে মেকটি ডিফল্ট হবে।
যাইহোক, একটি সাধারণ সমাধান যা সাধারণ মেকফিল ধারণাগুলি প্রদর্শিত করে:
HEADERS = program.h headers.h
default: program
program.o: program.c $(HEADERS)
gcc -c program.c -o program.o
program: program.o
gcc program.o -o program
clean:
-rm -f program.o
-rm -f program
(মনে রাখবেন যে স্পেস ইনডেন্টেশনের পরিবর্তে ট্যাবটি তৈরি করা দরকার, তাই অনুলিপি করার সময় এটি ঠিক করতে ভুলবেন না)
তবে, আরও সি ফাইলগুলিকে সমর্থন করতে আপনাকে তাদের প্রত্যেকের জন্য নতুন নিয়ম তৈরি করতে হবে। সুতরাং, উন্নতি করতে:
HEADERS = program.h headers.h
OBJECTS = program.o
default: program
%.o: %.c $(HEADERS)
gcc -c $< -o $@
program: $(OBJECTS)
gcc $(OBJECTS) -o $@
clean:
-rm -f $(OBJECTS)
-rm -f program
আমি সাধারণত মেকফিলগুলিতে দেখা যায় এমন $ (সিসি) এবং $ (সিএফএলএজিএস) এর মতো ভেরিয়েবলগুলি বাদ দিয়ে এটিকে যথাসম্ভব সহজ করার চেষ্টা করেছি। যদি আপনি এটি সন্ধান করতে আগ্রহী হন তবে আমি আশা করি যে আমি আপনাকে এটির একটি ভাল সূচনা দিয়েছি।
সি উত্সের জন্য আমি মেকফাইলটি ব্যবহার করতে চাই। এটি বিনামূল্যে নির্দ্বিধায়:
TARGET = prog
LIBS = -lm
CC = gcc
CFLAGS = -g -Wall
.PHONY: default all clean
default: $(TARGET)
all: default
OBJECTS = $(patsubst %.c, %.o, $(wildcard *.c))
HEADERS = $(wildcard *.h)
%.o: %.c $(HEADERS)
$(CC) $(CFLAGS) -c $< -o $@
.PRECIOUS: $(TARGET) $(OBJECTS)
$(TARGET): $(OBJECTS)
$(CC) $(OBJECTS) -Wall $(LIBS) -o $@
clean:
-rm -f *.o
-rm -f $(TARGET)
বর্তমান ডিরেক্টরিতে স্বয়ংক্রিয়ভাবে .c এবং .h ফাইলগুলি অন্তর্ভুক্ত করার জন্য এটি মেক ইউটিলিটির ওয়াইল্ডকার্ড এবং প্যাটসবস্ট বৈশিষ্ট্যগুলি ব্যবহার করে, এর অর্থ যখন আপনি যখন আপনার ডিরেক্টরিতে নতুন কোড ফাইল যুক্ত করবেন তখন আপনাকে মেকফাইল আপডেট করতে হবে না। তবে, আপনি যদি উত্পাদিত এক্সিকিউটেবল, লাইব্রেরি বা সংকলক পতাকাগুলির নাম পরিবর্তন করতে চান তবে আপনি কেবল ভেরিয়েবলগুলি পরিবর্তন করতে পারেন।
উভয় ক্ষেত্রে, অটোকনফ ব্যবহার করবেন না, দয়া করে। আমি তোমাকে চাচ্ছি! :)