Чистая обработка пути к файлу с пробелами в Makefile - PullRequest
2 голосов
/ 06 марта 2020

У меня есть скрипт, который извлекает данные с диска сервера, где у меня нет возможности изменять имена каталогов, и у них всех есть пробелы. Я использую Makefile для запуска скрипта (в Windows), и он представляет проблему.

Мой первоначальный обходной путь - запуск скрипта python перед вызовом make для копирования данных с сервера в мою локальную папку, и это выглядит так:

# grab_data.py
import argparse
parser = argparse.ArgumentParser()
parser.add_argument("-o", "--output", help="output filepath")
args = parser.parse_args()
output_path = Path(args.output)

src = 'S:/Server Path/To Data I Need/File I Need.xlsx'
dst = output_path
shutil.copyfile(src, dst)

И я запускаю свой Makefile так:

.PHONY : runall
runall : data/file_i_need.xlsx final_output.csv
    python grab_data.py - o data/file_i_need.xlsx

final_output.csv : data/file_i_need.xlsx processing_script.py
    python processing_script.py -i $< -o $@

Я хочу найти способ включить файл 'S:/Server Path/To Data I Need/File I Need.xlsx' непосредственно в Makefile, но не могу понять, что будет работать. Есть ли какой-нибудь другой способ, который позволил бы мне сделать это?

1 Ответ

1 голос
/ 07 марта 2020

Не уверен, какую версию make вы используете, но с gmake (что, вероятно, является одним из вариантов для Windows) будет работать экранирование пробелов:

x\ yz: ab\ c
        cp "$<" "$@"

Тогда вы получите:

$ make
cp "ab c" "x yz" 

Как указано в комментарии, не для go это слишком очевидно. Я также использовал двойные кавычки, используемые в рецепте, чтобы убедиться, что они правильно передаются как целая строка. Если правило имеет несколько предварительных условий, и только одно из них содержит пробелы, это все та же история, вам просто нужно сделать это первым предварительным условием, чтобы можно было ссылаться на "$<". Если у вас было несколько предпосылок с пробелами и вы хотите сослаться на все из них, я боюсь, что вам не повезет, даже попытка расширить $^ с помощью $(foreach ...) не поможет.

...