Как использовать круглые скобки в зависимости в Makefile

#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)"
  

В любом случае, удачи.