使用 makefile 和静态模式规则进行树外构建

2024-05-09

我正在开发一些在 ARM 上运行的裸机嵌入式代码,因此必须处理整个 ARM 与 THUMB 模式的区别。当前的构建系统使用静态模式规则来确定是否以 ARM 或 THUMB 模式编译文件。

$(ACOBJS) : %.o : %.c
    @echo
    $(CC) -c $(CFLAGS) $(AOPT) -I . $(IINCDIR) $< -o $@
$(TCOBJS) : %.o : %.c
    @echo
    $(CC) -c $(CFLAGS) $(TOPT) -I . $(IINCDIR) $< -o $@

其中 ACOBJS 是应处于 ARM 模式的输出对象列表,对于 TCOBJS 和 Thumb 模式也是如此。这些列表是按照通常的方式从源列表创建的

ACOBJS   = $(ACSRC:.c=.o)
TCOBJS   = $(TCSRC:.c=.o)

目前,这会导致构建中的目标文件散布在源树上,这是我特别不希望的。我一直在尝试将其设置为树外构建,但未能使其正常工作。我不一定需要完全摆脱树构建的工作,但我希望至少能够使用一个输出目录,所有中间文件最终都在该目录下。在这些限制下实现这一目标的最佳策略是什么?

我正在考虑的一种选择是使用 automake 或整个 autotools 工具链来构建 makefile。这似乎支持创建我想要的 makefile 类型,但似乎有点矫枉过正。专为便携式构建而设计的自动工具与裸机嵌入式系统(其中主机元组等内容由目标微控制器决定)之间似乎也存在固有的阻抗不匹配。


这有点旧了,但我只是想做同样的事情,这是谷歌的第一次点击。我认为值得分享另一种方法,因为如果您不使用自动工具并且希望能够使用单个命令在任何目录中构建,然后删除该目录,那么这两个答案都不方便。

下面是一个 Makefile 的示例,它引用与包含该 Makefile 的目录相关的文件。

MAKEFILE_DIR := $(shell dirname $(realpath $(lastword $(MAKEFILE_LIST))))
MFD := $(MAKEFILE_DIR)

CXX=g++
CXXFLAGS=-std=c++14 -Wall -Wextra -pedantic -c

test: test.o adjacency_pointers_graph.o
    $(CXX) $^ -o $@

%.o: $(MFD)/%.cpp $(MFD)/adjacency_pointers_graph.h
    $(CXX) $(CXXFLAGS) $< -o $@

然后进行某种源构建:

mkdir build
cd build
make -f ../Makefile
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

