【makefile】02 经典应用示例

经典应用示例

1. 文件结构:

.
├── common
│   └── common.h
├── dir1
│   ├── a1.c
│   ├── a1.h
│   ├── b1.c
│   ├── b1.h
│   ├── c1.c
│   ├── c1.h
│   └── dir1.mk
├── dir2
│   ├── a2.c
│   ├── a2.h
│   ├── b2.c
│   ├── b2.h
│   ├── c2.c
│   ├── c2.h
│   └── dir2.mk
├── dir3
│   ├── a3.c
│   ├── a3.h
│   ├── b3.c
│   ├── b3.h
│   ├── c3.c
│   ├── c3.h
│   └── dir3.mk
├── LICENSE
├── makefile
├── README.md
└── sys-make
    ├── config
    │   ├── build.config
    │   └── version.config
    ├── gcc.mk
    ├── rules.mk
    └── tools.mk

6 directories, 30 files

 

2. makefile文件:

a. dir1.mk

# Sub-folder makefile
#
#    @File:      dir1.mk
#    @Author:    How.Chen
#    @History:
#    VER        DATE            Change
#    1.0        27/May/2017        init version
#    1.1        12/Oct/2020        update suffix

# define module name for compile use
MODULE = dir1

# define expected lib
MOD_LIB = $(LIB_PREFIX)$(MODULE).$(LIB_SUFFIX)


CC_DEFS :=
# modify sys-make/config/build.config to control 
ifeq '$(filter FEATURE_1, $(FEATURE))' 'FEATURE_1'
    CC_DEFS += dir1_DEF_1
    CC_DEFS += dir1_DEF_2
    CC_DEFS += dir1_DEF_3
endif

# add srouce files, which would like to compile
SRC_FILES =
SRC_FILES += a1.c
SRC_FILES += b1.c
# modify sys-make/config/build.config to control 
ifeq '$(filter FEATURE_1, $(FEATURE))' 'FEATURE_1'
    SRC_FILES += c1.c
endif

# add include search path
INC_PATH =
INC_PATH += $(TOP_DIR)/common

# add source file search path together with vpath
SRC_PATH =
SRC_PATH += $(TOP_DIR)/$(MODULE)
SRC_PATH += $(TOP_DIR)/$(MODULE)/sub_dir1

vpath %.c $(SRC_PATH)

# use general tools setting, compiler and compile rules
include $(MKFILE_DIR)/tools.mk
include $(MKFILE_DIR)/gcc.mk
include $(MKFILE_DIR)/rules.mk

 

b. dir2.mk

MODULE = dir2

MOD_LIB = $(LIB_PREFIX)$(MODULE).$(LIB_SUFFIX)

CC_DEFS :=
ifeq '$(filter FEATURE_2, $(FEATURE))' 'FEATURE_2'
    CC_DEFS += dir2_DEF_1
    CC_DEFS += dir2_DEF_2
    CC_DEFS += dir2_DEF_3
endif

SRC_FILES =
SRC_FILES += a2.c
SRC_FILES += b2.c
SRC_FILES += c2.c

INC_PATH =
INC_PATH += $(TOP_DIR)/common

SRC_PATH =
SRC_PATH += $(TOP_DIR)/$(MODULE)
SRC_PATH += $(TOP_DIR)/$(MODULE)/sub_dir2

vpath %.c $(SRC_PATH)

include $(MKFILE_DIR)/tools.mk
include $(MKFILE_DIR)/gcc.mk
include $(MKFILE_DIR)/rules.mk

 

c. dir3.mk

MODULE = dir3

MOD_LIB = $(LIB_PREFIX)$(MODULE).$(LIB_SUFFIX)

CC_DEFS :=
ifeq '$(filter FEATURE_3, $(FEATURE))' 'FEATURE_3'
    CC_DEFS += dir3_DEF_1
    CC_DEFS += dir3_DEF_2
    CC_DEFS += dir3_DEF_3
endif

