hardware simulation——编译框架优化

目录

介绍

修改前的最新代码和框架

学习和修改

最终版本


介绍


https://www.cnblogs.com/wittxie/p/9836097.html

上次那个虽然能完成基本的编译功能了,但是还是太low啦,今天来优化一下,找到一篇感觉不错的文章,我们来学习一下,依旧是配合linux源码的makefile框架,只是这次会参考一下上面链接的思想。

其实他用的也是linux的makefile的管理思想编译进行层层调用。

修改前的最新代码和框架

MAJOR = 0

MINOR = 0

PATCH = 0

NAME = tianyu.xin

ROOTFILE = $(shell pwd)

OUTPUTFILE = $(ROOTFILE)/OUTPUT

SRC = $(wildcard *.c)

OBJ = (patsubst %.c,%.o,(SRC))

OUTPUT = hardware_simulation

APP_SRCS = $(wildcard ../APP/src/*.c)

APP_OBJS = $(APP_SRCS:../APP/src/%.c=%.o)

SHOW_SRCS = $(wildcard ../show/src/*.c)

SHOW_OBJS = $(SHOW_SRCS:../show/src/%.c=%.o)

HARDWARE_SRCS = $(wildcard ../hardware/src/*.c)

HARDWARE_OBJS = $(APP_SRCS:../hardware/src/%.c=%.o)

INCLUDE = -I../show/include -I../APP/include -I../hardware/include

CC = gcc

CFLAGS = -Wall -Werror $(INCLUDE)

Aesthetic treatment

log management

ifeq ("$(origin V)", "command line")

KBUILD_VERBOSE = $(V)

endif

ifndef KBUILD_VERBOSE

KBUILD_VERBOSE = 0

endif

ifeq ($(KBUILD_VERBOSE),1)

quiet =

Q =

else

quiet=quiet_

Q = @

endif

all: $(OUTPUT)

(Q)(CURDIR)

$(OUTPUT): $(APP_OBJS) $(SHOW_OBJS)

(Q)(CC) $(CFLAGS) $^ -o $@

%.o: ../APP/src/%.c

(Q)(CC) $(CFLAGS) -c $< -o $@

%.o: ../show/src/%.c

(Q)(CC) $(CFLAGS) -c $< -o $@

clean:

rm -f $(OUTPUT) $(APP_OBJS) $(SHOW_OBJS) $(HARDWARE_OBJS)

FORCE:

$(Q)echo "Forcing target"

.PHONY: FORCE clean all

上面就是目前的makefile

学习和修改

咱们的工程其实不需要那么复杂的编译框架,一个makefile就够了,但是我们要标准化一些,把能拿走的都放到配置文件里。

这个up用的是这种方式,直接把大家的配置文件都放到一起在主makefile那里,

我们就都放到build目录下,一个配置文件,一个共用函数文件

刚刚新加个hardware的rm上面忘记改了直接给我把主函数删了,人麻了,还好vscode有缓存

MAJOR = 0
MINOR = 0
PATCH = 0
NAME = tianyu.xin

include ./make_conf.mk 

all: $(OUTPUT)
#	$(Q)$(CURDIR)	

include ./make_fun.mk

clean:
	rm -f $(OUTPUT) $(APP_OBJS) $(SHOW_OBJS) $(HARDWARE_OBJS)

FORCE:
	$(Q)echo "Forcing target"

.PHONY: FORCE clean all

修改后makefile文件就变成这样了

这俩makefile的头文件把之前配置的东西都拿走了。

然后试一试昨天加的打印编译过程功能

在试试我新加的功能

我把clean命令拆成了两个全部清除和只清除中间文件

然后我把所有的中间文件和目标文件都放到了OUTPUT目录下

现在代码可以进一步简化了

有的文件单纯就是描述文件没有.o文件所以会导致mv的时候报错

2>/dev/null

可以用这个把标准错误定向到空

现在代码还有个问题就是我们的执行只能在build目录下,所以们在优化一下

ROOT_DIR = ..
OUTPUTFILE = $(ROOT_DIR)/OUTPUT

然后我们再来加个打印头

# Silent printing is always required here
show:
	@echo "--------------------------------------------------------------"
	@echo "----------------------Build Start-----------------------------"
	@echo "--------------------------------------------------------------"
	@echo "Version: $(MAJOR).$(MINOR).$(PATCH)\n"
	@echo "Author: $(NAME)\n"

还有颜色输出

这个可以参考我之前的一个文章设置对应颜色

http://t.csdnimg.cn/9dUHY

ifeq ($(filter debug,$(MAKECMDGOALS)),1)
	DEBUG = -g
else
	DEBUG = 
endif

CC = gcc
CFLAGS = -Wall -Werror $(DEBUG) $(INCLUDE)

现在有一个问题我像上面这样定义没有效果,像下面这样就可以

ifeq ($(filter debug,$(MAKECMDGOALS)),1)
	CFLAGS = -Wall -Werror -g $(INCLUDE)
else
	CFLAGS = -Wall -Werror $(DEBUG) $(INCLUDE)
endif

CC = gcc

算了debug和waring的开关问题留到下次解决好了

最终版本

MAJOR = 0
MINOR = 0
PATCH = 0
NAME = tianyu.xin

ROOT_DIR = ..
OUTPUTFILE = $(ROOT_DIR)/OUTPUT

include $(ROOT_DIR)/build/make_conf.mk 

all: show $(OUTPUT)
	$(Q)mkdir -p $(OUTPUTFILE)
	$(Q)mv $(OUTPUT) ./*.o $(OUTPUTFILE)

include $(ROOT_DIR)/build/make_fun.mk

# Silent printing is always required here
show:
	@echo "--------------------------------------------------------------"
	@echo "----------------------Build Start-----------------------------"
	@echo "--------------------------------------------------------------"
	@echo "Version: $(MAJOR).$(MINOR).$(PATCH)\n"
	@echo "Author: $(NAME)\n"

clean:
	rm -f $(OUTPUTFILE)/*.o

clean_all:
	rm -f $(OUTPUTFILE)/*

FORCE:
	$(Q)echo "Forcing target"

.PHONY: FORCE clean all show

SRC = $(wildcard *.c)
OBJ = $(patsubst %.c,%.o,$(SRC))

OUTPUT        = hardware_simulation
APP_SRCS      = $(wildcard $(ROOT_DIR)/APP/src/*.c)
APP_OBJS      = $(APP_SRCS:$(ROOT_DIR)/APP/src/%.c=%.o)
SHOW_SRCS     = $(wildcard $(ROOT_DIR)/show/src/*.c)
SHOW_OBJS     = $(SHOW_SRCS:$(ROOT_DIR)/show/src/%.c=%.o)
HARDWARE_SRCS = $(wildcard $(ROOT_DIR)/hardware/src/*.c)
HARDWARE_OBJS = $(HARDWARE_SRCS:$(ROOT_DIR)/hardware/src/%.c=%.o)

INCLUDE       = -I$(ROOT_DIR)/show/include -I$(ROOT_DIR)/APP/include -I$(ROOT_DIR)/hardware/include


ifeq ($(filter debug,$(MAKECMDGOALS)),1)
	DEBUG = 
else
	DEBUG = -g
endif

CC = gcc
CFLAGS = -Wall -Werror $(INCLUDE)
CFLAGS += $(DEBUG)

# Aesthetic treatment
ECHO_END:=\033[0m"
ECHO_GREEN:=echo "\033[32m
ECHO_RED:=echo "\033[31m
ECHO_YELLOW:=echo "\033[33m
ECHO_BLUE:=echo "\033[34m
ECHO_GREEN_YELLOW:=echo "\033[42;30m

# log management
ifeq ("$(origin V)", "command line")
	KBUILD_VERBOSE = $(V)
endif
ifndef KBUILD_VERBOSE
	KBUILD_VERBOSE = 0
endif

ifeq ($(KBUILD_VERBOSE),1)
	quiet =
	Q =
else
	quiet=quiet_
	Q = @
endif

$(OUTPUT): $(APP_OBJS) $(SHOW_OBJS)
	$(Q)$(CC) $(CFLAGS) $^ -o $@

%.o: $(ROOT_DIR)/APP/src/%.c 
	$(Q)$(CC) $(CFLAGS) -c $< -o $@

%.o: $(ROOT_DIR)/show/src/%.c
	$(Q)$(CC) $(CFLAGS) -c $< -o $@
相关推荐
TeYiToKu40 分钟前
笔记整理—linux驱动开发部分(9)framebuffer驱动框架
linux·c语言·arm开发·驱动开发·笔记·嵌入式硬件·arm
dsywws43 分钟前
Linux学习笔记之时间日期和查找和解压缩指令
linux·笔记·学习
yeyuningzi1 小时前
Debian 12环境里部署nginx步骤记录
linux·运维·服务器
上辈子杀猪这辈子学IT1 小时前
【Zookeeper集群搭建】安装zookeeper、zookeeper集群配置、zookeeper启动与关闭、zookeeper的shell命令操作
linux·hadoop·zookeeper·centos·debian
minihuabei1 小时前
linux centos 安装redis
linux·redis·centos
lldhsds2 小时前
书生大模型实战营第四期-入门岛-1. Linux前置基础
linux
wowocpp3 小时前
ubuntu 22.04 硬件配置 查看 显卡
linux·运维·ubuntu
jjyangyou3 小时前
物联网核心安全系列——物联网安全需求
物联网·算法·安全·嵌入式·产品经理·硬件·产品设计
山河君3 小时前
ubuntu使用DeepSpeech进行语音识别(包含交叉编译)
linux·ubuntu·语音识别
鹏大师运维3 小时前
【功能介绍】信创终端系统上各WPS版本的授权差异
linux·wps·授权·麒麟·国产操作系统·1024程序员节·统信uos