如何在 makefile 中用点分割字符串

2024-01-05

我有这样的目标

test.%
    export var1=$(basename $*) && export var2=$(subst .,,$(suffix $*))

我用喜欢test.var1.var2

现在我想做一个像test.var1.var2.var3我怎样才能在makefile中得到它

edit:

我想这样做的原因是因为我正在使用 Make 文件来部署多个应用程序并且我想要很多变量。这样用户就可以像这样部署

make install.{app1}.{test}.{build_number}

Use subst将点替换为空格,使其成为列表。然后使用word访问特定元素:

word-dot = $(word $2,$(subst ., ,$1))

test.%:
    export var1=$(call word-dot,$*,1) && export var2=$(call word-dot,$*,2) && export var3=$(call word-dot,$*,3)

哪个输出:

$ make test.foo.bar.baz
export var1=foo && export var2=bar && export var3=baz

作为旁白(这实际上占据了我的大部分答案),如果您提前知道选项是什么,您可以使用一些强大的元编程。假设你想生成test-{app}一些人的目标APPS:

tmpl-for = $(foreach x,$2,$(call $1,$x))
rule-for = $(foreach x,$2,$(eval $(call $1,$x)))

APPS := foo bar baz

tmpl-test = test-$1

define test-vars-rule
$(call tmpl-test,$1): APP := $1
.PHONY: $(call tmpl-test,$1)
endef

$(call rule-for,test-vars-rule,$(APPS))
$(call tmpl-for,tmpl-test,$(APPS)):
        @echo Testing app: $(APP)

前两行是“库”函数,将调用“模板”(tmpl-for)或生成规则(rule-for) 对于您作为第二个参数提供的列表中的每个元素。我创建一个tmpl-test它采用应用程序名称并给出test-{app}。我定义了一个规则模板,它采用应用程序名称并设置特定于目标的APP适当的变量test-{app}目标(顺便说一下,它也是假的)。然后我用rule-for创建我所有的设置规则APP。最后,我编写了目标的实际主体,并使用以下命令获取所有可能目标的列表tmpl-for.

$ make test-foo
Testing app: foo
$ make test-bar
Testing app: bar
$ make test-baz
Testing app: baz
$ make test-blah
make: *** No rule to make target 'test-blah'.  Stop.

听起来很复杂,确实如此,但是如果您正确地抽象模板函数,它可以生成灵活且易于维护的构建系统。

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

