# #makefile for build atbm_wifi.ko # ############################################################################### CUSTOMER_SUPPORT_USED_WIFI=y CUSTOMER_SUPPORT_USED_WIFI_BLE=y platform ?=PLATFORM_INGENIC_X1600EN ATBM_BUILD_IN_KERNEL?=y export ATBM_WIFI__EXT_CCFLAGS ?= -DATBM_WIFI_PLATFORM=31 ifeq ($(KERNELRELEASE),) export ATBM_BUILD_IN_KERNEL=n export DRIVER_PATH ?= $(shell pwd) ifeq ($(CUSTOMER_SUPPORT_USED_WIFI),y) MAKEFILE_SUB ?= Makefile.build.customer_wifi else MAKEFILE_SUB ?= Makefile.build endif ifeq ($(CUSTOMER_SUPPORT_USED_WIFI_BLE),y) MAKEFILE_SUB ?= Makefile.build.customer_wifi_ble else MAKEFILE_SUB ?= Makefile.build endif export DRIVER_PATH ?= $(shell pwd) ifeq ($(platform),PLATFORM_INGENIC_X1600EN) KERDIR:=/home1/fwang/XINYE/aaa/out/product/kunpeng.x1600_nand_5.10-eng/obj/kernel-intermediate CROSS_COMPILE:=/home1/fwang/XINYE/aaa/prebuilts/toolchains/mips-gcc-glibc/bin/mips-linux-gnu- ATBM_WIFI__EXT_CCFLAGS = -DATBM_WIFI_PLATFORM=31 arch = mips endif ifeq ($(platform),PLATFORM_INGENIC_X1600EN) all:install install: @echo "make PLATFORM_CROSS=$(platform)" $(MAKE) all -f $(MAKEFILE_SUB) ARCH=$(arch) CROSS_COMPILE=$(CROSS_COMPILE) KDIR=$(KERDIR) SYS=$(sys) PLAT=$(platform) -j8 clean: $(MAKE) -f $(MAKEFILE_SUB) KDIR=$(KERDIR) ARCH=$(arch) clean strip: $(MAKE) -f $(MAKEFILE_SUB) KDIR=$(KERDIR) ARCH=$(arch) SYS=$(sys) PLAT=$(platform) strip get_ver: $(MAKE) -f $(MAKEFILE_SUB) KDIR=$(KERDIR) ARCH=$(arch) SYS=$(sys) PLAT=$(platform) get_ver #ble_demo: # @echo "start ble ble_demo" # $(MAKE) ble_demo -f $(MAKEFILE_SUB) ARCH=$(arch) CROSS_COMPILE=$(CROSS_COMPILE) KDIR=$(KERDIR) SYS=$(sys) PLAT=$(platform) -j8 ble_stack: @echo "start ble host" $(MAKE) ble_stack -f $(MAKEFILE_SUB) ARCH=$(arch) CROSS_COMPILE=$(CROSS_COMPILE) KDIR=$(KERDIR) SYS=$(sys) PLAT=$(platform) -j8 ble_stack_clean: $(MAKE) ble_stack_clean -f $(MAKEFILE_SUB) ARCH=$(arch) CROSS_COMPILE=$(CROSS_COMPILE) KDIR=$(KERDIR) SYS=$(sys) PLAT=$(platform) -j8 ble_coex: $(MAKE) ble_coex -f $(MAKEFILE_SUB) ARCH=$(arch) CROSS_COMPILE=$(CROSS_COMPILE) KDIR=$(KERDIR) SYS=$(sys) PLAT=$(platform) -j8 buid_config: $(MAKE) -C atbm_kconf clean $(MAKE) -C atbm_kconf mconf -f Makefile menuconfig:buid_config @./atbm_kconf/mconf ./atbm_kconf/Kconfig endif else ifeq ($(ATBM_BUILD_IN_KERNEL),) $(warning "============>1") obj-m += hal_apollo/ export ATBM_BUILD_IN_KERNEL=y else ifeq ($(platform),PLATFORM_INGENIC_X1600EN) export ATBM_WIFI__EXT_CCFLAGS ?= -DATBM_WIFI_PLATFORM=31 endif export include $(src)/Makefile.build.kernel endif endif 以上是Makefile ############################################################################ # ATBM WiFi Product Select #CONFIG_ATBM601x: 1T1R 80211b/g/n, HT20 #if yout want to change .conf ,please do make menuconfig in current path ############################################################################ config-ble: \cp -f config-wifi .config @echo "############################copy wifi config################################" -include .config ############################################################################ # # The Follow Code Of The Makefile Should Not Be Changed # ############################################################################ PWD:=$(shell pwd) WIFI_INSTALL_DIR := $(PWD)/driver_install_wifi export WIFI_PROJ_DIR=$(PWD) ##################################################### ifeq ($(CONFIG_ATBM_MODULE_DRIVER_NAME),) CONFIG_ATBM_MODULE_DRIVER_NAME = "atbm_wlan" endif MODULES_NAME ?= "atbm613x_wifi_sdio" ################## BLE ############################### ifeq ($(CONFIG_ATBM_BLE_HOST_DRIVER),y) export CONFIG_ATBM_BLE_HOST_DRIVER=m endif all: get_ver modules install get_ver: @echo "**************************************" @echo "driver version" @cat hal_apollo/svn_version.h | awk '{print $3}' @echo "**************************************" modules:clean @echo "arch=$(ARCH)" $(MAKE) ARCH=$(ARCH) CROSS_COMPILE=$(CROSS_COMPILE) -C $(KDIR) M=$(shell pwd) modules -j8 # $(MAKE) -C $(KDIR) M=$(PWD) modules strip: $(CROSS_COMPILE)strip $(WIFI_INSTALL_DIR)/$(MODULES_NAME).ko --strip-unneeded install:modules mkdir -p $(WIFI_INSTALL_DIR) chmod 777 $(WIFI_INSTALL_DIR) cp hal_apollo/*.ko $(WIFI_INSTALL_DIR) ble_demo: @echo "CONFIG_ATBM_BLE_HOST_DRIVER=$(CONFIG_ATBM_BLE_HOST_DRIVER)" ifneq ($(BLEMODULE),) mkdir -p $(WIFI_INSTALL_DIR) # cp -f ble_host/tools/ble_smt_demo.c ble_smt_demo/ #$(MAKE) ble_demo -f ble_smt_demo/Makefile ARCH=$(ARCH) CROSS_COMPILE=$(CROSS_COMPILE) KDIR=$(KERDIR) SYS=$(sys) PLAT=$(platform) -j8 $(MAKE) tools_install -f ble_host/tools/Makefile ARCH=$(ARCH) CROSS_COMPILE=$(CROSS_COMPILE) KDIR=$(KERDIR) SYS=$(sys) PLAT=$(platform) -j8 #cp -f ble_host/tools/ble_smt $(WIFI_INSTALL_DIR) cp -f ble_host/tools/atbm_cli $(WIFI_INSTALL_DIR) cp -f ble_host/tools/atbm_tool $(WIFI_INSTALL_DIR) else @echo "not open CONFIG_ATBM_BLE_HOST_DRIVER configure!" endif ble_stack: ifneq ($(CONFIG_ATBM_BLE_WIFI_PLATFORM),) @echo "start ble host" mkdir -p $(WIFI_INSTALL_DIR) $(MAKE) ble_stack -f ble_host/Makefile ARCH=$(ARCH) CROSS_COMPILE=$(CROSS_COMPILE) KDIR=$(KERDIR) SYS=$(sys) PLAT=$(platform) -j8 $(MAKE) tools_install -f ble_host/tools/Makefile ARCH=$(ARCH) CROSS_COMPILE=$(CROSS_COMPILE) KDIR=$(KERDIR) SYS=$(sys) PLAT=$(platform) -j8 #cp -f ble_host/tools/ble_smt $(WIFI_INSTALL_DIR) cp -f ble_host/tools/atbm_cli $(WIFI_INSTALL_DIR) cp -f ble_host/tools/atbm_tool $(WIFI_INSTALL_DIR) else ifneq ($(CONFIG_ATBM_ONLY_BLE_WIFI_PLATFORM),) @echo "start ble host" mkdir -p $(WIFI_INSTALL_DIR) $(MAKE) ble_stack -f ble_host/Makefile ARCH=$(ARCH) CROSS_COMPILE=$(CROSS_COMPILE) KDIR=$(KERDIR) SYS=$(sys) PLAT=$(platform) -j8 $(MAKE) tools_install -f ble_host/tools/Makefile ARCH=$(ARCH) CROSS_COMPILE=$(CROSS_COMPILE) KDIR=$(KERDIR) SYS=$(sys) PLAT=$(platform) -j8 #cp -f ble_host/tools/ble_smt $(WIFI_INSTALL_DIR) cp -f ble_host/tools/atbm_cli $(WIFI_INSTALL_DIR) cp -f ble_host/tools/atbm_tool $(WIFI_INSTALL_DIR) endif endif ble_stack_clean: $(MAKE) ble_stack_clean -f ble_host/Makefile ARCH=$(ARCH) CROSS_COMPILE=$(CROSS_COMPILE) KDIR=$(KERDIR) SYS=$(sys) PLAT=$(platform) -j8 ble_coex: @echo "CONFIG_ATBM_BLE_ADV_COEXIST=$(CONFIG_ATBM_BLE_ADV_COEXIST)" ifneq ($(BLECOEXIST),) mkdir -p $(WIFI_INSTALL_DIR) $(MAKE) ble_coex -f ble_coexist_demo/Makefile ARCH=$(ARCH) CROSS_COMPILE=$(CROSS_COMPILE) KDIR=$(KERDIR) SYS=$(sys) PLAT=$(platform) -j8 cp -f ble_coexist_demo/ble_coex $(WIFI_INSTALL_DIR) else @echo "not open CONFIG_ATBM_BLE_ADV_COEXIST configure!" endif uninstall: # rm -f/wifihome/tftpboot/wuping/hmac/*.ko clean:hal_clean rm -rf hal_apollo/*.o rm -rf hal_apollo/*.ko rm -rf modules.* Module.* hal_clean: rm -rf hal_apollo/*.ko rm -rf hal_apollo/*.o rm -rf hal_apollo/*.mod.c rm -rf hal_apollo/*.cmd rm -rf hal_apollo/.*.cmd rm -rf hal_apollo/mac80211/*.cmd rm -rf hal_apollo/mac80211/.*.cmd rm -rf hal_apollo/mac80211/*.o rm -rf driver_install/*.ko # find ./ -name ".*.cmd" -exec rm -f {} \; # find ./ -name "*.o" -exec rm -f {} \; # find ./ -name "*.ko" -exec rm -f {} \; # find ./ -name "*.cmd" -exec rm -f {} \; # find ./ -name "*.mod" -exec rm -f {} \; # find ./ -name "*.order" -exec rm -f {} \; 以上是Makefile.build.customer_wifi 能不能整理一下;感觉重复,复杂,冗余
时间: 2025-07-24 22:22:18 AIGC 浏览: 44
<think>我们有两个Makefile需要合并优化:主Makefile和Makefile.build.customer_wifi。目标是减少冗余并简化构建流程。
根据引用[1]中的示例,Makefile中通常包含构建规则,特别要注意缩进(必须使用Tab)和命令的编写。
引用[2]提到了一些注意事项:避免使用复杂特性以减小二进制体积和运行开销,但Makefile中我们主要关注构建规则。
合并思路:
1. 分析两个Makefile的内容,找出重复的部分。
2. 将重复的部分提取到公共变量或规则中。
3. 使用include指令包含另一个Makefile(如果需要保留模块化)。
4. 或者将两个Makefile完全合并成一个。
由于用户没有提供具体内容,我假设两个Makefile的结构如下:
主Makefile可能包含:
- 默认目标
- 编译规则
- 清理规则
Makefile.build.customer_wifi可能包含特定于客户wifi的构建规则。
优化步骤:
1. 定义公共变量(如编译器、编译选项等)在文件顶部,避免重复定义。
2. 将两个文件中相同的规则合并为一个。
3. 如果两个文件有各自特有的规则,则保留它们,但确保没有重复。
示例合并:
原始主Makefile可能如下:
```makefile
CC = gcc
CFLAGS = -Wall
all: program
program: main.o utils.o
$(CC) -o $@ $^
main.o: main.c
$(CC) $(CFLAGS) -c $<
utils.o: utils.c
$(CC) $(CFLAGS) -c $<
clean:
rm -f *.o program
```
Makefile.build.customer_wifi可能如下:
```makefile
CC = gcc
CFLAGS = -Wall -DCUSTOMER_WIFI
customer_wifi: main_customer.o utils_customer.o
$(CC) -o $@ $^
main_customer.o: main.c
$(CC) $(CFLAGS) -c $< -o $@
utils_customer.o: utils.c
$(CC) $(CFLAGS) -c $< -o $@
```
合并后的Makefile可能如下(使用条件判断来区分不同目标):
```makefile
CC = gcc
CFLAGS = -Wall
# 根据目标设置不同的标志
ifeq ($(TARGET), customer_wifi)
CFLAGS += -DCUSTOMER_WIFI
OBJS = main_customer.o utils_customer.o
TARGET_EXE = customer_wifi
else
OBJS = main.o utils.o
TARGET_EXE = program
endif
all: program
program: $(OBJS)
$(CC) -o $@ $^
# 模式规则,避免重复写每个.o文件的编译
%.o: %.c
$(CC) $(CFLAGS) -c $< -o $@
# 特别处理customer_wifi目标,通过变量TARGET传递
customer_wifi:
$(MAKE) TARGET=customer_wifi $(TARGET_EXE)
clean:
rm -f *.o program customer_wifi
```
但是,如果两个Makefile的规则差异很大,我们可以考虑使用include方式:
主Makefile:
```makefile
CC = gcc
CFLAGS = -Wall
include Makefile.build.customer_wifi
all: program
program: main.o utils.o
$(CC) -o $@ $^
%.o: %.c
$(CC) $(CFLAGS) -c $<
clean:
rm -f *.o program
```
然后在Makefile.build.customer_wifi中定义customer_wifi目标(注意不要重复定义变量和规则):
```makefile
# 这个文件只包含特定于customer_wifi的规则
customer_wifi: main_customer.o utils_customer.o
$(CC) -o $@ $^
```
这样,当需要构建customer_wifi时,运行`make customer_wifi`即可。
为了减少冗余,我们还可以将公共部分提取到一个common.mk文件中,然后两个Makefile都包含它。
然而,由于用户没有提供具体的Makefile内容,以上只是通用方法。
根据用户问题,我建议:
1. 首先检查两个Makefile中重复定义的变量(如CC、CFLAGS等),将其提取到公共位置。
2. 将重复的编译规则(例如将.c文件编译为.o文件)使用模式规则(%.o: %.c)统一。
3. 如果两个Makefile有相同的目标(如all, clean),则只保留一个。
4. 使用条件变量(如上面的ifeq)或include来整合特定规则。
注意:在Makefile中,include指令用于包含另一个Makefile,类似于C的#include。
具体步骤需要根据实际文件内容调整。用户可以提供两个Makefile的内容,以便给出更精确的合并方案。
如果用户无法提供内容,则建议按照上述通用方法尝试合并,并测试构建是否成功。
相关问题:
1. 如何避免Makefile中的重复代码?
2. Makefile中如何使用条件判断?
3. 如何组织大型项目的Makefile结构?</think>### 优化合并 Makefile 的解决方案
要优化合并两个 Makefile(主 Makefile 和 `Makefile.build.customer_wifi`),需遵循 DRY(Don't Repeat Yourself)原则,减少冗余并简化构建流程。以下是具体步骤和示例:
---
### 1. **提取公共变量和规则**
将重复的编译器设置、路径定义等提取到公共部分:
```makefile
# 公共变量定义 (可放在单独文件如 common.mk)
CC = gcc
CFLAGS = -Wall -O2
SRC_DIR = src
OBJ_DIR = obj
INCLUDE_DIR = include
```
---
### 2. **使用 `include` 指令整合文件**
在主 Makefile 中引入子 Makefile:
```makefile
# 主 Makefile
include Makefile.build.customer_wifi # 包含客户定制部分
# 公共构建规则
%.o: $(SRC_DIR)/%.c
$(CC) $(CFLAGS) -I$(INCLUDE_DIR) -c $< -o $(OBJ_DIR)/$@
# 默认目标
all: main_app customer_wifi_app
```
---
### 3. **模块化目标定义**
在 `Makefile.build.customer_wifi` 中专注定制部分:
```makefile
# Makefile.build.customer_wifi (客户定制部分)
CUSTOM_FLAGS = -DCUSTOMER_WIFI
CUSTOM_LIBS = -lwifi
customer_wifi_app: $(OBJ_DIR)/main.o $(OBJ_DIR)/wifi.o
$(CC) $^ $(CUSTOM_LIBS) -o $@
$(OBJ_DIR)/wifi.o: $(SRC_DIR)/wifi.c
$(CC) $(CFLAGS) $(CUSTOM_FLAGS) -c $< -o $@
```
---
### 4. **添加条件编译支持**
通过变量控制不同构建目标:
```makefile
# 主 Makefile
ifeq ($(TARGET), customer)
include Makefile.build.customer_wifi
APP_NAME = customer_wifi_app
else
APP_NAME = main_app
endif
build: $(APP_NAME)
```
使用方式:`make build TARGET=customer`
---
### 5. **自动化依赖生成**
使用 `-MMD` 标志自动生成头文件依赖:
```makefile
# 公共编译规则
%.o: $(SRC_DIR)/%.c
$(CC) $(CFLAGS) -I$(INCLUDE_DIR) -MMD -c $< -o $(OBJ_DIR)/$@
# 包含生成的依赖文件
-include $(OBJ_DIR)/*.d
```
---
### 6. **最终合并示例**
```makefile
# ----- 主 Makefile -----
CC = gcc
CFLAGS = -Wall -O2
OBJ_DIR = obj
# 条件包含定制文件
ifeq ($(CUSTOMER_WIFI), 1)
include Makefile.build.customer_wifi
else
APP_OBJ = $(OBJ_DIR)/main.o $(OBJ_DIR)/utils.o
endif
all: build
build: $(APP_OBJ)
$(CC) $^ -o main_app
clean:
rm -rf $(OBJ_DIR)/* main_app
# 公共模式规则
$(OBJ_DIR)/%.o: src/%.c
@mkdir -p $(OBJ_DIR)
$(CC) $(CFLAGS) -c $< -o $@
# ----- Makefile.build.customer_wifi -----
CUSTOM_FLAGS = -DCUSTOMER_WIFI
APP_OBJ += $(OBJ_DIR)/wifi_impl.o # 追加定制对象
$(OBJ_DIR)/wifi_impl.o: src/customer/wifi.c
$(CC) $(CFLAGS) $(CUSTOM_FLAGS) -c $< -o $@
```
---
### 关键优化点:
1. **消除冗余**
公共变量和规则只定义一次,避免重复(引用[3]的微服务思想)
2. **职责分离**
主文件处理通用逻辑,子文件处理定制需求(符合 Unix 哲学)
3. **灵活扩展**
通过 `include` 和条件编译支持新功能添加
4. **构建效率**
自动依赖生成确保增量编译准确
> **注意事项**:
> - 确保所有命令使用 **Tab 缩进**而非空格(引用[1])
> - 避免过度使用复杂特性(引用[2])
> - 测试命令:`make CUSTOMER_WIFI=1` 和 `make clean`
---
### 相关问题
1. 如何在 Makefile 中管理跨平台编译?
2. Makefile 中如何实现并行编译加速构建?
3. 如何用 CMake 替代 Makefile 管理复杂项目?
4. Makefile 中如何正确处理静态库和动态库的链接顺序?
阅读全文
相关推荐


















