Makefile:目标依赖项 - 如何始终制作它?

2024-02-28

This will most probably be obvious and / or a banality. But since I am trying different approaches for hours without success...

我使用的是 Linux Mint 19。我对 Makefile 完全陌生。对不起,如果问题很微不足道。

明确表示我关心的是distrib and SHA512SUMS仅针对此问题。

当我大量更改这些脚本的代码时,我希望SHA512SUMS每次运行时都会重新生成文件distrib目标,但如果我运行check当然,这将使check正如你所看到的,目标无关紧要。

对于 shell 脚本编写者来说,这个 Makefile 变得有点复杂。任何帮助将不胜感激。


PREFIX?=/usr/local/bin
install_path=$(DESTDIR)$(PREFIX)

encrypt_script=encrypt-file-aes256
decrypt_script=decrypt-file-aes256
distrib_name=openssl-file-encryption-decryption-shell-scripts

.PHONY: check install uninstall distrib

check: $(encrypt_script) $(decrypt_script) SHA512SUMS
    echo && sha512sum --check --status SHA512SUMS && ( echo "Ok. You may use 'sudo make install' or '(sudo) make install PREFIX=SomeDir' command now." ) || ( echo "ERROR: Files hash sum mismatch!" && echo && exit 1 )

install: check
    echo && [ -d $(install_path) ] || mkdir --parents $(install_path)
    install --verbose --mode=0755 --target-directory=$(install_path) $(encrypt_script) $(decrypt_script)

uninstall:
    rm $(install_path)/$(encrypt_script) $(install_path)/$(decrypt_script)
    rmdir --ignore-fail-on-non-empty $(install_path)

distrib: check $(encrypt_script) $(decrypt_script) Makefile SHA512SUMS
    if [ $$(id --user) -eq 0 ]; then ( echo && echo "Target 'distrib' has to be run as normal user!" && echo && exit 1 ) fi
    rm --force $(distrib_name).tar.xz
    rm --force $(distrib_name).tar.xz.asc
    rm --force --recursive $(distrib_name)
    mkdir $(distrib_name)
#   sha512sum $(encrypt_script) $(decrypt_script) > $(distrib_name)/SHA512SUMS
    cp $(encrypt_script) $(decrypt_script) Makefile SHA512SUMS $(distrib_name)
    wget --quiet --output-document=$(distrib_name)/LICENSE https://git.io/fxByv # https://raw.githubusercontent.com/burianvlastimil/openssl-file-encryption-decryption-shell-scripts/master/LICENSE
    wget --quiet --output-document=$(distrib_name)/README.md https://git.io/fxByJ # https://raw.githubusercontent.com/burianvlastimil/openssl-file-encryption-decryption-shell-scripts/master/README.md
    chmod 755 $(distrib_name)/$(encrypt_script) $(distrib_name)/$(decrypt_script)
    chmod 644 $(distrib_name)/Makefile $(distrib_name)/SHA512SUMS $(distrib_name)/LICENSE $(distrib_name)/README.md
    tar --create --file=$(distrib_name).tar $(distrib_name)
    xz --format=xz -9 --extreme --check=sha256 $(distrib_name).tar
    rm --force --recursive $(distrib_name)
    gpg --local-user 7D2E022E39A88ACF3EF6D4498F37AF4CE46008C3 --sign --armor --output $(distrib_name).tar.xz.asc --detach-sig $(distrib_name).tar.xz

SHA512SUMS:
    sha512sum --check --status SHA512SUMS || sha512sum $(encrypt_script) $(decrypt_script) > SHA512SUMS

继续阅读强制目标 https://www.gnu.org/software/make/manual/html_node/Force-Targets.html,我希望有一个解决方案如下:

如果规则没有先决条件或配方,并且规则的目标是不存在的文件,则 make 会在其规则运行时假设该目标已更新。这意味着依赖于该目标的所有目标将始终运行其配方。

因此,我创建了一个空目标force-rebuild-hash-file:.

就这样SHA512SUM当调用此目标或时,文件将始终被重新创建distrib目标取决于它。

我想总体上已经解决了,如果没有,请随意发表评论。