如何在 makefile 中用点分割字符串 的相关文章

  • 什么是“制定目标”?

    为什么我需要制作一个make target在能够构建我的源代码之前 更具体地说 什么是制定目标 http publib boulder ibm com infocenter rsdvhelp v6r0m1 index jsp topic o
  • 如何在使用cmake完成make后打印消息?

    我正在尝试使用 CMake 完成构建过程后打印消息 我只是想在之后通知用户make命令已完成 没有任何错误 我该怎么做 我试过add custom target 但我无法选择何时跑步 另外 我尝试过add custom command 它再
  • 将环境变量从 Makefile 导出到用户态环境

    我正在研究如何从 Makefile 环境变量导出以在用户环境中公开 因此应该可以从用户 shell 访问从 Makefile 导出这些变量 我努力了make s export https www gnu org software make
  • 为什么总是./configure;制作;进行安装;作为 3 个单独的步骤?

    每次从源代码编译某些内容时 都会经历相同的 3 个步骤 configure make make install 我明白 将安装过程分为不同的步骤是有意义的 但我不明白 为什么这个星球上的每个编码员都必须一次又一次地编写相同的三个命令才能完成
  • 如何制作一个makefile只用于编译一些java文件?

    我有三个java文件 名为A java B java C java A将创建对象B B将创建对象C 但我以前从未构建过makefile 有谁可以帮我构建一个 makefile 来编译这三个 java 文件吗 我应该使用什么工具来制作 mak
  • 使用 .INTERMEDIATE 在 makefile 中进行不可靠的并行构建?

    我有一个可以生成多个输出文件的工具 众所周知 在 make 中很难建模 我正在使用食谱GNU Makefile 规则从单个源文件生成一些目标 https stackoverflow com questions 2973445 gnu mak
  • 如果未设置,则从控制台读取 Makefile 变量

    我正在更新一个从外部源访问某些资源的 Makefile 即存在以下形式的规则 External cvs up 对于不受限制的资源 它可以按预期工作 现在 出现了功能漂移 外部资源需要更复杂的登录 因此规则已更改为与此没有太大不同的内容 Ex
  • 如何在 Makefile 中定义全局 shell 函数?

    我想定义一个shell函数 bin sh test do some complicated tests 1 2 if something then build thisway 1 2 else build otherway 1 2 fi 这
  • .ko 文件是如何构建的

    我正在尝试将我自己的驱动程序移植到Beagle 板 xm arm cortex A8 在移植时我试图弄清楚如何 ko文件实际构建 在我们的Makefile我们只有一个命令来构建 o file 怎样是一个 ko文件已建立 使用Linux 2
  • 如何确保目标在 makefile 中的所有其他构建规则之前运行?

    我有一个 C 项目 其中包含所有其他 C 文件所依赖的生成文件 我试图在任何其他编译开始之前强制生成并编译该文件 通常它就像将该文件首先放入all 目标 但复杂的是我的 Makefile 也是由构建系统生成的 我只能将片段附加到 Makef
  • 从哪里获取 iostream.h

    我正在尝试在 Linux 中做一些事情 但它抱怨找不到 iostream h 我需要安装什么才能获取此文件 这个标准头的正确名称是iostream没有扩展名 如果您的编译器仍然找不到它 请尝试以下操作 find usr include na
  • 什么是 C 语言的高效工作流程? - Makefile + bash脚本

    我正在开发我的第一个项目 该项目将跨越多个 C 文件 对于我的前几个练习程序 我只是在中编写了我的代码main c并使用编译gcc main c o main 当我学习时 这对我有用 现在 我正在独自开展一个更大的项目 我想继续自己进行编译
  • 多个源的 makefile

    在学习 make 文件时 我试图为多个源目录编写一个 make 文件 似乎我在某个地方错了 这是我的代码结构 directory common fun2 c inc fun h src fun1 c main c 这是我的生成文件 CC c
  • 为什么 Visual Studio Code 在编辑 Makefile 和 "editor.insertSpaces": "auto" 时插入空格?

    make 不喜欢 Makefile 中的目标主体有空格 必须是一个标签 我将 editor insertSpaces 更改为 auto 认为这会有所帮助 事实并非如此 我必须将其设置为 false 才能使代码正常工作 现在可以通过语言特定设
  • 链接器失败:存档中的成员不是对象

    我正在尝试在 Windows 7 上使用 64 位 mingw 构建 Open CASCADE 6 7 1 库 我正在使用x86 64 4 9 1 release posix seh rt v3 rev1 from mingw w64 项目
  • 是否可以将 GNU make jobserver 环境“传递”到通过第 3 方(非 make)提供服务的 submake

    运行 gnu make 规则时 jNmake 创建一个工作服务器 http make mad scientist net papers jobserver implementation 用于管理跨子制造商的工作数量 此外 您可以通过在 ma
  • Makefile:没有规则来制作目标

    我正在关注本指南makefile http www cs colby edu maxwell courses tutorials maketutor 但我根本不理解最后一个例子 并且我无法让我的 makefile 工作 因为我收到了错误ma
  • 找不到包“gdk-pixbuf-2.0”

    我正在尝试在 Amazon Linux 发行版实例上构建 librsvg 我已经通过 yum 安装了大部分依赖项 其中一些在实例上启用的默认 yum 存储库中不可用 因此必须从头开始构建它们 我已经走了很远 但还停留在最后一点 跑步时sud
  • 什么是 Makefile.am 和 Makefile.in?

    这两个文件多出现在开源项目中 它们的用途是什么 它们如何工作 Makefile am是程序员定义的文件 由automake生成Makefile in文件 am代表autom阿克 这configure通常在源 tarball 中看到的脚本将使
  • Windows 上使用 g++ 的 Makefile,链接库

    我已经厌倦了 MSVC 6 以及每个人总是告诉我它是一个蹩脚的编译器等等 所以现在我决定尝试使用 vim 加 g 和 makefile 这是我的问题 我有以下 makefile This is supposed to be a commen

