Skip to content

Make:Example

Makefile관련 예제 모음.

Simple Example

간단한 변수를 사용하여 .o 파일과 .exe 파일을 출력하는 makefile 예제.

#!/bin/make

CXX=g++
CXXFLAGS=

ROOT_DIR=..
BIN_DIR=$(ROOT_DIR)/bin
OBJ_DIR=$(ROOT_DIR)/obj
SRC_DIR=$(ROOT_DIR)/src
SRC_ENTRY_DIR=$(SRC_DIR)/entry

VPATH=:$(SRC_DIR):$(SRC_ENTRY_DIR):$(OBJ_DIR)

console-test.exe: console-test.o
    $(CXX) $(CXXFLAGS) -o $(BIN_DIR)/$@ $^

console-test.o: console-test.cpp
    $(CXX) $(CXXFLAGS) -c -o $(OBJ_DIR)/$@ $^

Default Makefile

기본 형태의 Makefile은 아래와 같다.

#.SUFFIXES: .cpp .o

CXX=g++
EXE_EXT=.out
OBJ_EXT=.o
TARGET=a${EXE_EXT}
FILES=main test01
OBJS=${FILES:=${OBJ_EXT}}
FLAGS=-Wall -std=c++11
DEBUG=-g
LIBS=pthread
LIBS_FLAGS=${addsuffix ${LIBS},-l}

DEBUG_TARGET=${TARGET:${EXE_EXT}=${DEBUG}${EXE_EXT}}
DEBUG_OBJS=${OBJS:${OBJ_EXT}=${DEBUG}${OBJ_EXT}}

.PONEY=all clean release debug

all: release debug

release: ${TARGET}

debug: ${DEBUG_TARGET}

${TARGET}: ${OBJS}
    ${CXX} ${FLAGS} ${LIBS_FLAGS} -o $@ $^

${DEBUG_TARGET}: ${DEBUG_OBJS}
    ${CXX} ${FLAGS} ${DEBUG} ${LIBS_FLAGS} -o $@ $^

clean:
    rm -rf ${TARGET} ${DEBUG_TARGET} ${OBJS} ${DEBUG_OBJS}

%.o: %.cpp
    ${CXX} ${FLAGS} -o $@ -c $^

%-g.o: %.cpp
    ${CXX} ${FLAGS} ${DEBUG} -o $@ -c $^

NVCC Example

NVCC를 사용한 컴파일 방법은 아래와 같다.

DBG_FLAG=-g
OBJ_EXT=.o
LIB_EXT=.a
LIB_PREFIX=lib

NAME=firegpu

TARGET=$(addprefix $(LIB_PREFIX),$(addsuffix $(LIB_EXT),$(NAME)))
DBG_TARGET=$(TARGET:$(LIB_EXT)=$(DBG_FLAG)$(LIB_EXT))

OBJ_PREFIX=src/firegpu/
OBJ_NAMES=firegpu

OBJS=$(addprefix $(OBJ_PREFIX),$(addsuffix $(OBJ_EXT),$(OBJ_NAMES)))
DBG_OBJS=$(OBJS:$(OBJ_EXT)=$(DBG_FLAG)$(OBJ_EXT))

NVCC=nvcc
NVCC_C_FLAGS=-D__CUDA__
NVCC_LINK_FLAGS=-lib

REL_C_FLAGS=-DRELEASE -DNDEBUG -O2
DBG_C_FLAGS=-DDEBUG $(DBG_FLAG)


.PHONY: all clean release debug

all: release debug

release: $(TARGET)

debug: $(DBG_TARGET)

clean:
    rm -rf $(OBJS) $(DBG_OBJS) $(TARGET) $(DBG_TARGET)


$(TARGET): $(OBJS)
    $(NVCC) $(NVCC_LINK_FLAGS) -o $@ $^

$(DBG_TARGET): $(DBG_OBJS)
    $(NVCC) $(NVCC_LINK_FLAGS) -o $@ $^

%-g.o: %.cu
    $(NVCC) $(NVCC_C_FLAGS) $(DBG_C_FLAGS) -o $@ -c $^

%.o: %.cu
    $(NVCC) $(NVCC_C_FLAGS) $(REL_C_FLAGS) -o $@ -c $^

OS detecting

ifeq ($(OS),Windows_NT)
    OS_detected := Windows
else
    OS_detected := $(shell uname -s)
endif

See also