2015-02-13 2 views
0

Учитывая следующий питон скрипт:Как бороться со специальными символами в расширении команды make?

print("include_path_with\\[weird\\]characters") 

и следующие Makefile

main: 
     g++ main.cpp -I`python script.py` 

Предполагая main.cpp фактически включает в себя файл из include_with\\[weird\\]characters, это не поможет мне, с компилятором неисправного найти включаемый файл.

Однако, если я использую shell function, он работает. Он также работает, если путь не содержит странных символов. Поэтому по какой-то причине побег, похоже, ведет себя по-разному между backticks и функцией shell. Может кто-нибудь объяснить, почему и как я могу изменить сценарий так, чтобы он также работал с расширением команды backtick, если это возможно?

Я использую GNU Make 3,81 на Mac OS X 10.10.2 внутри оболочки bash. Сценарий запускается с использованием Python 3.4.2.

+0

Это представитель путь для этой проблемы? Потому что единственный случай, когда вы можете получить другой вывод в командной строке, который я могу сказать, - это использование '$ (shell) и не цитирование расширения переменной (так что обратная коса лишится оболочкой). Это тот случай, который работает? –

+0

Когда я использую '$ (shell python script.py)' в файле makefile выше, при прочих равных условиях он работает. Я не понимаю, о чем вы говорите * не цитируйте расширение переменной *. –

+0

Я имею в виду 'OUT: = $ (shell python script.py)', а затем 'g ++ main.cpp -I $ (OUT)' в отличие от 'g ++ main.cpp -I '$ (OUT)' и да, это один случай (из всех возможных котировок/и т. д., которые отличаются и которые позволяют оболочке удалять '\\' escape-файлы. –

ответ

1
$ cat BP.mk 
VAR := $(shell python -c 'print("include_path_with\\[weird\\]characters")') 

all: 
     echo 'DIRECT := `python -c '\''print("include_path_with\\[weird\\]characters")'\''`' 
     echo "DIRECT := `python -c 'print("include_path_with\\[weird\\]characters")'`" 
     echo DIRECT := `python -c 'print("include_path_with\\[weird\\]characters")'` 
     echo 'VAR := $(VAR)' 
     echo "VAR := $(VAR)" 
     echo VAR := $(VAR) 
$ make -f BP.mk 
echo 'DIRECT := `python -c '\''print("include_path_with\\[weird\\]characters")'\''`' 
DIRECT := `python -c 'print("include_path_with\\[weird\\]characters")'` 
echo "DIRECT := `python -c 'print("include_path_with\\[weird\\]characters")'`" 
DIRECT := include_path_with\[weird\]characters 
echo DIRECT := `python -c 'print("include_path_with\\[weird\\]characters")'` 
DIRECT := include_path_with\[weird\]characters 
echo 'VAR := include_path_with\[weird\]characters' 
VAR := include_path_with\[weird\]characters 
echo "VAR := include_path_with\[weird\]characters" 
VAR := include_path_with\[weird\]characters 
echo VAR := include_path_with\[weird\]characters 
VAR := include_path_with[weird]characters 

Обратите внимание, что во всех случаях, кроме последнего, что обратная косая черта сохраняется в выходе? Это проблема. Вы не хотите, чтобы они были там. Так что вы хотите не распечатывать их вообще, а затем процитировать расширение, чтобы оболочка не обрабатывала результат вообще.

Так как

VAR2 := $(shell python -c 'print("include_path_with[weird]characters")') 
g++ main.cpp -I'$(OUT)' 

или

g++ main.cpp -I"$$(python -c 'print("include_path_with[weird]characters")')" 
+0

Спасибо, это очень хорошо объясняет! –

+0

Странно, однако, 'pkg-config' делает печать escape-пути в этом сценарии. Не соответствует ли это лучшей практике? –

+0

Нет, они, скорее всего, ожидают, что вы не можете процитировать расширение, поскольку это может быть несколько аргументов. –

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