makefile雛形

ディレクトリ構成は以下のとおりとする
/home/user/workspace/hoge
├ src
│ ├ test01.c
│ ├ test02.c
│ └ test_common.h
└ Debug
   ├ makefile
   ├ conf.mk
   └ src

gcov/lcov対応版


makefileは以下のような感じ
#-------------------------------------------------------------------------------
# makefile
#-------------------------------------------------------------------------------

# configuration file
-include conf.mk

# Output object files
$$(HOGE_DIR)/Debug/src/%.o: $$(HOGE_DIR)/src/%.c
	@echo 'Building file: $<'
	@echo 'Invoking: GCC C Compiler'
	$(CC) $(INCPATH) -O0 $(DBGOP) -Wall $(CFLAGS) $(COVERAGE) -c -fmessage-length=0 -MMD -MP -MF"$(@:%.o=%.d)" -MT"$(@:%.o=%.d)" -o"$@" "$<"
	@echo 'Finished building: $<'
	@echo ' '

# All Target
all: hoge

# Tool invocations
hoge: $(OBJS) $(USER_OBJS)
	@echo 'Building target: $@'
	@echo 'Invoking: GCC C Linker'
	$(CC) $(LIBPATH) -o"hoge" $(OBJS) $(USER_OBJS) $(LIBS)
	@echo 'Finished building target: $@'
	@echo ' '

# Other Targets
clean:
	-$(RM) $(OBJS)$(C_DEPS)$(LIBRARIES) hoge $(DB_OBJS)$(DB_C_DEPS) $(TEST_OBJS)$(TEST_C_DEPS)
	-$(RM) $(HOGE_DIR)/Debug/hoge.info
	-$(RM) $(HOGE_DIR)/Debug/lcov_hoge_html
	-$(RM) $(HOGE_DIR)/Debug/*.gcov
	-$(RM) $(HOGE_DIR)/Debug/src/*.g*
	-@echo ' '

coverage:
	@echo 'coverage report'
	$(GCOV) ./src/*.gcda -o ./src
	$(LCOV) . -o hoge.info
	$(RM) ./lcov_hoge_html
	$(GENHTML) -o lcov_hoge_html hoge.info
	@echo 'Finished making coverage report'
	@echo ' '

.PHONY: all clean dependents
.SECONDARY:


conf.mkは以下のような感じ
#-------------------------------------------------------------------------------
# conf.mk
#-------------------------------------------------------------------------------

# Macro definition
RM := rm -rf
GCOV := gcov
LCOV := lcov -c -d
GENHTML := genhtml

HOGE_DIR= /home/user/workspace/hoge

# BUILD_TYPE Setting (0:release 1:debug)
ifndef BUILD_TYPE
    BUILD_TYPE = 1
else
    BUILD_TYPE = 0
endif

ifeq ($(BUILD_TYPE),0)
    DBGOP =
    LIBTYPE = release
    CFLAGS += \
else
    DBGOP = -g3
    LIBTYPE = debug
    CFLAGS += \

endif

# BUILD_TARGET Setting
ifndef BUILD_TARGET
    BUILD_TARGET = 1
else
    BUILD_TARGET = 0
endif

ifeq ($(BUILD_TARGET),0)
    TARGET = target
    CC = gcc
else
    TARGET = host
    CC = gcc
endif

# COVERAGE Setting
ifdef COVERAGE_ENABLE
    COVERAGE_ENABLE = 1
else
    COVERAGE_ENABLE = 0
endif

ifeq ($(COVERAGE_ENABLE),1)
    COVERAGE = -coverage
else
    COVERAGE =
endif

INCPATH = \
    -I"../../include" \

LIBPATH = \
    -L"../../lib/$(TARGET)/$(LIBTYPE)" \

# Add inputs and outputs to the build variables
OBJS += \
    $(HOGE_DIR)/Debug/src/test01.o \
    $(HOGE_DIR)/Debug/src/test02.o \

C_DEPS += \
    $(HOGE_DIR)/Debug/src/test01.d \
    $(HOGE_DIR)/Debug/src/test02.d \

#Link library
LIBS := \
    -lutil lpthread


makefile作成時の注意点(当たり前ですね。。。)
export MACRO=・・・    :多段makeなどでその他のmakefile内にも影響を及ぼす
MACRO=・・・           :当該makefile内でのみ有効
最終更新:2010年08月06日 15:06