2016-09-02 2 views
1

У меня есть цель, которая представляет собой путь к файлу test.mk, который должен быть сгенерирован (изменен скриптом на основе конфигурации), и я хочу извлечь часть пути, которая компонент, подлежащий тестированию.Замена пути файла Makefile с несколькими подстановочными знаками

Путь находится в следующем формате, где [component] и [test_name] неизвестны.

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

Я хочу, чтобы переформатировать этот путь, как RELATIVE_PATH/[компонент] и я попробовал эту линию, ничего не заменить.

$(TEST): 
    @echo $(patsubst absolute_path/%/unit_tests/%, relative_path/%, [email protected]) 

ГНУ сделать руководство это сказать о patsubst, так что я думаю, что он должен работать с несколькими групповыми символами в одном patsubst вызова:

Здесь шаблон может содержать «%», который действует как подстановочный знак, сопоставляющий любое количество символов внутри слова. Если замена также содержит «%», «%» заменяется текстом, который соответствует «%» в шаблоне. Только первый «%» в шаблоне и замене рассматривается таким образом; любой последующий «%» не изменяется.

+0

Вы имеете в виду, что 'absolute_path' исправлен и должен быть жестко закодирован в make-файле? – Leon

+0

«Я думаю, что он должен работать с несколькими подстановочными знаками в одном вызове patsubst». Вы, кажется, упустили последнее предложение в документе 'patsubst' docuementation , которое вы указали. Ваша проблема также неясна. Вам необходимо отправить пример файла makefile с указанием пробелов (ов), которых вы не знаете, как их завершить. –

+0

absolute_path и relative_path известны через переменные. –

ответ

1

Предполагаю, что вы знаете относительный путь. Я также предполагаю, что имя компонента и имя теста являются переменными (они могут меняться). Поэтому я называю их «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: 

Не забывайте, что копирование вставки может привести к ошибкам в сделать. Вы должны заменить все 4-пробелы символом табуляции в линиях рецептов.

Пожалуйста, дайте мне знать, если это решение сработало для вас. Я тестировал его на Windows. Но он должен работать и на Linux.

EDIT:

Я сделал небольшую ошибку в определении для ABS_PATH=.... Теперь это должно быть правильно :-)

+0

Спасибо, это делает трюк: '@echo relative_path/$ (firstword $ (subst /, $ (пробел), $ (patsubst absolute_path /%,%, $ @)))' –

+0

Привет, Маркус, я счастлив он работал для вас :-) –

+0

Или даже лучше: '@echo relative_path/$ (firstword $ (subst/unit_tests /,, $ (patsubst absolute_path /%,%, $ @)))', поскольку это будет работать, даже если компонент находится в подкаталоге, который у нас есть. 'absolute_path/[component]/[subcomponent]/unit_tests/[test_name]/test.mk' =>' relative_path/[component]/[subcomponent] ' –

Смежные вопросы