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 $@
相关推荐
hakesashou33 分钟前
python如何比较字符串
linux·开发语言·python
Ljubim.te41 分钟前
Linux基于CentOS学习【进程状态】【进程优先级】【调度与切换】【进程挂起】【进程饥饿】
linux·学习·centos
cooldream20091 小时前
Linux性能调优技巧
linux
玄奕子1 小时前
GPT对话知识库——在STM32的平台下,通过SPI读取和写入Flash的步骤。
stm32·单片机·gpt·嵌入式·嵌入式驱动
QMCY_jason2 小时前
Ubuntu 安装RUST
linux·ubuntu·rust
慕雪华年2 小时前
【WSL】wsl中ubuntu无法通过useradd添加用户
linux·ubuntu·elasticsearch
苦逼IT运维2 小时前
YUM 源与 APT 源的详解及使用指南
linux·运维·ubuntu·centos·devops
仍有未知等待探索2 小时前
Linux 传输层UDP
linux·运维·udp
zeruns8022 小时前
如何搭建自己的域名邮箱服务器?Poste.io邮箱服务器搭建教程,Linux+Docker搭建邮件服务器的教程
linux·运维·服务器·docker·网站
卑微求AC2 小时前
(C语言贪吃蛇)16.贪吃蛇食物位置随机(完结撒花)
linux·c语言·开发语言·嵌入式·c语言贪吃蛇