一、介绍
当某个功能作为可选项编译时,实现方式一般可以用kbuild或者修改makefile,这里介绍makefile方式
二、原理
利用-D选项
工程目录结构
├── Config.mak
├── Makefile
│ ├── app
│ ├── Makefile
│ ├── main.c
│ ├── ...
│ └── module
│ ├── Makefile
│ ├── ...
│ └── testmodule1
│ ├── Makefile
│ ├── ...
...
1、Config.mak填写编译工具、条件编译的信息
## Make tools
ARM_TOOLS_PATH = arm-linux-
CC = $(ARM_TOOLS_PATH)gcc
AS = $(ARM_TOOLS_PATH)as
LD = $(ARM_TOOLS_PATH)ld
AR = $(ARM_TOOLS_PATH)ar
MAKE = make
## Make support config module
SUPPORT_TESTMODULE1 = y
...
#add define to src
...
ifeq ($(SUPPORT_TESTMODULE1 ),y)
CFLAGS_BASE += -DTEST_FUNC_ENABLE
endif
...
2、修改module/Makefile作为条件编译
include ./../Config.mak
...
TEST_MODULE1_PATH = ./testmodule1/
...
...
.PHONY:testmodule1
testmodule1:
ifeq ($(SUPPORT_TESTMODULE1 ),y)#modify by huangjun date:20221018
$(MAKE) all -C $(TEST_MODULE1_PATH)
endif
...
3、修改app/Makefile作为条件链接
include ./../Config.mak
VXBASE_PATH = ./..
LIB_PATH = $(VXBASE_PATH)/module
...
CFLAGS += $(CFLAGS_BASE)
...
ifeq ($(SUPPORT_TESTMODULE1 ),y)
MODULE += $(LIB_PATH)/libtestmodule1.a
endif
...
4、修改main.c调用函数的地方条件编译
...
int main()
{
...
#ifdef TEST_FUNC_ENABLE
#pragma message("\n\nmodule1 function enable\n\n")
module1_Entry();
#else
#warning module1 function close
#pragma message("\n\nbusiness function close\n\n")
#endif
...
}
5、开关的使用
SUPPORT_TESTMODULE1 = y的时候就会编译功能testmodule1
SUPPORT_TESTMODULE1 = 为其他值的时候就不会编译功能testmodule1