如果您或我本人发现任何错误,我将更新此答案以反映它们。

为了消除我遇到的一些代码的重复这个答案 https://stackoverflow.com/a/27132934/1997354并应用它。

我改名了SHA512SUMS to SHA512SUM,没多大关系,但是我觉得用的比较多。

I found $@打印目标名称是跟踪正在运行的目标的好方法。例如,如果SHA512SUM不存在,我们这样安装:

make install PREFIX=./test

我们得到了一个非常好的概述(输出):

echo && echo Target: check && echo

Target: check

if [ -f SHA512SUM ]; then ( echo && sha512sum --check SHA512SUM && ( echo && echo "Ok. You may use 'sudo make install' or '(sudo) make install PREFIX=SomeDir' command now." ) || ( echo && echo "ERROR: Files hash sum mismatch!" && echo && exit 1 ) ) else make --file=Makefile SHA512SUM; fi
make[1]: Entering directory '/home/vlastimil/Development/sh/openssl-encryption'
echo && echo Target: SHA512SUM && echo

Target: SHA512SUM

sha512sum encrypt-file-aes256 decrypt-file-aes256 > SHA512SUM
make[1]: Leaving directory '/home/vlastimil/Development/sh/openssl-encryption'
echo && echo Target: install && echo

Target: install

echo && [ -d ./test ] || mkdir --parents ./test

install --verbose --mode=0755 --target-directory=./test encrypt-file-aes256 decrypt-file-aes256
'encrypt-file-aes256' -> './test/encrypt-file-aes256'
'decrypt-file-aes256' -> './test/decrypt-file-aes256'

当前的生成文件

DESTDIR ?=
PREFIX ?= /usr/local/bin
install_path := $(DESTDIR)$(PREFIX)
encrypt_script := encrypt-file-aes256
decrypt_script := decrypt-file-aes256
distrib_name := openssl-encryption
this_file := $(lastword $(MAKEFILE_LIST))

.PHONY: check install uninstall distrib

# https://stackoverflow.com/a/27132934/1997354
check: $(encrypt_script) $(decrypt_script)
    echo && echo Target: $@ && echo
    if [ -f SHA512SUM ]; then ( echo && sha512sum --check SHA512SUM && ( echo && echo "Ok. You may use 'sudo make install' or '(sudo) make install PREFIX=SomeDir' command now." ) || ( echo && echo "ERROR: Files hash sum mismatch!" && echo && exit 1 ) ) else $(MAKE) --file=$(this_file) SHA512SUM; fi

install: check
    echo && echo Target: $@ && echo
    echo && [ -d $(install_path) ] || mkdir --parents $(install_path)
    install --verbose --mode=0755 --target-directory=$(install_path) $(encrypt_script) $(decrypt_script)

uninstall:
    echo && echo Target: $@ && echo
    rm $(install_path)/$(encrypt_script) $(install_path)/$(decrypt_script)
    rmdir --ignore-fail-on-non-empty $(install_path)

distrib: SHA512SUM check $(encrypt_script) $(decrypt_script) Makefile
    echo && echo Target: $@ && echo
    # https://english.stackexchange.com/a/468131/319970
    # https://stackoverflow.com/a/52782747/1997354
    if [ $$(id --user) -eq 0 ]; then ( echo && echo "Target 'distrib' has to be run as normal user!" && echo && exit 1 ) fi
    rm --force $(distrib_name).tar.xz
    rm --force $(distrib_name).tar.xz.asc
    rm --force --recursive $(distrib_name)
    mkdir $(distrib_name)
    cp $(encrypt_script) $(decrypt_script) Makefile SHA512SUM $(distrib_name)
    wget --quiet --output-document=$(distrib_name)/LICENSE https://git.io/fxByv
    wget --quiet --output-document=$(distrib_name)/README https://git.io/fxByJ
    chmod 755 $(distrib_name)/$(encrypt_script) $(distrib_name)/$(decrypt_script)
    chmod 644 $(distrib_name)/Makefile $(distrib_name)/SHA512SUM $(distrib_name)/LICENSE $(distrib_name)/README
    tar --create --file=$(distrib_name).tar $(distrib_name)
    xz --format=xz -9 --extreme --check=sha256 $(distrib_name).tar
    rm --force --recursive $(distrib_name)
    gpg --local-user 7D2E022E39A88ACF3EF6D4498F37AF4CE46008C3 --sign --armor --output $(distrib_name).tar.xz.asc --detach-sig $(distrib_name).tar.xz

