hardware simulation——编译框架搭建

目录

前言

学习Linux的makefile

规范化配置

文件生成过程描述

编码和验证


前言

        编译框架搭建遇到了些问题,我对makefile不是那么熟练,能力只停留在能看懂和能改上自己独立写个大工程的编译框架有困难,所以这期我们一起看linux内核的编译框架,边学习边仿制。

学习Linux的makefile

规范化配置

首先映入眼帘的是版本号和作者

ifeq ($(KBUILD_VERBOSE),1)quiet =Q =
elsequiet=quiet_Q = @
endif
  1. ifeq ($(KBUILD_VERBOSE),1)

    • ifeq 是“if equal”的缩写,用于检查两个值是否相等。
    • $(KBUILD_VERBOSE) 是一个变量,其值可能是1或0。这个变量通常在内核编译时被设置,表示是否启用verbose模式。
  2. quiet =

    • 这行代码设置了quiet变量为空字符串。当KBUILD_VERBOSE为1时,我们不需要使用quiet_前缀来抑制输出。
  3. Q =

    • 这行代码设置了Q变量为空字符串。在某些makefile中,Q用于表示不回显命令,这样在执行make时,命令本身不会被显示在控制台上。
  4. else

    • 如果上面的条件不满足(即KBUILD_VERBOSE的值不是1),则执行else部分。
  5. quiet=quiet_

    • 当不在verbose模式时,我们需要在输出中添加quiet_前缀,以抑制不必要的输出。
  6. Q = @

    • 当不在verbose模式时,我们将Q设置为@,这意味着命令本身将被回显到控制台上。这通常用于调试目的。
  7. endif

    • 结束if条件语句。

        这段代码的目的是根据是否启用了verbose模式来控制make命令的输出和安静模式。如果verbose模式被启用(即KBUILD_VERBOSE的值为1),则make命令将不会显示正在执行的命令;否则,它会显示命令。此外,为了抑制不必要的输出,要么使用空字符串(在verbose模式下)要么使用quiet_前缀(在非verbose模式下)

他是和V配合使用的,达到控制生成日志数量的功能

ifeq ("$(origin V)", "command line")KBUILD_VERBOSE = $(V)
endif
ifndef KBUILD_VERBOSEKBUILD_VERBOSE = 0
endif

 如果命令行定义了这个值就从命令行拿,没定义就默认他是0

文件生成过程描述

那些花里胡哨的功能我们先不看先看核心的编译功能

%.s: %.c prepare scripts FORCE

    $(Q)$(MAKE) $(build)=$(build-dir) $(target-dir)$(notdir $@)

%.i: %.c prepare scripts FORCE

    $(Q)$(MAKE) $(build)=$(build-dir) $(target-dir)$(notdir $@)

%.o: %.c prepare scripts FORCE

    $(Q)$(MAKE) $(build)=$(build-dir) $(target-dir)$(notdir $@)

%.lst: %.c prepare scripts FORCE

    $(Q)$(MAKE) $(build)=$(build-dir) $(target-dir)$(notdir $@)

%.s: %.S prepare scripts FORCE

    $(Q)$(MAKE) $(build)=$(build-dir) $(target-dir)$(notdir $@)

%.o: %.S prepare scripts FORCE

    $(Q)$(MAKE) $(build)=$(build-dir) $(target-dir)$(notdir $@)

%.symtypes: %.c prepare scripts FORCE

    $(Q)$(MAKE) $(build)=$(build-dir) $(target-dir)$(notdir $@)

这里主要是两部分的内容,上面是对各种文件生成对应文件的描述,

  1. %.s: %.c prepare scripts FORCE: 规则描述如何从.c文件生成.s汇编文件。$(Q)$(MAKE) $(build)=$(build-dir) $(target-dir)$(notdir $@)是执行的具体命令,其中$(Q)$(MAKE)表示运行make工具,$(build)=$(build-dir)指定构建目录,$(target-dir)$(notdir $@)指定目标文件的目录和名称(不包括目录部分)。
  2. %.i: %.c prepare scripts FORCE: 规则描述如何从.c文件生成.i预处理文件。
  3. %.o: %.c prepare scripts FORCE: 规则描述如何从.c文件生成.o对象文件。
  4. %.lst: %.c prepare scripts FORCE: 规则描述如何从.c文件生成.lst列表文件。
  5. %.s: %.S prepare scripts FORCE: 规则描述如何从.S汇编文件生成汇编文件。
  6. %.o: %.S prepare scripts FORCE: 规则描述如何从.S汇编文件生成.o对象文件。
  7. %.symtypes: %.c prepare scripts FORCE: 规则描述如何从.c文件生成.symtypes符号类型文件。

在每条规则中,prepare scripts FORCE是一个伪目标,它的作用是确保在执行实际编译命令之前,先运行所有与这个伪目标相关的命令,例如准备脚本或清理之前的构建结果。这样可以确保构建的正确性和一致性。

下面是驱动模块的规则这里暂时不详细展开了

# Modules

/: prepare scripts FORCE

    $(cmd_crmodverdir)

    $(Q)$(MAKE) KBUILD_MODULES=$(if $(CONFIG_MODULES),1) \

    $(build)=$(build-dir)

%/: prepare scripts FORCE

    $(cmd_crmodverdir)

    $(Q)$(MAKE) KBUILD_MODULES=$(if $(CONFIG_MODULES),1) \

    $(build)=$(build-dir)

