我在我的 Windows 机器上安装了最新的 GNU make。
安装程序决定将语言设置为操作系统语言,但我没有收到提示。我希望它是英文的。我的操作系统是瑞典语。
我记得我在另一个 GNU 程序中遇到了类似的问题(不记得是哪个),这是通过添加环境变量“lang”和值“c”来解决的。
如何将 GNU make 的语言切换为英语?
这是一个 Makefile 框架,只是为了更容易描述问题:
all_tests : unit_tests other_tests_1 other_tests_2 ... other_tests_N
unit_tests : set1_summary.txt set2_summary.txt ... setN_summary.txt
%_summary.txt : %_details.txt
perl createSummary.pl --in $^ -out $@
%_details.txt : test_harness
./test_harness --test-set $*
Run Code Online (Sandbox Code Playgroud)
因此,我有一个测试运行程序,可以生成包含详细结果的文件,然后使用过滤机制来创建摘要文件。
现在,如果测试集中的任何项目失败,测试运行程序应用程序将返回错误代码,这将正确中止“all_tests”目标并且永远不会调用 other_test 目标。但是,我想无条件地运行详细信息 -> 摘要转换,因为即使对于失败的测试运行,这也是相关的。
我尝试了一些不同的变体,但我可以使用的唯一方法是将整个命令链包装到 Perl 脚本中,存储第一个命令的结果并将其用作整个脚本的返回值。
但这感觉不是一个非常简洁的解决方案,特别是因为“实际”命令集比这个框架显示的要复杂一些。你知道有什么纯粹基于 GNU Make 的方法来完成这个任务吗?
我想在 make 文件中的每个 shell 命令上注入透明的换行命令。类似于 shell 命令之类的东西time。(但是,不是命令time。这是一个完全不同的命令。)
默认情况下,GNU Make 在文件上使用高分辨率时间戳。有什么办法可以关闭整个 makefile 的这个功能吗?(不仅仅是在.LOW_RESOLUTION_TIME 特殊目标中。)
鉴于master.makefile调用子makefile,例如:
downloads:
make -f downloads.makefile
Run Code Online (Sandbox Code Playgroud)
还有一个子makefile,downloads.makefile例如:
download: clean
curl -o ./data/<itemname>.png 'http://www.mysite.com/<itemname>.png'
echo "downloaded <itemname>: Done!"
Run Code Online (Sandbox Code Playgroud)
如何itemname在我的主文件中设置一个全局变量,可用于我的子制作文件?
注意:我的项目实际上更复杂,有 12 个不同的子 makefile,它们应该重用来自主文件的相同参数/变量。masterfile 应该分配值,而 sub-makefile 应该检索我放置的变量的值<itemname>。
我想根据当前目录中的默认 makefile 是否包含某个目标在 shell 中运行某些操作。
#!/bin/sh
make -q some_target
if test $? -le 1 ; then
true # do something
else
false # do something else
fi
Run Code Online (Sandbox Code Playgroud)
这是有效的,因为如果目标不存在,GNU make 会返回错误代码 2,否则返回 0 或 1。问题是没有以这种方式记录。这是男人的一部分:
-q, --question
``Question mode''. Do not run any commands, or print anything;
just return an exit status that is zero if the specified targets
are already up to date, nonzero otherwise.
Run Code Online (Sandbox Code Playgroud)
仅区分零/非零。这样做的正确方法是什么?
下面的代码在 ptxdist Makefile 中工作,但想知道是否有更好的解决方案来检查在继续构建之前是否安装了所有必需的软件包?
ENV_VERIFICATION:
@echo ------------START ENV VERIFICATION---------------
if ! dpkg -s sudo | grep Status | grep -q installed; then \
echo ERROR: sudo package not installed!; \
exit 1; \
fi
if ! dpkg -s scons | grep Status | grep -q installed; then \
echo scons package not installed!; \
exit 1; \
fi
@echo ------------END ENV VERIFICATION---------------
Run Code Online (Sandbox Code Playgroud)
我可以在我的系统中运行以下命令,最好在 make 日志中打印相同的命令,任何有助于改进上述代码并在日志中打印以下输出(如果安装了包)的帮助都是值得赞赏的。提前致谢!
$ dpkg-query -W -f='${Package} ${Status}\n' sudo
sudo install ok installed
Run Code Online (Sandbox Code Playgroud) 在 busybox Makefile 中,我看到
.tmp_kallsyms1.o .tmp_kallsyms2.o .tmp_kallsyms3.o: %.o: %.S scripts FORCE
$(call if_changed_dep,as_o_S)
Run Code Online (Sandbox Code Playgroud)
为什么规则中有两个冒号?这是什么意思?
我从 makefile 中得到了这一点,我从规则“调试”QEMU 开始,但在我需要使用kill -9 中断QEMU 的地方,也需要makekill:
debug: ${BINDIR}/main
${QEMU} -M versatilepb -m 128M -nographic -kernel $^ -s -S
$(MAKE) sane
gdb: ${BINDIR}/main
${GDB} ${BINDIR}/main
sane:
stty sane
Run Code Online (Sandbox Code Playgroud)
如何在不中断make进程的情况下中断make进程?
我有一个 makefile,它将真正的构建包装在单个递归调用中,以便获取并发布围绕构建的许可证,无论构建是否成功。例子:
\n\n.PHONY main_target\nmain_target:\n @license_grab &\n @sleep 2\n -@$(MAKE) real_target\n @license_release\nRun Code Online (Sandbox Code Playgroud)\n\n这非常有效,直到我想并行运行 make 为止。在某些系统上它工作正常,但在其他系统上,当将选项传递给子 make时,我遇到了 -j 标志记录的问题:
\n\n\n\n\n如果您的操作系统不支持上述通信,则 \xe2\x80\x98-j 1\xe2\x80\x99 始终会放入 MAKEFLAGS 而不是您指定的值。这是因为,如果将 \xe2\x80\x98-j\xe2\x80\x99 选项传递给子品牌,则并行运行的作业将比您要求的多得多。
\n
由于我只有一次递归调用,因此我真的很想将 -j 标志原封不动地传递给子 make。我不想将 -j 标志(带有数字)硬编码到 makefile 中,因为 makefile 在具有不同数量处理器的多台机器上运行。我不想无限制地使用 -j ,因为这会立即启动一堆进程,而不是等待作业完成。我在构建时尝试使用 -l 标志,但我发现限制不会立即应用,可能是因为限制在 make 可以开始采样之前才应用。
\n\n有没有办法强制子品牌使用多个作业?或者,一种使 -l 标志真正完成某事的方法?
\n\n我想我可以使用 makefile 修改来完成它-@$(MAKE) $(JOBS) real_target,例如 using 和调用 make like make JOBS="-j4" main_target。
但是,我更愿意只使用标准 make 参数,而不是添加对变量的额外依赖项。我还希望尽可能少地修改 makefile。
\n