使用 makefile 和静态模式规则进行树外构建 的相关文章

  • 在 Linux 上的 makefile 和 Makefile 之间进行选择

    我想在一个目录中同时使用 Makefile 和 makefile 进行 make 默认情况下 它将执行makefile 我可以选择执行 Makefile 吗 提前致谢 最简单的选择是使用 f make f Makefile From man
  • 如何在 GNU Make 模式规则中包含路径前缀

    考虑以下 foo bar echo lt gt 假设我们有一个文件1 bar 执行的命令很简单echo 1 bar gt 1 foo 然而 当 包含一个路径 而不仅仅是一个文件名 它开始变得挑剔 我的问题是我想在前面添加另一条路径 bar
  • Makefile 头依赖项

    我是使用 make 的新手 并且一直在通过以下方式学习基础知识本教程 http www cs colby edu maxwell courses tutorials maketutor 这是本教程中的最后一个 makefile 示例 IDI
  • make: *** 没有规则可以创建“all”所需的目标“gcc”。停止

    我正在通过一个eg pgm 来创建一个make 文件 http mrbook org tutorials make http mrbook org tutorials make 我的文件夹eg make creation包含以下文件 des
  • bash:PWD 和 CURDIR 有什么区别?

    我的问题 我使用 Makefile 来运行docker runtarget 需要当前工作目录作为其参数之一 我使用任一 PWD or CURDIR build Dockerfile docker run lt PWD or CURDIR g
  • 编辑 CMakeLists.txt 以使用 -fPIC 进行编译

    我正在尝试为名为 libnifalcon 的 NOVINT Falcon 安装驱动程序 我使用 cmake 创建 make 文件 但是当我运行 make 时出现错误 Linking CXX shared library lib libnif
  • 在 Makefile 的先决条件列表中使用目标的目录路径

    我编写了一个脚本 它接收两个以 cfg 结尾的文件并输出一个以 cmp 结尾的文件 我想将其包含在我的 Makefile 中 因为一些源代码文件依赖于此 cmp 文件 在我的 Makefile 中 我想这样做 cmp cfg dir def
  • GNU Make “Abort trap: 6” 在 gcc 调用之后,但是单独执行时调用是有效的

    我正在使用 GNU Make 构建一个很多人都会使用的 C C 项目 makefile 尝试通用 因为该项目中有许多可选文件 每个用户通过 MATLAB 界面选择这些文件 然后通过命令行参数 make target OPTS XYZ 等 将
  • 如何在 makefile 中针对特定目标使用 include 指令

    我只想将 include 指令用于特定目标 当不需要目标时 我不想运行其他 makefile 因为这意味着 makefile 是不必要生成的 那么有没有一种方法可以有条件地使用 include 指令 该指令以目标为条件 或者以某种方式使 i
  • Cmake 链接到共享库找不到​​库

    在 Ubuntu 上 我有两个目录 build and src In src my CMakeLists txt文件有以下几行 add executable Test main cpp target link libraries Test
  • /usr/sbin/install 到底有什么作用?

    我正在尝试安装discount https github com Orc discount on my VPS http no de它基于Solaris 设置一些环境变量后编译效果很好 但是安装失败 https gist github co
  • 如何使用蚂蚁?

    我一直试图了解 Ant 的用途 但我仍然不明白 有人可以给我一个使用 Ant 的用例吗 我可以尝试看看 Ant 为何有用以及我可以用它做什么 我在 Eclipse 中进行 Java 开发 并且刚刚开始使用 servlet 和 Google
  • Makefile 和通配符

    好吧 这是我当前的 makefile 设置 有一些文件名为public01 c public02 c等等 我正在尝试使用以下方法为每个人制作目标文件public o带有通配符的标签 public o public c hashtable h
  • 从 Makefile 中的 C++FLAGS 中删除一个标志?

    我有一个 Makefile 其中包含另一个设置了很多默认值的 makefile 我无法编辑包含的 makefile 并且我想更改 makefile 中 C FLAGS 的值 即使它是在包含的 makefile 中设置的 具体来说 每当 de
  • 构建 makefile 依赖/继承树

    如果我解释得不好或者问了一些明显的问题 我很抱歉 但我是 Linux 内核的新手 而且有点深入 我们有一个嵌入式 Linux 系统 它附带一个 文档非常糟糕的 SDK 其中包含数百个文件夹stuff 大多数文件夹包含rules make m
  • 用于发布和调试目标的 Makefile

    我正在尝试构建一个 Makefile 它可以通过指定目标而不是变量 例如make debug 1 不太好 我这里有一个精简的简化示例 它模拟了我想要实现的目标 ifdef debug BINARY my binary debug MODUL
  • makefile 目标中可以有多个 % 符号吗?

    所以我有一个具有如下目标依赖项的 makefile all foreach lang LANGS foreach models MODELS targetName model xml lang targetName 目标如下所示 targe
  • 如何在使用cmake完成make后打印消息?

    我正在尝试使用 CMake 完成构建过程后打印消息 我只是想在之后通知用户make命令已完成 没有任何错误 我该怎么做 我试过add custom target 但我无法选择何时跑步 另外 我尝试过add custom command 它再
  • 如何调用使用 Define 创建的 GNU make 宏?

    在我的 Makefile 中调用 GREP 的两种方式有什么区别吗 我有什么理由应该使用其中之一 两者似乎产生相同的结果 define GREP word 3 shell echo define FOO 0xfff00100 endef a
  • 避免重复 GNU Make 规则

    我一直在编写一个执行一些依赖项生成的 Makefile 我发现自己必须重复规则 因为 遗留 代码库包含以下内容的混合 cpp and cc文件 好像有点难看 无论如何 是否可以指定目标的先决条件可以是 cpp or cc files 所以而