SRC_FILES =
SRC_FILES += a3.c
SRC_FILES += b3.c
SRC_FILES += c3.c

INC_PATH =
INC_PATH += $(TOP_DIR)/common

SRC_PATH =
SRC_PATH += $(TOP_DIR)/$(MODULE)
SRC_PATH += $(TOP_DIR)/$(MODULE)/sub_dir3

vpath %.c $(SRC_PATH)

include $(MKFILE_DIR)/tools.mk
include $(MKFILE_DIR)/gcc.mk
include $(MKFILE_DIR)/rules.mk

 

d. makefile

# main makefile
#
#    @File:      makefile
#    @Author:    How.Chen
#    @History:
#    VER        DATE            Change
#    1.0        27/Apr/2017        init commit
#    1.1        12/Oct/2020        change suffix name andadd tools.mk

# define useful directory path
TOP_DIR = $(PWD)
MKFILE_DIR = $(TOP_DIR)/sys-make
CFG_DIR = $(MKFILE_DIR)/config
OUTPUT_DIR = $(TOP_DIR)/output

# define useful prefix/postfix
LIB_PREFIX = lib
LIB_SUFFIX = a

# export var, which need be known by sub-makefile
export TOP_DIR MKFILE_DIR OUTPUT_DIR
export LIB_PREFIX LIB_SUFFIX

all: obj link

obj:
    @$(MAKE) -f $(TOP_DIR)/dir1/dir1.mk
    @$(MAKE) -f $(TOP_DIR)/dir2/dir2.mk
    @$(MAKE) -f $(TOP_DIR)/dir3/dir3.mk

# link workaround
# pass link to rules.mk to trigger link
link:
    @$(MAKE) -f $(MKFILE_DIR)/rules.mk link

# check
# to display each module build info
check:
    @$(MAKE) -f $(TOP_DIR)/dir1/dir1.mk check
    @$(MAKE) -f $(TOP_DIR)/dir2/dir2.mk check
    @$(MAKE) -f $(TOP_DIR)/dir3/dir3.mk check

# remove ouyput
clean:
    @$(MAKE) -f $(TOP_DIR)/dir1/dir1.mk clean
    @$(MAKE) -f $(TOP_DIR)/dir2/dir2.mk clean
    @$(MAKE) -f $(TOP_DIR)/dir3/dir3.mk clean
    -$(RM) -rf $(OUTPUT_DIR)

# include build configuration
# FEATURE define in it
include $(MKFILE_DIR)/tools.mk
include $(CFG_DIR)/build.config
include $(CFG_DIR)/version.config

 

3. 执行:

[root@centos8 makefile]# make
make[1]: Entering directory '/root/makefile'
CC: a1.c
CC: b1.c
CC: c1.c
Generate lib: libdir1.a
make[1]: Leaving directory '/root/makefile'
make[1]: Entering directory '/root/makefile'
CC: a2.c
CC: b2.c
CC: c2.c
Generate lib: libdir2.a
make[1]: Leaving directory '/root/makefile'
make[1]: Entering directory '/root/makefile'
CC: a3.c
CC: b3.c
CC: c3.c
Generate lib: libdir3.a
make[1]: Leaving directory '/root/makefile'
make[1]: Entering directory '/root/makefile'
Link executable: test_makefile_2021.42.3.23.02
full objs: /root/makefile/output/dir2/b2.o /root/makefile/output/dir2/a2.o /root/makefile/output/dir2/c2.o /root/makefile/output/dir3/b3.o /root/makefile/output/dir3/c3.o /root/makefile/output/dir3/a3.o /root/makefile/output/dir1/b1.o /root/makefile/output/dir1/a1.o /root/makefile/output/dir1/c1.o
make[1]: Leaving directory '/root/makefile'

 

参考资料

1. makefile【howhow】

2. 跟我一起学makefile

posted @ 2021-10-20 23:04  苏格拉底的落泪  阅读(107)  评论(0)    收藏  举报