随机推荐

  • java.io.FileNotFoundException:/storage/emulated/0/Notes/fact50Result.txt:打开失败的ENOENT(没有这样的文件或目录)

    我正在尝试将阶乘计算的结果导出到 txt 文件中 我发现这段代码从这篇文章中看起来非常简单here https stackoverflow com questions 8152125 how to create text file and
  • 用层次结构和类替换数组可以吗?

    在我的实现中 我应该使用一个长数组 但数组的问题是它的索引对我来说没有多大意义 相反 我想使用层次结构类 然而 有时我需要以批量方式处理它们 例如在计算差异和导数或平均值时 所有成员都是double并且看起来对齐不会产生任何问题 下面是一个
  • MomentJS 设置时区而不更改时间

    我正在尝试在 moment js 中设置日期的时区而不更改时间值 我得到一个 UTC 日期 date toString Sun Sep 27 2015 00 00 00 GMT 0000 我需要设置时区而不更改时间 Sun Sep 27 2
  • WeakHashMap 的 keySet 条目永远不会为空吗?

    如果我迭代 WeakHashMap 的键集 是否需要检查 null 值 WeakHashMap
  • Objective-C++ 的缺点? [关闭]

    就目前情况而言 这个问题不太适合我们的问答形式 我们希望答案得到事实 参考资料或专业知识的支持 但这个问题可能会引发辩论 争论 民意调查或扩展讨论 如果您觉得这个问题可以改进并可能重新开放 访问帮助中心 help reopen questi
  • 照片上传 CodeIgniter

    当我使用 CodeIgniter 上传照片时 图像的名称会更改为随机名称 例如 107fb08f4a11cc37a040237cdcf0e48a jpg 我在视图中显示数据库中的图像时遇到问题 因为它显示的是原始上传名称而不是新名称 如何禁
  • Vaadin - 根据内容为表格单元格着色

    我在这里有一个非常基本的示例 我尝试根据该单元格中存在的特定字符串值为特定单元格着色 我输入打印语句 然后点击返回 绿色 返回 橙色 等点 但在运行时我只得到灰色和白色交替的行颜色 而不是我的特定单元格颜色 我使用的 css 是直接从 va
  • Octave 中的折叠功能

    Octave 中的一维向量是否有折叠 减少 聚合等 的标准实现 如果没有 有没有办法在不使用循环语句的情况下表达折叠 The miscellaneous http octave sourceforge net miscellaneous i
  • 使用 MQTT Android 服务从飞行模式重新连接

    我正在实现此处找到的 Dale Lane MQTT Android 服务示例http dalelane co uk blog p 1599 http dalelane co uk blog p 1599 这个例子对于我的特定目的来说工作得很
  • 访问 YouTube 用户上传 Feed 中超过 start_index=1000 的项目

    我目前正在尝试从 YouTube 用户上传源中提取有关视频的数据 此 Feed 包含特定用户上传的所有视频 可通过以下请求从 API 访问 http gdata youtube com feeds api users USERNAME up
  • WPF 圆角文本框

    我不了解WPF 现在正在学习它 我一直在寻找圆角TextBox在 WPF 中 于是我用Google搜索了一下 找到了一段XAML
  • Tomcat Catalina 上下文 - 将现有 servlet 添加到上下文

    我想将现有的 servlet 添加到上下文中 并且当我使用 Main java 时它可以工作 Tomcat addServlet ctx MyServlet new MyServlet ctx addServletMappingDecode
  • pandas 和seaborn 的堆叠密度图

    我正在尝试从 pandas 数据框中获取以下图 我不知道如何将seaborn 与pandas 结合起来完成这项任务 这是我想使用的数据框 import pandas as pd data pd DataFrame a np random r
  • CV2 Python VideoCapture(0) 意外参数

    我有一个简短的 python 脚本 它将打开网络摄像头并在本地网站上显示实时信息 我正在使用 PyCharm IDE 它提供更正并在出现语法错误时通知您 当我将参数传递给 VideoCapture 时 它 会突出显示该参数并显示 意外的参数
  • 如何在 C# 中将 CRC32 计算为有符号整数?

    我是一名 PHP 开发人员 对 C 有点不熟悉 在PHP中 有一个crc32 函数 http www php net manual en function crc32 php它为您传入的任何字符串返回一个有符号整数 所以这就是我习惯的
  • 在 JavaScript 中的正则表达式中使用变量

    使用正则表达式匹配此模式 5h 到 6h 4am 到 9am 3pm 到 8pm 4h 到 9pm 我已经有了正则表达式 5h 4pm 5am 我想使用这个正则表达式来匹配凌晨 4 点到上午 9 点 like var reg expr d
  • TransactionScope 锁定表和 IsolationLevel

    我想用TransactionScope在我的项目中 我读到它 发现它在数据库中创建了一个隐式事务 我想知道是否是这样TransactionScope锁定它操作的表 例如在这段代码中 using Entities ent new Entiti
  • SwiftUi 无法同时满足约束 - 当焦点位于文本字段和键盘打开时

    当我打开带有文本字段的工作表 并将焦点放在文本字段上时 会出现键盘并显示此消息 2021 02 06 22 29 35 817858 0100 OrientationEPS 4026 269878 LayoutConstraints Una
  • WordPress 如何将帖子链接到其数据库中的类别?

    目前 我使用以下 mysql 查询在站点博客的页脚中显示最后 5 篇帖子的列表 SELECT post title guid post date FROM wp posts WHERE post type post AND post sta
  • 如何在 makefile 中用点分割字符串

    我有这样的目标 test export var1 basename export var2 subst suffix 我用喜欢test var1 var2 现在我想做一个像test var1 var2 var3我怎样才能在makefile中