Как использовать запятые в строке, передаваемой вызывающей функции

#makefile

#makefile

Вопрос:

Предыстория

Я хочу иметь возможность указывать параметры Makefile с помощью функции, чтобы моя цель справки могла автоматически перечислять все определенные параметры.

Что я пробовал

Написание функции, которая сохраняет текст справки в переменной (и отслеживает список таких переменных), готовой к распечатке позже.

Это работает нормально, за исключением случаев, когда я использую запятые в своих строках справки!

Я попытался отладить сбой и сократил его до следующего примера, который, как я думаю, является основной причиной:

У меня есть следующий makefile:

 get_first_param = $(1)

.PHONY: help
help:
    @echo $(call get_first_param, "Hi; my name is Peter")
  

Если я запускаю make help , это работает нормально и выводит сообщение.

Однако, если я изменяю ; на , , я получаю ошибку:

 /bin/sh: 1: Syntax error: Unterminated quoted string
Makefile:5: recipe for target 'help' failed
make: *** [help] Error 2
  

Я предполагаю, что это потому, что вызывающая функция обрабатывает запятую как обозначающую конец первого параметра, и поэтому возвращаемое значение равно "hi .

(Я использую Gnu Make 4.1)

Вопрос

Есть ли способ успешно использовать запятые в строке?

Я пробовал различные способы экранирования кавычек и запятых, но, похоже, ничто не помогает это исправить.

Ответ №1:

Единственный способ — скрыть это за переменной, вот так:

 C := ,

get_first_param = $(1)

.PHONY: help
help:
        @echo $(call get_first_param, "Hi$C my name is Peter")
  

Ответ №2:

Это работает, если вы делаете:

 get_first_param = $(1)
comma =,

.PHONY: help
help:
    @echo $(call get_first_param, "Hi$(comma) my name is Peter")
  

но я не знаю, лучший ли это способ