2013-02-21 2 views
6

Есть ли способ получить пробелы внутри имен объектов, работающих при использовании make.exe? Вроде бы невозможно, если бы это действительно древнее сообщение об ошибке правильно: http://savannah.gnu.org/bugs/?712Разрешить пространство в целевом файле GCC makefile

Для справки, большая проблема заключается в том, что куски Makefile команды, как:

"foo bar baz": $(OBJ) 
    $(CPP) $(LINKOBJ) -o $(BIN) $(LIBS) 

... кажется, получает лечение как три отдельные команды: один для построения «foo (note the included»), один для построения бара, и, наконец, один для построения baz »(опять же, включая«). Это связано с тем, что make.exe использует пробел как разделитель.

Однако, разумно предположить, что, например, может потребоваться построить «Hello World.exe». Это не представляется возможным. Двойные кавычки не работают, и ни делаю спасаясь отдельными словами (я читал, что где-то, не помню ссылку):

"foo\\ bar\\ baz": $(OBJ) 
    $(CPP) $(LINKOBJ) -o $(BIN) $(LIBS) 

есть ли другой способ, чтобы исправить это? Официальное руководство только подтверждает материал разметить-на-пространствах, но не предоставляет способ использовать пространство для любых других целей: http://www.gnu.org/software/make/manual/make.html#Rule-Syntax

Edit: как это было предложено, я попробовал одиночный слэш тоже, но они имеют тот же эффект, что и двойные косые черты. Сделать жалуется, что не может найти правила для первого слова:

mingw32-make.exe: *** No rule to make target `foo', needed by `all'. Stop. 

Исполняемых «Foo бара baz.exe» правильно производится, хотя, но связывание выполняется каждый раз, когда за слово.

ответ

1

Вместо двойной обратной косой черты используют одиночные. Следующий Makefile работает (по крайней мере, для Gnu макияжа):

goal: foo\ bar 

foo\ bar: 
    gcc -o "foo bar" "foo bar.c" 
+0

Это не работает, см. Редактирование. – Orwell

+0

@Orwell: Тогда это похоже на операционную систему. Как вы определяете файл с пробелами в имени в своей оболочке? – Matthias

1

как сказал Маттиас, это вопрос «\», но двойные кавычки тоже. Вот как я преуспели в этом:

EXECUTABLE=foo\ bar\ baz 
all: $(SOURCES) $(EXECUTABLE) 
$(EXECUTABLE): $(OBJECTS) 
       $(CC) $(OBJECTS) -o "[email protected]" $(LDFLAGS) 

Обратите внимание на двойные кавычки вокруг $ @ мне кажется, что, когда делают достижения цели «$ (EXECUTABLE)» он расширяет «\», так что команда line будет

gcc file.o -o foo bar baz -LFlags 

который не то, что вы хотите, вы хотите двойные кавычки вокруг имени файла.

Теперь вы находитесь на окнах, и я не помню, как он имеет дело с пробелами в именах, так как Маттиас сказал, сначала проверьте, как «cmd.exe» имеет дело с пробелами (кроме окружающего имени с двойными кавычками ...)

0

Возможно, проще рассмотреть более простой Makefile, который игнорирует зависимости в стандартном вызове targetRule: dependencies. OP предназначен для Windows, а ниже - для Linux в оболочке bash; но он, вероятно, должен быть применим к Windows с использованием оболочки bash через cygwin.У меня есть следующие в моем Makefile (обратите внимание, что должно быть TAB перед echo команд, который SO преобразует в пространствах):

testA: 
    echo "testA" 

unrelated: 
    echo "unrelated" 

testA\ clean: 
    echo "testA clean" 

clean: 
    echo "clean" 

Если я называть make с целями clean или testA в терминале в bash оболочки я получить ожидаемые результаты:

$ make testA 
echo "testA" 
testA 
$ make clean 
echo "clean" 
clean 

Теперь, если я позвоню make testA clean только что написал, как есть, bash оболочка будет разделять аргументы в пространствах, такполучит два аргумента, и запускать их по отдельности:

$ make testA clean 
echo "testA" 
testA 
echo "clean" 
clean 

... но если я оберните цель, подаваемое make в кавычках - или, если я убегаю пространство - оболочка поймет, что он должен быть один аргумент с пространством внутри, и будет распространяться как такое make, который будет продолжаться, чтобы выполнить то, что написано в качестве testA\ clean целевого правила:

$ make "testA clean" 
echo "testA clean" 
testA clean 
$ make testA\ clean 
echo "testA clean" 
testA clean 

Одним из следствий этого является то, что, к сожалению, вы не можете " TAB "в командной строке для автозаполнения testA\ clean; если вы введете make teTAB в командной строке, то только testA будет автоматически автозаполнен (и testA\ clean не будет отображаться как опция автозаполнения).

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