pxkw.hatenadiary.com

めもめも

-mxxと-Oxをターゲットに指定したいときのMakefile

32/64bitと最適化オプションをターゲットにmakeするときのMakefile.
こんな感じで良いのかなぁ.泥臭いな.

Makefile

DIR_SRC=./src
DIR_HDR=./include
DIR_BIN=.

m32o0suf = m32o0
m32o1suf = m32o1
m32o2suf = m32o2
m64o0suf = m64o0
m64o1suf = m64o1
m64o2suf = m64o2

INCLUDES = -I${DIR_HDR}
CFLAGS_m32o0 = -m32 -O0 -g 
CFLAGS_m32o1 = -m32 -O1 
CFLAGS_m32o2 = -m32 -O2 
CFLAGS_m64o0 = -m64 -O0 -g 
CFLAGS_m64o1 = -m64 -O1 
CFLAGS_m64o2 = -m64 -O2 

BIN_m32o0 = ${DIR_BIN}/bin.${m32o0suf}
BIN_m32o1 = ${DIR_BIN}/bin.${m32o1suf}
BIN_m32o2 = ${DIR_BIN}/bin.${m32o2suf}
BIN_m64o0 = ${DIR_BIN}/bin.${m64o0suf}
BIN_m64o1 = ${DIR_BIN}/bin.${m64o1suf}
BIN_m64o2 = ${DIR_BIN}/bin.${m64o2suf}

HDR = ${DIR_HDR}/header.h
SRC = ${DIR_SRC}/src.c
OBJ_m32o0 = ${DIR_SRC}/src.${m32o0suf}
OBJ_m32o1 = ${DIR_SRC}/src.${m32o1suf}
OBJ_m32o2 = ${DIR_SRC}/src.${m32o2suf}
OBJ_m64o0 = ${DIR_SRC}/src.${m64o0suf}
OBJ_m64o1 = ${DIR_SRC}/src.${m64o1suf}
OBJ_m64o2 = ${DIR_SRC}/src.${m64o2suf}

ALL_OBJ = \
    ${OBJ_m32o0} ${OBJ_m32o1} ${OBJ_m32o2} \
    ${OBJ_m64o0} ${OBJ_m64o1} ${OBJ_m64o2} 

.SUFFIXES: .c .${m32o0suf} .${m32o1suf} .${m32o2suf} .${m64o0suf} .${m64o1suf} .${m64o2suf}
.c.${m32o0suf}:
	gcc ${INCLUDES} ${CFLAGS_m32o0} -c -o $@ $<
.c.${m32o1suf}:
	gcc ${INCLUDES} ${CFLAGS_m32o1} -c -o $@ $<
.c.${m32o2suf}:
	gcc ${INCLUDES} ${CFLAGS_m32o2} -c -o $@ $<
.c.${m64o0suf}:
	gcc ${INCLUDES} ${CFLAGS_m64o0} -c -o $@ $<
.c.${m64o1suf}:
	gcc ${INCLUDES} ${CFLAGS_m64o1} -c -o $@ $<
.c.${m64o2suf}:
	gcc ${INCLUDES} ${CFLAGS_m64o2} -c -o $@ $<
${OBJ_m32o0}: ${SRC} ${HDR}
${OBJ_m32o0}: ${SRC} ${HDR}
${OBJ_m32o0}: ${SRC} ${HDR}
${OBJ_m64o0}: ${SRC} ${HDR}
${OBJ_m64o1}: ${SRC} ${HDR}
${OBJ_m64o2}: ${SRC} ${HDR}
${m32o0suf}:${OBJ_m32o0}
	gcc ${INCLUDES} $^ ${CFLAGS_m32o0} -o ${BIN_m32o0}
${m32o1suf}:${OBJ_m32o1}
	gcc ${INCLUDES} $^ ${CFLAGS_m32o1} -o ${BIN_m32o1}
${m32o2suf}:${OBJ_m32o2}
	gcc ${INCLUDES} $^ ${CFLAGS_m32o2} -o ${BIN_m32o2}
${m64o0suf}:${OBJ_m64o0}
	gcc ${INCLUDES} $^ ${CFLAGS_m64o0} -o ${BIN_m64o0}
${m64o1suf}:${OBJ_m64o1}
	gcc ${INCLUDES} $^ ${CFLAGS_m64o1} -o ${BIN_m64o1}
${m64o2suf}:${OBJ_m64o2}
	gcc ${INCLUDES} $^ ${CFLAGS_m64o2} -o ${BIN_m64o2}
clean:
	rm -rf ${ALL_OBJ}

めいくする

$ make m32o1
gcc -I./include -m32 -O1  -c -o src/src.m32o1 src/src.c
gcc -I./include src/src.m32o1 -m32 -O1  -o ./bin.m32o0

かくにんする

$ file bin.m32o1
bin.m32o1: ELF 32-bit LSB executable, Intel 80386, version 1 (SYSV), dynamically linked (uses shared libs), for GNU/Linux 2.6.24, BuildID[sha1]=0xhogehoge, not stripped

  1. 上記はUbuntu 13.04 64bitでうごかしてます.
  2. 64bit環境で32bitコンパイルするときは,libc6-dev-i386パッケージが必要みたい.