Как использовать скобки в зависимости в Makefile - PullRequest
5 голосов
/ 10 ноября 2011

Вот мой 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 (ab) существует.Казалось, что скобки не могут быть использованы в зависимости.Это правильно?Или я что-то пропускаю?

Звук, который двоеточие также нельзя использовать в зависимости.

Я написал скрипт оболочки bash для резервного копирования моей системы.Я использовал make и tar для резервного копирования.Использование make предназначено только для обновления новых файлов и архивирования каталога.Проблема в том, что имена многих файлов имеют двоеточие или круглые скобки, и они имеют особое значение в Makefile.Это приводит к вышеуказанной проблеме.

Я очень ценю любую помощь.Спасибо.

Ответы [ 2 ]

4 голосов
/ 10 ноября 2011

Проблема в том, что круглые скобки помечают элементы архива и кажутся необратимыми. Обычные приемы - обратный слэш-экранирование и экранирование с использованием переменной:

.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.

0 голосов
/ 22 августа 2015

У меня была эта проблема с 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, который должен был включать в себя измененные каталоги (т. е. каталоги include для 32-битного компилятора отличаются от каталогов include для 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 , если я использую \ для пробелов, с двойной кавычкой, программа не компилируется. Я считаю, что 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)"

Если это не такt, затем попробуйте что-то вроде:

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

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

...