Generic Makefile не работает на FreeBSD
Пожалуйста, обратите внимание, что это не дубликат других вопросов с именем generic makefile.
Я следовал всем инструкциям по другим вопросам о generic Makefile, и вот код, который я придумал из этого:
CFLAGS = -c
CC = cc
SOURCES = $(wildcard *.cc)
OBJECTS = $(patsubst %.cc,%.o,%(SOURCES))
EXEC = run
all: build clean
build: $(OBJECTS)
$(CC) $(OBJECTS) -o $(EXEC)
%.o: %.cc
$(CC) $(CFLAGS) $<
clean:
rm *.o
Однако, когда я выполняю make
с файлом под названием test.cc
в моем каталоге, это дает мне следующую ошибку:
cc -o run
cc: error: no input files
*** Error code 1
Stop.
make: stopped in /somewhere
Пожалуйста, обратите внимание, что я работаю во FreeBSD и команды make
и cc
являются теми, которые поставляются с ОС.
3 ответа:
Строки
SOURCES = $(wildcard *.cc) OBJECTS = $(patsubst %.cc,%.o,%(SOURCES))
- это синтаксис GNU make, не понятный для FreeBSD
make
, который имеет свой собственный диалект (в частности$(wildcard)
и$(patsubst)
). Если вам нужно написать makefiles, переносимые на многие системы, либо требуйте, чтобы gmake существовал и использовал GNUmakefiles, либо придерживайтесь функций POSIX make.Вы можете установить GNU make (
gmake
) на FreeBSD с помощьюcd /usr/ports/devel/gmake make install clean
В FreeBSD
make
, Вы можете сделать это следующим образом:В первой строке используется модификатор присвоения переменной . Разверните значение, передайте его в командную консоль для выполнения и назначьте результат переменной. Любые новые строки в результате заменяются пробелами. Это очень мощный механизм. Например, вы должны использоватьSOURCES!= ls *.cc OBJECTS = ${SOURCES:.cc=.o}
find
вместоls
для поиска в подкаталогах;SOURCES!= find . -type f -name '*.cc'
Вторая строка использует модификатор переменной для выполнения AT&T System V UNIX подстановка переменных стиля. Он заменяет суффикс
.cc
на суффикс.o
.