随机推荐

  • 如何在 laravel/php 中访问该集合的内容

    我是 Laravel 的新手 正在做一个构建迷你社交网络应用程序的项目 我有一个与用户模型有关系的帖子模型 我有一个帖子页面 其中仅显示经过身份验证的用户及其朋友的帖子 在我的 PostController 中 我像这样查询经过身份验证的用
  • mvc3,你能给控制器一个显示名称吗?

    我用的是mvc3 是否可以为控制器和操作指定显示名称 DisplayName Facebook Employee public class EmployeeController Controller 在我的面包屑中 我将获得控制器名称和操作
  • 使用 appcelerator titan 在 android 中后退按钮退出应用程序

    我是钛开发的新手 在本机 android 中 如果我们按下后退按钮 则仅当前活动将被关闭 并且它将返回到上一个活动 但是当我使用 Titanium 在 Android 中按下后退按钮时 它会从应用程序退出 我怎样才能改变这种行为 有两种类型
  • iOS:在代码中访问 app-info.plist 变量

    我正在开发通用应用程序 并且希望访问代码中 app info plist 文件中存储的值 原因 我使用以下方法从故事板动态实例化 UIViewController UIStoryboard storyboard UIStoryboard s
  • 在 React 中更新状态时递归过多

    在此示例中 当我尝试在componentDidUpdate生命周期回调 我得到too much recursion错误 我应该如何更新状态 import React from react class NotesContainer exten
  • java.sql.SQLException: ORA-01005: 给定的密码为空;登录被拒绝

    我在尝试连接到数据库时遇到以下异常 java sql SQLException ORA 01005 null password given logon denied at oracle jdbc driver T4CTTIoer proce
  • Pandas 将行中的非空值获取到一个单元格中[重复]

    这个问题在这里已经有答案了 给定以下数据框 a pd DataFrame A 1 2 B 4 0 C 1 2 a A B C 0 1 4 1 1 2 0 2 我想创建一个新专栏D包含由列分隔的非空值 每行 像这样 A B C D 0 1 4
  • 使用 Gson 序列化时如何公开类名

    我的场景非常复杂 但总结如下 我试图了解编译器的源代码 并了解每个 AST 节点代表什么 我正在生成不同程序的 AST 的 JSON 序列化 然后检查可视化的 JSON 输出 它工作得很好 除了一个问题是在 Gson 中生成的 JSON 数
  • 方案中的尾递归幂函数

    我在方案中编写尾递归幂函数时遇到问题 我想使用辅助函数来编写该函数 我知道我需要一个参数来保存累计值 但在那之后我就陷入了困境 我的代码如下 define pow tr a b define pow tr h result if b 0 r
  • Python包不安装子模块

    我在 dev 分支中创建了一个具有以下结构的包 在验证包安装正确之前不会合并到 main mypackage init py setup py requirements txt module py subpackage one init p
  • Jackson Json 将对象反序列化为列表

    我正在使用 Spring 的 Web 服务RestTemplate并反序列化Jackson 在来自服务器的 JSON 响应中 其中一个字段可以是对象或列表 这意味着它可以是 result or result 有没有办法通过对我要反序列化的类
  • 如何计算两个ip之间的主机数量? C#

    我有两个ip 1 1 1 1 1 2 4 4 4 4 显然这只是一个例子 这是一个动态计算器 如果子网掩码不相关 我如何计算所述 ip 之间的主机数量 要计算 理论 IP 地址的数量 您需要将每个 IP 地址转换为其 32 位整数格式 这实
  • 如何共享/扩展/重用/引用 GitHub Workflow?

    我有两个工作流程 一种方式是通过推送到 master 来部署到测试环境 另一个在发布到生产环境时部署 它们90 相同 代码复制粘贴 是否有一个概念 例如提取部分重复逻辑并将其放入自己的文件 部分 片段中 GitHub Actions 中的重
  • 递归和大O

    我最近正在完成一项涉及递归和大 O 表示法的计算机科学作业 我相信我很好地理解了这一点 虽然当然不是完美的 但是有一个问题给我带来了最多的问题 奇怪的是 一看就知道是作业上最简单的一个 使用大哦符号提供最佳增长率来解决以下递归问题 T 1
  • 为什么Python有最大递归深度?

    Python有最大递归深度 但没有最大迭代深度 为什么递归受到限制 把递归当成迭代来对待 而不限制递归调用的次数不是更自然吗 我只想说这个问题的根源来自于尝试实现流 参见这个问题 https stackoverflow com questi
  • python中热图的层次聚类

    我有一个 NxM 矩阵 其值范围为 0 到 20 我可以使用 Matplotlib 和 pcolor 轻松获得热图 现在我想使用 scipy 应用层次聚类和树状图 我想重新排序每个维度 行和列 以显示哪些元素相似 根据聚类结果 如果矩阵是方
  • 如何正确使用Javascript“导出”和“导入”功能?

    我想将函数从 lib js 文件导出到 main js 文件 我有 lib js export const sqrt Math sqrt export function square x return x x export function
  • XDocument.Save() 删除我的 实体

    我编写了一个工具来使用 C 和 Linq to XML 修复一些 XML 文件 即插入一些缺失的属性 值 该工具将现有 XML 文件加载到 XDocument 对象中 然后 它向下解析节点以插入丢失的数据 之后 它调用 XDocument
  • ValueError:“连接”层需要具有匹配形状的输入(连接轴除外)

    我正在尝试为我的项目构建 Pix2Pix 并收到错误 值错误 Concatenate层需要具有匹配形状的输入 除了连接轴之外 获得输入形状 None 64 64 128 None 63 63 128 生成器是一个 U 网模型 我的输入高度
  • 使用 makefile 和静态模式规则进行树外构建

    我正在开发一些在 ARM 上运行的裸机嵌入式代码 因此必须处理整个 ARM 与 THUMB 模式的区别 当前的构建系统使用静态模式规则来确定是否以 ARM 或 THUMB 模式编译文件 ACOBJS o c echo CC c CFLAGS