Make 3.82:如何向文件写入多行参数化内容?
解决Make 3.82中多行参数化内容写入文件的问题
你的代码存在几个核心问题导致写入空行:
- 命令行未以tab开头(Make规则中的shell命令必须以tab缩进,否则会被解析为Make语法而非执行命令)
echo命令处理多行内容时,会将换行符转换为空格,且双引号的转义逻辑在Make与shell的交互中容易出错
针对Make 3.82不支持file函数的限制,推荐以下两种可靠方案:
方案一:使用Shell Here-Document(最直观)
利用shell的here-doc语法,直接让Make展开参数化内容后写入文件:
param1 = param1.h param2 = param2.h define multiline_param #include <$(1)> #include <$(2)> endef # 定义生成file.c的规则 file.c: @cat > $@ << 'EOF' $(call multiline_param,$(param1),$(param2)) EOF
<< 'EOF'中的单引号确保shell不会解析内部变量,完全由Make负责展开$(call)内容- 如果需要保留
multiline_param中的前导tab(比如代码缩进),可以在define中保留tab,写入的文件会同步保留 @符号用于抑制Make输出执行的命令(可选,去掉后会显示cat > file.c << 'EOF'等日志)
方案二:使用printf逐行输出
如果需要更精细控制换行,可结合printf命令:
param1 = param1.h param2 = param2.h define multiline_param #include <$(1)> #include <$(2)> endef file.c: @printf '%s\n' $(subst '\n', ' ', $(call multiline_param,$(param1),$(param2))) > $@
subst '\n', ' ', ...将define中的换行替换为空格,确保printf能正确识别每行参数- 这种方式适合需要对每行内容额外处理的场景
原代码问题解析
- 命令行缺少tab前缀:Make会将非tab开头的行解析为Make语法,而非执行shell命令,导致实际未执行echo写入操作
echo的多行处理缺陷:即使命令行正确,echo在处理包含换行的参数时,会将换行合并为空格,无法保留多行结构
内容的提问来源于stack exchange,提问作者DravStart
相关产品推荐
相关产品推荐

