我从 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最近在学习GNU make。以下是 GNU make 手册中自动生成依赖项的示例。我知道上面脚本的一般含义(它基本上是用命令用其他东西替换一些东西sed)。但我对命令中的细节有两个问题。\1.o首先,命令中的含义是什么?与位置参数有关吗?其次,为什么$*要放入一对,()因为$*它本身已经意味着目标文件名的主干?(我尝试不加括号,但没有成功。)
%.d: %.c
$(CC) -M $(CPPFLAGS) $< > $@.$$$$; \
sed 's,\($*\)\.o[ :]*,\1.o $@ : ,g' < $@.$$$$ > $@; \
rm -f $@.$$$$
Run Code Online (Sandbox Code Playgroud)
我尝试了以下方法,但没有成功。
%.d: %.c
$(CC) -M $(CPPFLAGS) $< > $@.$$$$; \
sed 's,$*\.o[ :]*,\1.o $@ : ,g' < $@.$$$$ > $@; \
rm -f $@.$$$$
Run Code Online (Sandbox Code Playgroud)
谁能解释一下背后的原因吗?谢谢。
我希望编写一个 makefile 来自动编译我正在处理的项目,其中文件的数量可能会或可能不会改变。我还需要能够快速告诉 make 将文件编译为调试版本或发布版本(通过命令行定义区分)。经过一番研究,我发现了模式规则并制定了一个。这是我到目前为止的代码:
# Our folders
# ODIR - The .o file directory
# CDIR - The .cpp file directory
# HDIR - The .hpp file directory
ODIR = obj
CDIR = src
HDIR = inc
# Get our compiler and compiler commands out of the way
# CC - Our compiler
# CFNO - Our compiler flags for when we don't have an output file
# CF - Our compiler flags. This should be appended to any …Run Code Online (Sandbox Code Playgroud) 这是我的 Makefile。
MYPATH = /dir 1/file 1.txt
test1:
echo $(notdir $(MYPATH))
test2:
echo $(notdir "$(MYPATH)")
test3:
echo TODO
Run Code Online (Sandbox Code Playgroud)
我的目的是仅获取file 1.txt来自 的路径的一部分
/dir 1/file 1.txt。是的,这是一条有空格的路径。
我无法得到想要的结果。
$ make test1
echo dir file 1.txt
dir file 1.txt
Run Code Online (Sandbox Code Playgroud)
在上面的输出中,似乎notdir提供了三个单独的参数:/dir、1/file和1.txt,因此notdir
返回了它们的部分:dir、file和1.txt。
以下根本不起作用。
$ make test2
echo dir file 1.txt"
/bin/sh: 1: Syntax error: Unterminated quoted string
Makefile:7: recipe for target 'test2' failed
make: *** [test2] Error …Run Code Online (Sandbox Code Playgroud) 我有一个Makefile生成 a 的文件makefile.mk,它随后包含在主 makefile 中。因为输入文件集(*.in在本例中)可以随时更改,所以我需要makefile.mk为每个文件重新生成一次make运行重新生成一次。
文档指出include:
\n\n\n\n\n一旦完成读取 makefile,make 将尝试重新生成任何已过期或不存在的 [included makefile]。
\n
\n\n\n[A]读入所有 makefile 后,make 会将每个 makefile 视为目标并尝试更新它。如果 makefile 有一条规则说明如何更新它 [...],则如有必要,它将被更新。检查完所有 makefile 后,如果确实有任何更改,make 将从头开始并重新读取所有 makefile。
\n
基于此,我认为以下应该有效:
\n\ninclude makefile.mk\n\nmakefile.mk:\n echo "--- Begin makefile.mk ---"\n @( \\\n shopt -q -s nullglob; \\\n INPUTS=(*.in); \\\n echo "all:" $${INPUTS//.in/.out}; \\\n for f in $$INPUTS; do \\\n echo "$${f/.in/.out}: $$f"; …Run Code Online (Sandbox Code Playgroud) 这与如何跟踪 Makefile 目标进行故障排除有关?我正在使用旧的 PowerMac G5。它之所以存在,是因为我用它来测试较旧的编译器和大端、PowerPC。
我试图确定 makefile 中的哪一行导致了unexpected EOF while looking for matching ``'. 我们的makefile 不使用反引号(我们添加它们是为了测试这个问题);对于具有 1000 行的 makefile 来说,尝试/错误和猜测的速度太慢。
当我运行 make with 时--debug,它无法打印行号:
$ make --debug=a
GNU Make 3.82
Built for powerpc-apple-darwin9.8.0
...
Reading makefiles...
Reading makefile `GNUmakefile'...
bash: -c: line 0: unexpected EOF while looking for matching ``'
bash: -c: line 1: syntax error: unexpected end of file
bash: -c: line 0: unexpected EOF while looking for matching ``'
bash: …Run Code Online (Sandbox Code Playgroud) 在我的CMakeLists.txt文件中,我使用自定义命令
add_custom_command(TARGET my_target
POST_BUILD
COMMAND ${CMAKE_COMMAND} ${CMAKE_SOURCE_DIR}
COMMAND make -j`nproc`
WORKING_DIRECTORY ${CMAKE_BINARY_DIR})
Run Code Online (Sandbox Code Playgroud)
因为我想在构建后重新运行 make my_target。它显示此警告 -warning: -jN forced in submake: disabling jobserver mode.一切正常,但如何删除此警告?
这是一个在我的 bash shell 中运行良好的简单命令:
echo "Created at: $(date)" >> README.md
Run Code Online (Sandbox Code Playgroud)
它附加Created at: Wed Jan 24 10:04:48 STD 2018到 README.md。
但是,当我在 makefile 中包含相同的命令时,行为有所不同。
生成文件:
README.md:
echo "Created at: $(date)" >> README.md
Run Code Online (Sandbox Code Playgroud)
运行时make README.md会将命令替换视为空字符串,如下所示:
echo "Created at: " >> README.md
Run Code Online (Sandbox Code Playgroud)
README.md 中附加的内容是Created at:.
如何在 makefile 中使用 echo 正确地进行命令替换输出?
我有一个 Make 变量:
PASSWORD:=$(shell vault read -field=password test/password)
Run Code Online (Sandbox Code Playgroud)
如果vault未安装,make将打印make: vault: Command not found,但继续执行配方。如果表达式失败,如何使其失败并停止执行?