Пытаюсь сделать makefile для довольно небольшого набора файлов (main.cpp, somelib.c, somelib.h). Но чисто с эстетической точки зрения хочется сделать его универсальным. Поиски привели примерно к такому виду:
TARGET=demo
SOURCES=$(wildcard *.cpp *.c)
OBJECTS=$(SOURCES:%.c=%.o)
CFLAGS=-c -O2
LDFLAGS=-lGLU -lglut
all: $(TARGET)
$(TARGET): $(OBJECTS)
$(CXX) $(LDFLAGS) $(OBJECTS) -o $(TARGET)
$(OBJECTS): $(SOURCES)
$(CXX) $(CFLAGS) $<
clean:
$(RM) -f $(OBJECTS) $(TARGET)
run:
./$(TARGET)
.PHONY: all clean run
При этом make жалуется на циклическую зависимость main.cpp <- main.cpp и собирает только somelib.c с последующей линковкой бинарника.
Замена на OBJECTS=$(SOURCES:%.cpp=%.o) приводит к циклической зависимости somelib.c <- somelib.c, и make не делает вообще ничего.
Как заставить make собрать все объектные файлы из всех *.c и *.cpp и слинковать?