# https://www.gnu.org/software/make/manual/html_node/Force-Targets.html
force-rebuild-hash-file:

# real target file
SHA512SUM: force-rebuild-hash-file
    echo && echo Target: $@ && echo
    sha512sum $(encrypt_script) $(decrypt_script) > SHA512SUM
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Makefile:目标依赖项 - 如何始终制作它? 的相关文章

  • sed 错误“未终止的 's' 命令”故障排除

    我正在构建一个script https stackoverflow com questions 4036832 replacing a specific term in an xml file其中 它将用文件夹路径替换 XML 文件中的模式
  • 在 iOS 模拟器中安装应用程序的脚本

    我正在尝试自动化构建应用程序 运行单元测试以及最终运行 UI 测试的过程 我正在通过命令行 xcodebuild sdk iphonesimulator6 0 在某个目录中构建应用程序 如何通过命令行 在 Library Applicati
  • 如何在apache 2.4.6上安装apxs模块

    我刚刚用过apt get update我的 apache 已更新为2 4 6 我想安装 apxs 来编译模块 但收到此错误 The following packages have unmet dependencies apache2 pre
  • Linux:如何从特定端口发送TCP数据包?

    如何打开原始套接字以从特定 TCP 端口发送 我希望所有连接始终来自临时端口以下的一系列端口 如果您正在使用raw套接字 然后只需在数据包标头中填写正确的 TCP 源端口即可 相反 如果您使用 TCP 套接字接口 socket connec
  • 从 shell 命令调用 SOAP 请求

    我使用curl 向Web 服务发送SOAP 请求 并使用shell 脚本获取响应 请在下面找到我正在使用的命令 curl H Content Type text xml charset utf 8 H SOAPAction d sample
  • 使用 awk 读取文件并搜索另一个文件

    我正在读取一个文件 每行都有数字 我需要搜索另一个满足这些数字和其他条件的文件 我正在尝试使用 awk 来做到这一点 但遇到了问题 File a txt 1476 1477 1497 现在我需要打印第 12 列包含这些数字的行以及第 3 列
  • 从 UNIX 命令行向串行端口发送字节?

    我想使用命令行将字节流发送到串行端口 这可能吗 我的串口位于 dev cu usbserial A700dYoR在我的 Mac 上 例如 如果我想将整数 50 或字符串 data 发送到该串行端口 我该怎么做 我对 UNIX 的了解非常有限
  • 如何授予 apache 使用 NTFS 分区上的目录的权限?

    我在一台带有 20GB 硬盘的旧机器上运行 Linux Lubutu 12 10 我有一个 1 TB 外部硬盘 上面有一个 NTFS 分区 在该分区上 有一个 www 目录 用于保存我的网页内容 它在启动时自动安装为 media t515
  • 为arm构建WebRTC

    我想为我的带有arm926ej s处理器的小机器构建webrtc 安装 depot tools 后 我执行了以下步骤 gclient config http webrtc googlecode com svn trunk gclient s
  • 如何从我自己的脚本向 Fish shell 提供制表符补全?

    我运行的是 Ubuntu 13 10 和 Fish 2 1 0 我想自己编写一个 Python 脚本来从命令行执行一些任务 该脚本将需要命令行参数 我怎样才能编写我的脚本 以便 Fish 可以请求并获取给定参数的可能值 潜在值列表是动态的
  • ftrace:仅打印trace_printk()的输出

    是否可以只转储trace printk 输出于trace文件 我的意思是过滤掉函数跟踪器 或任何其他跟踪器 中的所有函数 一般来说 您可以在选项目录中关闭选项 sys kernel debug tracing options Use ls显
  • 是否可以创建一个脚本来保存和恢复权限?

    我正在使用 Linux 系统 需要对一组嵌套文件和目录进行一些权限实验 我想知道是否没有某种方法可以保存文件和目录的权限 而不保存文件本身 换句话说 我想保存权限 编辑一些文件 调整一些权限 然后将权限恢复到目录结构中 将更改的文件保留在适
  • Linux 上的用户空间能否实现本机代码的抢占式多任务处理?

    我想知道是否可以在 Linux 用户空间的单个进程中实现本机代码的抢占式多任务处理 也就是说 从外部暂停一些正在运行的本机代码 保存上下文 交换到不同的上下文 然后恢复执行 所有这些都由用户空间精心安排 但使用可能进入内核的调用 我认为这可
  • 删除 Git 存储库,但保留所有文件

    在我使用 Linux 的过程中的某个时刻 我决定将我的主目录中的所有内容都放入源代码管理中是个好主意 我不是在问这是否是一个好主意 我是在问如何撤销它 删除存储库的原因是我最近安装了 Oh My Zsh 而且我非常喜欢它 问题是我的主目录有
  • 当 grep "\\" XXFile 我得到“尾随反斜杠”

    现在我想查找是否有包含 字符的行 我试过grep XXFile但它暗示 尾随反斜杠 但当我尝试时grep XXFile没关系 谁能解释一下为什么第一个案例无法运行 谢谢 区别在于 shell 处理反斜杠的方式 当你写的时候 在双引号中 sh
  • “make install”将库安装在 /usr/lib 而不是 /usr/lib64

    我正在尝试在 64 位 CentOS 7 2 上构建并安装一个库 为了这个目的我正在跑步 cmake DCMAKE BUILD TYPE Release DCMAKE INSTALL PREFIX usr DCMAKE C COMPILER
  • Linux:如何设置进程的时区?

    我需要设置在 Linux 机器上启动的各个进程的时区 我尝试设置TZ变量 在本地上下文中 但它不起作用 有没有一种方法可以使用与系统日期不同的系统日期从命令行运行应用程序 这可能听起来很愚蠢 但我需要一种sandbox系统日期将被更改的地方
  • 在两次之间每分钟执行一次 Cronjob

    我需要在 crontab 中每分钟运行一个 bash 脚本8 45am and 9 50am每天的 Code 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 8 home pull sh gt ho
  • 监视目录的更改

    很像一个类似的问题 https stackoverflow com questions 112276 directory modification monitoring 我正在尝试监视 Linux 机器上的目录以添加新文件 并希望在这些新文
  • 如何在c linux中收听特定接口上的广播?

    我目前可以通过执行以下操作来收听我编写的简单广播服务器 仅广播 hello int fd socket PF INET SOCK DGRAM 0 struct sockaddr in addr memset addr 0 sizeof ad

