标签: gnu-make

如何在make中中断一个进程而不中断make进程

我从 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 kill process gnu-make

5
推荐指数
1
解决办法
1291
查看次数

递归调用中的并行构建作业数

我有一个 makefile,它将真正的构建包装在单个递归调用中,以便获取并发布围绕构建的许可证,无论构建是否成功。例子:

\n\n
.PHONY main_target\nmain_target:\n    @license_grab &\n    @sleep 2\n    -@$(MAKE) real_target\n    @license_release\n
Run Code Online (Sandbox Code Playgroud)\n\n

这非常有效,直到我想并行运行 make 为止。在某些系统上它工作正常,但在其他系统上,当将选项传递给子 make时,我遇到了 -j 标志记录的问题:

\n\n
\n

如果您的操作系统不支持上述通信,则 \xe2\x80\x98-j 1\xe2\x80\x99 始终会放入 MAKEFLAGS 而不是您指定的值。这是因为,如果将 \xe2\x80\x98-j\xe2\x80\x99 选项传递给子品牌,则并行运行的作业将比您要求的多得多。

\n
\n\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

\n\n

但是,我更愿意只使用标准 make 参数,而不是添加对变量的额外依赖项。我还希望尽可能少地修改 makefile。

\n

makefile gnu-make

5
推荐指数
1
解决办法
3553
查看次数

GNU make 自动依赖生成

最近在学习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)

谁能解释一下背后的原因吗?谢谢。

linux sed gnu-make

5
推荐指数
1
解决办法
340
查看次数

如何在 makefile 的另一个规则中运行模式规则?

我希望编写一个 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 gnu-make

5
推荐指数
1
解决办法
1826
查看次数

如何将值中带有空格的变量作为单个参数传递给 GNU make 函数?

这是我的 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提供了三个单独的参数:/dir1/file1.txt,因此notdir 返回了它们的部分:dirfile1.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 gnu-make

5
推荐指数
0
解决办法
3333
查看次数

如何强制 make 始终更新并重新读取包含的 makefile?

我有一个Makefile生成 a 的文件makefile.mk,它随后包含在主 makefile 中。因为输入文件集(*.in在本例中)可以随时更改,所以我需要makefile.mk为每个文件重新生成一次make运行重新生成一次。

\n\n

文档指出include

\n\n
\n

一旦完成读取 makefile,make 将尝试重新生成任何已过期或不存在的 [included makefile]。

\n
\n\n

以及如何重新制作 Makefile

\n\n
\n

[A]读入所有 makefile 后,make 会将每个 makefile 视为目标并尝试更新它。如果 makefile 有一条规则说明如何更新它 [...],则如有必要,它将被更新。检查完所有 makefile 后,如果确实有任何更改,make 将从头开始并重新读取所有 makefile。

\n
\n\n

基于此,我认为以下应该有效:

\n\n
include 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 gnu-make

5
推荐指数
1
解决办法
3330
查看次数

如何跟踪 Makefile 行号以进行故障排除?

这与如何跟踪 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)

makefile gnu-make

5
推荐指数
1
解决办法
4698
查看次数

摆脱“禁用作业服务器模式”警告?

在我的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.一切正常,但如何删除此警告?

makefile cmake gnu-make

5
推荐指数
1
解决办法
3245
查看次数

命令替换不适用于 makefile 中的 echo

这是一个在我的 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 正确地进行命令替换输出?

bash shell scripting makefile gnu-make

5
推荐指数
1
解决办法
1762
查看次数

如果分配给变量的 shell 命令失败,如何使 GNU Make 失败?

我有一个 Make 变量:

PASSWORD:=$(shell vault read -field=password test/password)
Run Code Online (Sandbox Code Playgroud)

如果vault未安装,make将打印make: vault: Command not found,但继续执行配方。如果表达式失败,如何使其失败并停止执行?

makefile gnu-make

5
推荐指数
2
解决办法
1451
查看次数

标签 统计

gnu-make ×10

makefile ×9

bash ×1

cmake ×1

kill ×1

linux ×1

process ×1

scripting ×1

sed ×1

shell ×1