Какой самый надежный способ использования GNUMake с именами файлов, содержащими пробелы? - PullRequest
7 голосов
/ 21 марта 2009

Я хочу использовать GNUMake для запуска make-файла на основе правил, который создает набор файлов C в структуре каталогов (в файловой системе Windows).

Корневой каталог, некоторые подкаталоги и некоторые файлы содержат пробелы.

Файл примера: "C:\Documents and Settings\<username>\My Documents\Test Dir\Build Me.c"

GNUMake не работает, когда пути к файлам содержат пробелы. Я читал о возможных способах решения этой проблемы (удаление пробелов из моих имен файлов, использование формата 8.3, замена пробелов ? или \\ и т. Д.), Но ни один из них не является идеальным (или это так? ) * +1010 *

Есть ли серебряная пуля, которая решит эту проблему?

Кстати, я застрял с GNUMake, я не могу использовать другой инструмент make.

Ответы [ 6 ]

3 голосов
/ 21 марта 2009

Самое простое - это исправить имена файлов.

Если этого не произойдет, напишите ваши команды, чтобы заключить в двойные кавычки имена файлов. Самая простая и безопасная вещь - поместить все имена файлов в макросы; Хитрость заключается в том, что вы должны избегать двойных кавычек, которые в противном случае Make захочет съесть сам.

Итак: FN = "\" C: \ Мои документы \ myfiles.c \ "" FN2 = "C: \ Мои документы \ myfile2.c"

или используйте $ (CC) $ (CFLAGS) "$ (FN2)"

Хитрость в том, чтобы отобразить вашу командную строку с помощью echo

echo $(CC) $(CFLAGS) "$(FN2)"

или используйте make -d, чтобы получить все детали того, что делает make.

Возможно, вам придется немного взломать это, в частности, вам может понадобиться удвоить число побегов

2 голосов
/ 11 октября 2010

Я нашел большое вдохновение на http://www.mail-archive.com/help-make@gnu.org/msg05201.html, и это меня вдохновило Мое собственное тестовое приложение состоит из каталога файлов Jazz FLV эпохи WW2, загруженных с YouTube, и звукового подкаталога, в который я хотел бы хранить аудиоверсии OGA каждой из них. И, конечно же, имена файлов содержат пробелы. Затем я хотел бы запустить ffmpeg2theora для

Вот GNUMake Makefile, который я взломал, чтобы работать. Благодаря всем подсказкам на этом сайте, а также указанному выше сайту!

sq = $(subst $(sp),?,$1)
qs = $(subst ?,$(sp),$1)

e :=
sp := $(e) $(e)

FLVS := $(foreach file,var,$(call sq,$(wildcard *.flv)))
FLVS := $(subst .flv?,.flv ,$(FLVS))

AUDIOS := $(patsubst %.flv,audio/%.oga,$(FLVS))

.PHONY: audios show

audios: $(AUDIOS)

$(AUDIOS) : $(FLVS)
    ffmpeg2theora --novideo -o "$(call qs,$@)" "$(call qs,$(notdir $(patsubst %.oga,audio/%.flv,$@)))"

show:
    echo $(FLVS)
    echo $(AUDIOS)
2 голосов
/ 21 марта 2009

Возможно, вам удастся избежать пробелов в вашем make-файле, т.е.

$(CC) $(CFLAGS) 'C:\Documents\ and\ Settings\<username>\My\ Documents\Test\ Dir\Build Me.c'

Я добавил одинарные кавычки на всякий случай, но я не знаю, работает ли это, если вы используете терминал Windows (а не cygwin и т. Д.).

1 голос
/ 27 июня 2012

Я обычно использовал комбинацию ответа Даны Саней и ответа Брайана Йодера.

Вы просто используете функцию $(subst), чтобы заменить все вхождения пробелов на экранированные пробелы. EG:

empty := 
space := $(empty) $(empty)
program_files := $(subst $(space),\$(space),$(ProgramFiles))

(Обратите внимание, что в некоторых более старых версиях make для Windows вам также потребуется использовать другую $(subst), чтобы изменить обратную косую черту пути на косую черту)

0 голосов
/ 23 июля 2015

Я просто добавляю 'одинарные кавычки' вокруг ошибочной строки: - '$ (TARGET_DIR)'

Пример: (это помогло мне заставить erlang.mk корректно работать на Windows!)

app:: $(C_SRC_ENV)
    @mkdir -p priv/
    $(c_src_verbose) $(CC) $(CFLAGS) $(C_SRC_DIR)/*.c -fPIC -shared -o $(C_SRC_OUTPUT) \
        -I '$(ERTS_INCLUDE_DIR)' $(C_SRC_OPTS)

'$(ERTS_INCLUDE_DIR)' теперь корректно расширяется до 'c:/Program Files/erl7.0/erts-7.0/include/'

Использование make -d также помогает выявить неверные пути

0 голосов
/ 21 марта 2009

Если пробелы находятся только в «корневой» части пути, вы можете смонтировать этот каталог по пути без пробелов. Есть несколько способов сделать это: из командной строки («net use» или «subst») или из Explorer («Инструменты»> «Подключить сетевой диск»). Так что C: \ Documents and Settings \ Мои документы \ Test Dir "может стать X: \ BuildMe.c

Однако, если в именах файлов или в каталогах ниже «корневого» каталога сборки есть пробелы, то, вероятно, не существует идеальных решений. Я использовал другие упомянутые вами предложения (8.3 имен, замена пробелов другим символом) и эти работы, но у них есть свои проблемы.

...