autogen, configuration, cmake를 살짝 경험해보았으나.
그래서 그냥 뚝딱뚝딱 만들어 쓴다. 그런데 맨땅에서 만들려면 대략 정신이 멍해진다.
일단 적당한 쉘 스크립트로 프로젝트를 설정하도록 한다.
이제 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
끗.