解决GNU Make foreach空格处理及OpenSCAD通用Makefile问题
修复OpenSCAD通用Makefile的空格参数与硬编码问题
问题根源
- 空格参数集处理失败:原脚本未对带空格的参数名称做转义,shell会将空格作为分隔符拆分参数,导致OpenSCAD调用出错。
- 文件名硬编码:无法自动适配目录中所有
.scad/.json文件对,扩展性差。
修复后的通用Makefile
# OpenSCAD命令路径,根据你的安装位置调整 OPENSCAD := openscad # 自动扫描当前目录下所有.scad文件 SCAD_FILES := $(wildcard *.scad) # 关联对应的.json文件(假设scad和json同名,比如foo.scad对应foo.json) JSON_FILES := $(SCAD_FILES:.scad=.json) # 输出目录 OUTPUT_DIR := output # 生成所有目标:每个参数集对应一个STL文件 all: $(foreach scad,$(SCAD_FILES),$(call generate_targets,$(scad))) # 定义生成目标的函数:输入scad文件,输出所有对应参数集的STL路径 define generate_targets $(shell jq -r '.parameter_sets | keys[] | @sh' $(1:.scad=.json) | sed "s/'//g" | while read param; do \ echo $(OUTPUT_DIR)/$(basename $(1))_$$(echo $$param | tr ' ' '_').stl; \ done) endef # 创建输出目录 $(OUTPUT_DIR): mkdir -p $@ # 参数集STL生成规则 $(OUTPUT_DIR)/%.stl: %.scad %.json $(OUTPUT_DIR) # 提取当前目标对应的参数集名称(从文件名反推) PARAM_NAME=$(subst _,$(space),$(subst $(basename $<)_,,$(notdir $@:.stl=))) # 调用OpenSCAD生成STL,用引号包裹带空格的参数集名称 $(OPENSCAD) -o "$@" --parameter-set "$${PARAM_NAME}" "$<" # 空格变量,用于替换下划线为空格 space := space += # 清理生成的STL文件 clean: rm -rf $(OUTPUT_DIR)
关键修复点说明
自动扫描文件:
- 用
$(wildcard *.scad)自动获取所有.scad文件,无需硬编码文件名。 - 通过
$(SCAD_FILES:.scad=.json)自动关联同名的参数配置文件。
- 用
安全处理带空格的参数集:
- 用
jq的@sh过滤器将参数集名称转为shell安全的字符串(自动添加引号),再通过sed去除引号后循环处理。 - 输出文件名将空格替换为下划线(
tr ' ' '_'),避免Makefile处理带空格文件名的潜在问题;生成时再通过subst将下划线转回空格,传递给OpenSCAD。
- 用
通用生成规则:
- 用模式规则
$(OUTPUT_DIR)/%.stl匹配所有目标文件,结合参数集名称反推对应的.scad和.json文件。 - 确保调用OpenSCAD时,用双引号包裹输出路径和参数集名称,避免空格拆分。
- 用模式规则
示例用法
假设目录中有box.scad和box.json,json内容如下:
{ "parameter_sets": { "Small Box": { "size": [50,50,20] }, "Large Box With Handle": { "size": [100,100,40], "has_handle": true } } }
运行make后,会自动创建output目录,并生成:
output/box_Small_Box.stloutput/box_Large_Box_With_Handle.stl
内容的提问来源于stack exchange,提问作者nomike
相关产品推荐
相关产品推荐

