#makefile #parentheses
#makefile #круглые скобки
Вопрос:
Ниже приведен мой Makefile:
.PHONY: all
all: /Users/wu/qqaa/homepage 1 2 3/icons (a-b)
@tar cjvf 1.tar.bz2 --exclude=*~ /Users/wu/qqaa/homepage 1 2 3/icons (a-b)
Это не сработало. Проблема заключается в круглых скобках в зависимости. Добавление
перед (
и )
также не сработало. Ошибка заключается в следующем:
make: *** No rule to make target `/Users/wu/qqaa/homepage 1 2 3/icons (a-b)', needed by `all'. Stop
Каталог /Users/wu/qqaa/homepage 1 2 3 /icons (a-b) действительно существует. Казалось, что круглые скобки нельзя использовать в зависимости. Правильно ли это? Или я что-то упускаю?
Звук, который двоеточие также не может быть использовано в зависимости.
Я написал скрипт оболочки bash для резервного копирования моей системы. Я использовал make
и tar
для резервного копирования. Использование make
заключается только в обновлении новых файлов и tar каталога. Проблема в том, что имена многих файлов содержат двоеточие или круглые скобки, и они имеют особое значение в Makefile. Это приводит к вышеупомянутой проблеме.
Я действительно ценю любую помощь. Спасибо.
Ответ №1:
Проблема в том, что круглые скобки помечают члены архива и кажутся неизбежными. Обычными приемами являются экранирование обратной косой черты и экранирование с помощью переменной:
.PHONY : all
leftparen:=(
rightparen:=)
all: /Users/wu/qqaa/homepage 1 2 3/icons $(leftparen)a-b$(rightparen)
@tar cjvf 1.tar.bz2 --exclude=*~ "$@"
И поскольку оба варианта в этом случае не работают, вам, вероятно, придется смириться с этим ограничением или подать ошибку в GNU make.
Комментарии:
1. @thilton, использование переменной у меня не сработало (я использую Mac lion OS). Работает ли это в вашей ОС?
2. @warem: Как и говорилось в сообщении, это не сработало, извините. Только что опубликовал одну из обычных альтернатив в качестве ссылки и отметил для других, что она не сработала.
3. @thilton: Мне жаль, что я не заметил предложение под вашими кодами.
4. У меня это работает отлично, и было нелегко найти этот звездный ответ на SE.
Ответ №2:
Что касается меня, у меня была эта проблема с Makefile, который я использовал в Windows. Компилятор представляет собой 32-разрядную версию MinGW64-W32.
gcc --version
Шоу: gcc (i686-posix-sjlj-rev0, Built by MinGW-W64 project) 5.1.0
make --version
Шоу: GNU Make 3.81
Я писал Makefile, который должен был включать каталоги, которые изменились (т. Е. включаемые каталоги для 32-разрядного компилятора отличаются от включенных каталогов для 64-разрядного компилятора). Мне нужно было включить что-то вроде: -IC:/Program Files (x86)/mingw-w64/gtk -3.6.4_win32/include/gtk-3.0
Например. У меня была такая же проблема, когда я пытался скомпилировать, компилятор выдавал ошибку примерно (в строке 0 или что-то в этом роде. Мое решение было простым. Мне просто пришлось использовать двойные кавычки, вот так:
-I"C:/Program Files (x86)/mingw-w64/gtk -3.6.4_win32/include/gtk-3.0"
Использование двойных кавычек сработало. Это позволило мне успешно скомпилировать мою программу.
Здесь есть дополнительное замечание. Обычно в Linux для каталога с пробелами нам нужно что-то вроде:
-I"C:/Program Files (x86)/mingw-w64/gtk -3.6.4_win32/include/gtk-3.0"
с перед пробелом. В Makefile, если я использую ‘s для пробелов с двойными кавычками, программа не компилируется.Я полагаю, что Makefile считает, что ‘ы на самом деле являются частью имени каталога, когда я использую двойные кавычки.
Для вашего кода попробуйте что-то вроде:
.PHONY: all
all: /Users/wu/qqaa/homepage 1 2 3/icons (a-b)
@tar cjvf 1.tar.bz2 --exclude=*~ "/Users/wu/qqaa/homepage 1 2 3/icons (a-b)"
Если это не сработает, попробуйте что-то вроде:
.PHONY: all
all: /Users/wu/qqaa/homepage 1 2 3/icons (a-b)
@tar cjvf 1.tar.bz2 --exclude=*~ "/Users/wu/qqaa/homepage 1 2 3/icons (a-b)"
В любом случае, удачи.