我有一个目标是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调用中使用多个通配符:
此处模式可能包含'%',它充当通配符,匹配单词中任意数量的任何字符。如果替换还包含'%',则'%'将替换为匹配模式中'%'的文本。只有模式和替换中的第一个'%'才会被这样处理;任何后续'%'都不变。
答案 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=...
的定义中犯了一个小错误。现在它应该是正确的: - )