[t:/]$ 지식_

Makefile 뚝딱뚝딱 만들기

2013/10/31

autogen, configuration, cmake를 살짝 경험해보았으나.

  1. 어렵다.
  2. 귀찮다.

그래서 그냥 뚝딱뚝딱 만들어 쓴다. 그런데 맨땅에서 만들려면 대략 정신이 멍해진다.

일단 적당한 쉘 스크립트로 프로젝트를 설정하도록 한다.

이제 Makefile 은 이렇게 시작한다.

include config.mk

중요한 것은 다음 구조다.

Makefile 귀찮타고 초장에 대충 만들어 놓아서 매번 풀빌 하는 사람들 꽤 많다. 찜찜하니 풀빌... 이거 안 좋다.

vpath%.c $(SRC_DIR)
vpath%.o $(ODIR)

all: $(OBJ_FILES)
$(CC) -o $(BDIR)/main $(addprefix $(ODIR)/, $(OBJ_FILES)) $(DEFINES) $(CFLAGS) $(LDFLAGS) $(INC) $(LIBS)

.SUFFIXES: .c.o

.c.o:
$(CC) -c -o $(ODIR)/$@ $< $(DEFINES) $(CFLAGS) $(INC)

clean:

rm -rf $(addprefix $(ODIR)/, $(OBJ_FILES))
rm -rf $(BDIR)/main

가능한 최대한 많은 에러를 내는 gcc 아규먼트를 만들어보자.

CFLAGS+= -O2 -fno-omit-frame-pointer -fno-optimize-sibling-calls -fno-strict-aliasing -fsigned-char -fstrict-overflow
CFLAGS+= -Wall -Wcast-qual -Wextra -Wno-unused-parameter -Wshadow -Wwrite-strings
CFLAGS+= -Wno-ignored-qualifiers -Wno-array-bounds -Wno-empty-body -fno-common
CFLAGS+= -Werror

여기저기서 줏어다 짜깁기한 녀석이다. 얘는 표준 헤더부터 워닝 걸린다. -_-;;

일단 내 코드의 안정성을 어느정도 검증 해볼 수 있다. 크로스컴파일러 패쓰를 export를 하고, LD_LIBRARY_PATH도 잡는다. inc, lib 를 맞는 플랫폼에 맞게 심볼릭 링크를 생성해주도록 한다. config.mk 도 플랫폼에 맞게 생성해준다.

요즘 내가 쓰는 Makefile

CC = gcc -O2 -g -DREENTRANT -I /app/hdfs/include -L /app/hdfs/lib/native -L /app/jdk1.7.0_45/jre/lib/amd64/server

RECO_SRC = $(wildcard *.c)
DEBUG = -DDEBUG -DDEBUG_INFO -DDEBUG_DEBUG -Wall
LIBS = -lm -lpthread -lhdfs -ljvm
#LIBS = -lm -lpthread
#LIBS = -lm -lpthread -ljemalloc
#LIBS = -lm -lpthread -ldmalloc

all: $(RECO_SRC)
    $(CC) -o reco_test $(RECO_SRC) $(DEBUG) $(LIBS)
    cp reco_test ../

.SUFFIXES: .c.o

.c.o:
    $(CC) -c -o $@ $< $(DEBUG) $(LIBS)

clean :
    find ./ -name "*.*o" -exec rm -f {} +
    rm -f reco_test

끗.









[t:/] is not "technology - root". dawnsea, rss