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 4

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.

make FreeBSD отличается от GMake (make команда в большинстве систем linux), и эти функции требуют GMake. Вместо этого выполните команду gmake.

Я не знаком с тем, какие именно функции требуют GMake.