随机推荐

  • 如何解码包含 \x3c 等的 Feedburner 结果

    Feed Burner 更改了他们的博客服务返回结果 它返回类似于以下内容的 JavaScript 块 文档 write x3cdiv 类 x3d x22feedburnerFeedBlock x22 id x3d x22RitterIns
  • Office.js |在 Excel 加载项中实施单点登录

    我正在使用 Office js javascript 和 React 创建 Excel 加载项 想要使用功能区按钮实现单点登录流程 用户成功登录后只想向用户显示任务窗格 我已经使用共享运行时 manifest xml 配置了加载项 我已在功
  • vb.net中如何转换日期格式?

    我收到的 xml 响应日期格式字符串是 MM dd yyyy h mm ss a 但我需要转换其他日期格式 dd MMM yy HH mm vb net中如何转换日期格式 请给我任何建议 假设您想将 xml 字符串值转换为正确的值DateT
  • 每次按下菜单按钮时都会双重回调 onMenuOpened/onPanelClosed

    在我的 Android 应用程序中 我想收集有关何时 多久 打开和关闭溢出 三个点 操作栏菜单 未选择项目 的统计信息 对于这个任务我已经覆盖了onMenuOpened and onPanelClosed内的方法Activity 然而 在所
  • 从 Java 拖放到 Windows 资源管理器

    我想用 Java 创建一个应用程序 列出一个目录并向其添加拖放支持 以便将文件从该目录复制到打开的资源管理器窗口 反之亦然 Windows 系统 虽然添加对从 Windows 资源管理器到 Java 应用程序的拖放的支持非常容易 但当操作从
  • oracle sql listagg [重复]

    这个问题在这里已经有答案了 SELECT deptno LISTAGG ename WITHIN GROUP ORDER BY ename AS employees FROM emp GROUP BY deptno 错误 ORA 00923
  • Java如何访问try-catch块之外的变量

    我是java初学者 正在玩try catch块 但是 我无法获取try catch块之外的变量 以下代码有效 class factorial public static void main String args try int num I
  • Buildroot:仅构建一个包作为共享和静态库,所有其他包仅共享

    buildroot 提供了构建的可能性 仅静态 只分享 或共享库和静态库 所选软件包的数量 分配的配置元素是BR2 STATIC LIBS BR2 STATIC LIBS and BR2 SHARED STATIC LIBS 问题 是否可以
  • ECS 任务/容器的 Terraform AWS CloudWatch 日志组

    我正在尝试使用 Terraform 创建一个 AWS ECS 任务 它将日志放入 CloudWatch 上的特定日志组中 问题是容器定义位于 JSON 文件中 我无法将 CloudWatch 组名称从 tf 文件映射到该 json 文件 容
  • 打破 tcl 中的父循环

    我在 while 循环中有一个 for 循环 我有一个条件要打破 for 循环中的 while 这是代码 while gets thefile line gt 0 for set i 1 i lt count table incr i if
  • 计算两个 GPS 坐标之间的罗盘方位时出现问题

    在我的 web 应用程序中 有一个来自数据库查询的 JSON 数据响应 其中包括 1 到 n 个位置的纬度 经度坐标 我想计算轴承data i 位置到当前位置 我一直在调整代码here http www movable type co uk
  • 如何在spray-json中表示可选字段?

    我的请求有一个可选字段 case class SearchRequest url String nextAt Option Date 我的协议是 object SearchRequestJsonProtocol extends Defaul
  • 获取this.title属性的前2个字符,并调用对应的id

    我试图检索链接标题属性的前两个字符 将其存储到变量中 然后将该变量作为函数调用 在代码中 它说 s 是我想要放置该值的位置 有任何想法吗 flow click function if labelstatus 1 rmflow a weflo
  • 错误:“使用移动值”

    我目前正在学习 Rust 并且正在使用一个简单的计算器 重构时 我最终得到了如下代码 enum OptionalToken Foo Bar fn next token gt OptionalToken Read input classify
  • JavaScript:如何动态“过滤”我的对象

    我如何使用 JavaScript filter 属性作为过滤器我的 JavaScript 对象 我一直在阅读以下内容StackOverflow 帖子 https stackoverflow com questions 1694717 jav
  • 如何使用 Firefox Addon Builder 记录选定的文本?

    我遵循了几个教程但没有成功 我认为这是一个经典的例子 但我无法让它发挥作用 我可以保存我的项目 安装插件 当我选择一些文本时 我可以看到上下文菜单项 日志选择 但是当我单击它时 什么也没有发生 exports main function v
  • jquery 上下文选择器与 .find()

    什么更有效 var container container 1 var links1 container find a 2 var links2 a container 我个人比较喜欢 a container 因为看起来更好 但是它们的性能
  • Makefile `echo -n' 不起作用

    我试图让我的 Makefile 回显文本而不带尾随换行符 但我做不到 我在 OS X 上遇到了这种行为 在 Linux 上一切都按预期工作 Makefile a echo n hello b echo n hello c bin echo
  • 根据控制器响应动态更改视图部分

    我正在寻找以下场景的最佳方法建议 用户可以选择一个或多个 csv 文件进行验证 附件 1 单击 验证 按钮会执行验证代码 显示进度条 直到返回输出 返回响应可以是成功消息 也可以是选择验证的每个文件的错误详细信息 附件 2 现在可以使用 上
  • Makefile:目标依赖项 - 如何始终制作它?

    This will most probably be obvious and or a banality But since I am trying different approaches for hours without succes