我在我的 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 特殊目标中。)
下面的代码在 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)
为什么规则中有两个冒号?这是什么意思?
对于 C 库,由于内存问题,我需要检查当前编译器是否适用于 x86_64。我发现的命令完全符合我的要求:
CXXARCH:=$(${CXX} -dumpmachine | grep -i 'x86_64')
Run Code Online (Sandbox Code Playgroud)
哪里${CXX}是gcc或clang。对于x86_64机器,这将返回一个非空字符串。对于 32 位机器,比如 Raspberry Pi,这将是空的。
我如何区分这两种情况?
我这样做了:
ifneq (${CXXARCH},)
MAGICVAR:=-DMY_DEFINE
endif
Run Code Online (Sandbox Code Playgroud)
通过$(info)打印,我确保在 Raspberry Pi 中没有满足这个条件,它应该满足,因为命令clang-6.0 -dumpmachine返回:armv7l-unknown-linux-gnueabihf。那么为什么这个条件没有被执行呢?我究竟做错了什么?
我有一个非常大且复杂的 make 系统,需要几个小时才能完成。我正在研究潜在的优化,我有一个关于是否可以优先考虑某些目标的问题。
下面是一个简单的 Makefile 示例,它说明了这个概念:
Test%: Prog%
#run some post build verification on Prog{n}
# -- takes 30min or less on failure...
Prog1: A B
# do some linking
Prog2: B C
# do some linking
A B C:
# take 10 minutes each
Run Code Online (Sandbox Code Playgroud)
然后我跑
make -j2 Prog1 Test2
Run Code Online (Sandbox Code Playgroud)
那么构建它的最快方法是:B& C,然后是Prog2& A,然后是Test2and Prog2。当然,通常情况下,化妆将建立A和B第一,这将减少10分钟耽误我最终输出。
如果我预知这Test2将成为瓶颈,是否可以将该目标及其所有依赖项优先于 gnu make 中的其他目标?
要添加的问题,比方说我要建Test1,Test2...... Test20。那么在这种情况下,我希望其中一个目标 …
当我试图读取带有嵌套逻辑的 makefile 时,这是我身边的一个不断刺痛的问题,Make不允许缩进if语句。为什么会这样,是否有解决此限制的好方法,并且仍然具有可读的 makefile?
更新:我现在意识到这个问题是基于一个错误的前提,但我相信把它留在这里对任何犯了和我一样的错误的人来说都是有价值的。
我正在尝试 GNU Make 分组目标,但似乎误解了一些东西,因为目标没有按照我的预期分组。这是我的生成文件:
all: foo bar
.PHONY: foo bar
foo bar &:
@echo grouped target run for \"target\" $@
Run Code Online (Sandbox Code Playgroud)
和输出:
$ make
grouped target run for "target" foo
grouped target run for "target" bar
Run Code Online (Sandbox Code Playgroud)
配方针对每个目标运行,因此未分组。我在这里缺少什么?
GNU Make 版本 4.2.1。