%.ko: prepare scripts FORCE

    $(cmd_crmodverdir)

    $(Q)$(MAKE) KBUILD_MODULES=$(if $(CONFIG_MODULES),1)   \

    $(build)=$(build-dir) $(@:.ko=.o)

    $(Q)$(MAKE) -f $(srctree)/scripts/Makefile.modpost

编码和验证

MAJOR = 0

MINOR = 0

PATCH = 0

NAME = tianyu.xin

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)

INCLUDE   = -I../show/include -I../APP/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)

FORCE:

    $(Q)echo "Forcing target"

.PHONY: FORCE clean all

基本能实现个基础功能后面还需要优化

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.hqwc.cn/news/434524.html

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Mac Monitor:一款为macOS安全研究量身定制的高级独立系统监控工具

关于Mac Monitor Mac Monitor是一款功能强大的高级独立系统安全监控工具&#xff0c;该工具专为macOS安全研究、恶意软件分类和系统故障排除而设计&#xff0c;主要基于Apple Endpoint Security&#xff08;ES&#xff09;实现其功能。 Mac Monitor能够收集各种类型的系统事件…

Nginx与keepalived实现集群

提醒一下&#xff1a;下面实例讲解是在mac虚拟机里的Ubuntu系统演示的&#xff1b; Nginx与keepalived实现集群实现的效果 两台服务器都安装Nginx与keepalived&#xff1a; master服务器的ip(192.168.200.2) backup服务器的ip(192.168.200.4) 将 master服务器Nginx与keepalive…

LeetCode.11. 盛最多水的容器

题目 题目链接 分析 这道题的意思就是让我们找两个下标&#xff0c;以这两个下标组成的线为底&#xff0c;高度取这两个位置对应数字的最小值为高&#xff0c;组成一个长方形&#xff0c;求长方形最大的面积可以为多少。 暴力的解法是什么&#xff1f;&#xff1f;&#xf…

环形链表的检测与返回

环形链表 王赫辰/c语言 - Gitee.com 快慢指针的差距可以为除一以外的数吗&#xff1f;不可以如果差奇数则无法发现偶数环&#xff0c;是偶数无法发现奇数环&#xff0c;本题思路为指针相遇则为环&#xff0c;而以上两种情况会稳定差一&#xff0c;导致指针永不相遇 最终返回…

【C++中STL】list链表

List链表 基本概念构造函数赋值和交换大小操作插入和删除数据存取反转和排序 基本概念 将数据进行链式存储 链表list是一种物理存储单元上非连续的存储结构&#xff0c;数据元素的逻辑顺序是通过链表中的指针链接实现的&#xff0c;链表是由一系列结点组成&#xff0c;结点的组…

深度强化学习(王树森)笔记04

深度强化学习&#xff08;DRL&#xff09; 本文是学习笔记&#xff0c;如有侵权&#xff0c;请联系删除。本文在ChatGPT辅助下完成。 参考链接 Deep Reinforcement Learning官方链接&#xff1a;https://github.com/wangshusen/DRL 源代码链接&#xff1a;https://github.c…

字符串和C预处理器

本文参考C Primer Plus第四章学习 文章目录 常量和预处理器const限定符 1. 常量和预处理器 有时&#xff0c;在程序中要使用常量。例如&#xff0c;可以这样计算圆的周长&#xff1a; circumference 3.14159 * diameter; 这里&#xff0c;常量3.14159 代表著名的常量 pi(π)。…

5|领域建模实践(上):怎样既准确又深刻地理解业务知识?

上节课咱们完成了事件风暴&#xff0c;梳理了系统的行为需求。但你可能也发现了&#xff0c;其实还有些微妙的业务概念还没有澄清&#xff0c;这就要靠领域建模来完成了。 建立领域模型是 DDD 的核心。要建好领域建模&#xff0c;需要理论和实践相结合。由于我们的模型有一定的…

自动化测试业务价值思考和观点

对于自动化测试的价值如何体现&#xff0c;我的思考和观点主要有如下2点&#xff1a; 基于团队内部&#xff0c;从解决问题角度出发的技术落地实践和数据度量&#xff1b;基于跨团队合作&#xff0c;从KPI/OKR角度,用度量的数据来支撑你的价值传递&#xff1b; 接下来我会基于…

Rabbitmq调用FeignClient接口失败

文章目录 一、框架及逻辑介绍1.背景服务介绍2.问题逻辑介绍 二、代码1.A服务2.B服务3.C服务 三、解决思路1.确认B调用C服务接口是否能正常调通2.确认B服务是否能正常调用A服务3.确认消息能否正常消费4.总结 四、修改代码验证1.B服务异步调用C服务接口——失败2.将消费消息放到C…

二叉树的最近公共祖先,二叉搜索树的最近公共祖先(同一个思路)

目录 二叉树的最近公共祖先方法一&#xff08;时间复杂度O(N^2)&#xff09;方法二&#xff08;时间复杂度O(N)&#xff09; 二叉搜索树的最近公共祖先 二叉树的最近公共祖先 题目链接   二叉树的最近公共祖先   给定一个二叉树, 找到该树中两个指定节点的最近公共祖先。  …

[BUUCTF]-PWN:babyfengshui_33c3_2016解析

又是一道堆题&#xff0c;先看保护 关键信息是32位&#xff0c;没开pie 直接看ida 大致是alloc创建堆块&#xff0c;free释放堆块&#xff0c;show查看堆块内容&#xff0c;fill填充堆块内容 其他的都没啥关键的要讲&#xff0c;但alloc那里非常需要解析一下 解释如上图 再具…