使用多个通配符进行Makefile路径替换

时间:2016-09-02 14:29:25

标签: makefile

我有一个目标是test.mk文件的路径,该文件需要生成(由基于配置的脚本修改),我想提取作为要测试的组件的路径的一部分。

路径采用以下格式,其中[component]和[test_name]未知。

TEST=absolute_path/[component]/unit_tests/[test_name]/test.mk

我想将此路径重新格式化为relative_path / [component],我尝试过这行不能替代任何内容。

$(TEST):
    @echo $(patsubst absolute_path/%/unit_tests/%, relative_path/%, $@)

GNU make手册有关于patsubst的说法,所以我认为它应该在单个patsubst调用中使用多个通配符:

  

此处模式可能包含'%',它充当通配符,匹配单词中任意数量的任何字符。如果替换还包含'%',则'%'将替换为匹配模式中'%'的文本。只有模式和替换中的第一个'%'才会被这样处理;任何后续'%'都不变。

1 个答案:

答案 0 :(得分:2)

我认为你知道相对路径。我还假设组件的名称和测试的名称是可变的(它们可以更改)。所以我称之为'component_X'和'test_name_Y'。假设所有这些,以下应该有效:

    # Definitions for the space-string and the newline-string
    # ---------------------------------------------------------
    nullstring :=
    space := $(nullstring) #End

    TEST=some/abs/path/component_X/unit_tests/test_name_Y/test.mk

    # Some manipulations of the path:
    # ---------------------------------
    TEMP1=$(subst /,$(space),$(TEST))
    TEMP2=$(filter-out $(lastword $(TEMP1)),$(TEMP1))
    TEMP3=$(filter-out $(lastword $(TEMP2)),$(TEMP2))
    TEMP4=$(filter-out $(lastword $(TEMP3)),$(TEMP3))
    ABS_PATH=$(subst $(space),/,$(filter-out $(lastword $(TEMP4)),$(TEMP4)))
    REL_PATH=some/rel/path
    REL_FILE_PATH=$(patsubst $(ABS_PATH)/%,$(REL_PATH)/%,$(TEST))
    COMP_NAME=$(firstword $(subst /,$(space),$(patsubst $(ABS_PATH)/%,$(nullstring)%,$(TEST))))
    TEST_NAME=$(firstword $(subst /,$(space),$(patsubst $(ABS_PATH)/$(COMP_NAME)/unit_tests/%,$(nullstring)%,$(TEST))))


    # The test target
    # ----------------
    $(TEST): FORCE
        @echo.
        @echo The calculated ABS_PATH:
        @echo $(ABS_PATH)
        @echo.
        @echo The chosen REL_PATH:
        @echo $(REL_PATH)
        @echo.
        @echo The relative file path:
        @echo $(REL_FILE_PATH)
        @echo.
        @echo The component name:
        @echo $(COMP_NAME)
        @echo.
        @echo The test name:
        @echo $(TEST_NAME)

    FORCE: 

不要忘记,复制粘贴可能会导致make出错。您应该用配方行中的制表符替换所有4个空格。

如果此解决方案适合您,请告诉我。 我在Windows上测试过它。但它也适用于Linux。

编辑:

我在ABS_PATH=...的定义中犯了一个小错误。现在它应该是正确的: - )