You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在Makefile中实现源于其他目标的动态依赖?

实现无Sub-Make的动态依赖方案

当然可以!你完全不需要通过子Make调用传递项目列表,利用Make的shell函数和生成式规则就能直接基于project_list的输出构建动态依赖,让整个流程更简洁连贯。

下面是修改后的Makefile,我会标注关键变化点:

MAKEFLAGS += --no-builtin-rules
MAKEFLAGS += --no-builtin-variables
MAKEFLAGS += --no-print-directory

SHELL := /bin/bash

.ONESHELL:

# 去掉.PHONY,因为project_list是实际生成的文件,Make会自动管理更新
project_list: all_projects_info.json
    echo "Filtering project list with:" >&2
    echo "  PROJECT_FILTER: $(PROJECT_FILTER)" >&2
    jq -r -S '.[] | select(
        (.projectId | test("$(PROJECT_FILTER)"))
        )  | .projectId' $^ > $@

# 核心修改:直接基于project_list生成动态依赖,无需子Make
.PHONY: get_storage_info
get_storage_info: storage_info.json

all_projects_info.json:
    curl -X GET https://toto/get_all_my_projects_info >$@

# storage_info.json现在依赖project_list和动态生成的存储JSON文件
.PHONY: storage_info.json
storage_info.json: project_list $(STORAGE_INFO_JSON_FILES) 
    jq -s -S '[.[]?.items?[]?]' $(STORAGE_INFO_JSON_FILES) > $@

storage_info/:
    mkdir -p $@

# 关键:用shell函数读取project_list的内容,生成存储JSON文件列表
STORAGE_INFO_JSON_FILES=$(foreach project_name,$(shell(cat project_list 2>/dev/null || echo "")),storage_info/$(project_name).json)

$(STORAGE_INFO_JSON_FILES): storage_info/%.json: | storage_info/
    curl \
        -X GET \
        "https://storage_api/list_s3?project=$*" \
        2> /dev/null > $@

关键变化说明:

  • 移除子Make调用:get_storage_info现在直接依赖storage_info.json,不再需要通过$(MAKE)传递变量,避免了子进程的开销。
  • 动态依赖生成:STORAGE_INFO_JSON_FILES通过$(shell(cat project_list))直接读取project_list文件的内容,把每个项目ID转换成对应的storage_info/[projectId].json路径,实现完全动态的依赖链。
  • 调整project_list的.PHONY标记:因为project_list是实际生成的文件,去掉.PHONY后Make会自动检查文件的更新状态,只有当all_projects_info.json变化或PROJECT_FILTER修改时才会重新生成,提升构建效率。
  • 明确依赖顺序:storage_info.json明确依赖project_list,保证Make先执行项目列表过滤,再批量生成各个项目的存储信息。

使用方式不变:

你依然可以通过PROJECT_FILTER过滤目标项目:

make get_storage_info PROJECT_FILTER="foo"

这样整个流程完全在单个Make进程中完成,逻辑更清晰,也避免了子Make带来的变量传递复杂度。

内容的提问来源于stack exchange,提问作者Djabx

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.04 10:31:14