Запуск make на make-файле не совсем работает - PullRequest
1 голос
/ 25 октября 2011

У меня есть этот make-файл:

SHELL=/bin/zsh
COMPILER=g++ -g
COMPILERSO=g++ -a +a1 -b
LIBDIR=/Users/romeovs/Desktop/rootex
CFLAGS=$(root-config --cflags)
LIBS=$(root-config --libs) -lPhysics -lThread -lMinuit -lHtml -lVMC -lEG -lGeom
ROOT=/usr/local/bin/root -b -q

.SUFFIXES=.C .o

WriteTree : WriteTree.C Event.o Event_C.so Event.h
    ${COMPILER} WriteTree.C -o  $@ Event.o Event_C.so ${CFLAGS} ${LIBS}
Event_C.so : BuildLibDico.C
     ${ROOT} BuildLibDico.C
Event.o : Event.C Event.h
    ${COMPILER} -c ${CFLAGS} Event.C 

Когда я запускаю в make Event.o int командную строку, можно ожидать, что make запустится:

${COMPILER} -c ${CFLAGS} -o Event.o Event.C

, который должен расширитьсядо

g++ -g -c $(root-config --cflags) -o Event.o Event.C

, который, в свою очередь, должен быть расширен до $(root-config --cflags).

Тем не менее, когда я делаю это, make приветствует:

g++     -c -o Event.o Event.C

(обратите внимание на дополнительный пробел между g++ и -c).Это, в свою очередь, приводит к ошибкам компиляции.

Кажется, что расширение не работает должным образом.Запуск:

g++ -c $(root-config --cflags) -o Event.o Event.C 

работает, хотя.

Что я могу сделать, чтобы это исправить?


РЕДАКТИРОВАТЬ

Одна часть проблемы была решена с помощью ответа Жиля.

Другая часть проблемы заключалась в том, что make на самом деле не смотрел в каталог make-файл (он называется WriteTree.make) и работалосновная команда g++.

Это можно исправить с помощью make -f WriteTree.make Event.o, но я не знаю, хорошее ли это поведение make (мне бы очень хотелось, чтобы он искал для себя make-файлы, не только makefile, но и каждый *.make).

1 Ответ

2 голосов
/ 25 октября 2011

CFLAGS=$(root-config --cflags) устанавливает CFLAGS в значение переменной make с причудливым именем root-config --cflags.Поскольку у вас нет такой переменной, расширение пусто.Обратите внимание, что make принимает либо ${variable_name}, либо $(variable_name), и если символ, следующий за $, не является открывающей скобкой или фигурной скобкой, он используется как имя переменной (даже например, $foo расширяется до значения переменнойс именем f, за которым следуют два символа oo).

Вам нужно удвоить знак доллара: $$ расширяется до одного $, и тогда у вас будет фрагмент оболочки.

CFLAGS = $$(root-config --cflags)
LIBS = $$(root-config --libs) -lPhysics -lThread -lMinuit -lHtml -lVMC -lEG -lGeom

Другая ошибка состоит в том, что .SUFFIXES = .C .o должно иметь двоеточие вместо знака равенства: .SUFFIXES: .C .o.Это не имеет значения, поскольку у вас нет неявного правила.

Наконец, make ищет Makefile (или makefile с некоторыми реализациями; GNU make сначала пытается GNUmakefile).Make в любом случае читает только один make-файл (не считая файлов, которые были получены с помощью директив include).Если вы хотите использовать другой make-файл, вам нужно явно указать его в командной строке с параметром -f.Если вы хотите разделить свои правила на несколько make-файлов, напишите основной make-файл, который включает их все;обратите внимание, что make-файлы будут использовать одно пространство имен для целей и переменных.В GNU make вы можете включить все файлы, соответствующие шаблону подстановки:

include $(wildcard *.make)

Обратите внимание, что имена файлов относятся к текущему каталогу, из которого вы вызвали make.Если вы хотите искать файлы в том же каталоге, что и make-файл, вам нужно указать это явно:

include $(wildcard $(dirname $(lastword $(MAKEFILE_LIST)))/*.make)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...