28 Eylül 2017 Perşembe

Minimal makefile

Örnek
Şöyle. Bu örnekte .o dosyaları kaynak kod ile aynı yerde oluşuyor.
CPP = g++
CPPFLAGS = ...
sources = $(wildcard ../*.cpp)
objects = $(sources : ../%.cpp = %.o)

%.o : ../%.cpp
  $(CPP) -c $(CPPFLAGS) $<

all : $(objects)
 ar -rcv libmylib.a $(objects)

Örnek
Şöyle. Bu örnekte .o dosyaları kaynak kod ile aynı yerde değil.
BUILDDIR:=build
sources:=$(wildcard *.c)
objects:=$(addprefix $(BUILDDIR)/, $(patsubst %.c, %.o, $(sources)))

$(BUILDDIR)/%.o: %.c
    gcc -c $^ -o $@

all: $(objects)
Örnek
Şöyledir. Kaynak kodlar elle belirtiliyor. Bu örnekte .PHONY tanımlamak aslında gerekli değil, çünkü aynı diznde clean, fclean, re gibi dosyaların olması zaten mümkün değil.
NAME    = main

CC      = gcc -g

RM      = rm -f

SRCS    = functions.c    \
          main.c

OBJS    = $(SRCS:.c=.o)

CFLAGS = -I ./include/
CFLAGS += -W -Wall -Wextra

all: $(NAME)

$(NAME): $(OBJS)
         @$(CC) $(OBJS) -o $(NAME) $(LDFLAGS)
         @printf "\n[$(GREEN)OK$(WHITE)] Binary : $(NAME)\n"
         @echo "-------------------\n"

%.o :    %.c
         @$(CC) $(CFLAGS) -c -o $@ $<
         @printf "[$(GREEN)OK$(WHITE)] $<\n"

clean:
        $(RM) $(OBJS)

fclean: clean
    $(RM) $(NAME)

re: fclean all

.PHONY: all clean fclean re
Pattern Kuralı
Genelde şöyle bir şeydir.
.c dosyası varsa .o dosyasını üretmek için çalıştırılacak kuralı belirtir.
%.o: %.c
.cpp dosyası varsa .o dosyasını üretmek için çalıştırılacak kuralı belirtir.
# To get *any* .o file, compile its .cpp file with the following rule.
%.o: %.cpp
    $(CXX) $(FLAGS) $(CXXFLAGS) -c $<
Bazen şöyle de yazılabiliyor.
.y dosyası varsa .c dosyası üretmek için çalıştırılacak kuralı belirtir.
.y.c:
    ${BISON} -d -o $@ $< 

$@ işareti
Current target anlamına gelir. makefile çalışırken o anki işletin target ismidir. Şöyle yaparız.
CC=g++
CFLAGS=-c -Wall -g -std=c++11
LDFLAGS=
SOURCES=lab5.cpp Card.cpp Deck.cpp
OBJECTS=$(SOURCES:.cpp=.o)
EXECUTABLE=lab5

all: $(SOURCES) $(EXECUTABLE)

$(EXECUTABLE): $(OBJECTS)
    $(CC) $(LDFLAGS) $(OBJECTS) -o $@

.cpp.o:
    $(CC) $(CFLAGS) $< -o $@

clean:
    rm -f *.o $(EXECUTABLE)





Hiç yorum yok:

Yorum Gönder