LINUX.ORG.RU

[Makefile][синтаксис] проблемы с двуязычием

 ,


0

1

Пытаюсь сделать 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 и слинковать?



Последнее исправление: uGin (всего исправлений: 1)

Не специалист по make, но может OBJECTS=$(SOURCES:%{c,cpp}=%.o) сработает?

anonymous
()

Вот когда-то написал, по какому-то тутору такой makefile, его и использую:

# Any questions ? > 8-800-200-8002

SPREF := src #<--- каталог с исходниками
SDIRS := $(addprefix $(SPREF)/, shared math phys gfx engine) #<-- подкаталоги в каталоге с исходниками
SDIRS += $(SPREF)

BPREF := bin/release #<--- сюда будет ложиться скомпиленная прога
BDIRS := $(patsubst $(SPREF)%, $(BPREF)%, $(SDIRS))

SRCHWILDCARDS := $(addsuffix /*.c, $(SDIRS))

SFILES := $(wildcard $(SRCHWILDCARDS))
OFILES := $(patsubst $(SPREF)%.c, $(BPREF)%.o, $(SFILES))

VPATH := $(SDIRS)

INC :=
CF := -std=c99 -Wall $(CFLAGS)

override CF += -pipe $(INC)

LF := -L`gcc -print-file-name=` -lgcc -lc -lm -lGL -lGLU -lGLEW `sdl-config --cflags --libs` -lpthread


all: mkdirs main
	@echo ":-)"


main: $(OFILES)
	@echo "[LD] $^ => $@"
	clang -Qunused-arguments $(LF) $^ -o $(BPREF)/$@
#ld /usr/lib/crt1.o /usr/lib/crti.o /usr/lib/crtn.o $^ -o $(BPREF)/$@ $(LF)
#gcc $(LF) $^ -o $(BPREF)/$@

$(BPREF)/%.o: $(SPREF)/%.c
	@echo "[CC] $< -> $@"
	clang -Qunused-arguments $(CF) -c $< -o $@
#cc $(CF) -c $< -o $@


.PHONY: showvars mkdirs clean rebuild

showvars: # использовать для дебага :-))
	@echo $(SPREF)
	@echo $(SDIRS)
	@echo $(BPREF)
	@echo $(BDIRS)
	@echo $(SFILES)
	@echo $(OFILES)
	@echo $(VPATH)

mkdirs:
	@echo [MKDIR] -p $(BDIRS)
	@mkdir -p $(BDIRS)

clean:
	@echo cleaning...
	@echo [RM] $(OFILES)
	@rm $(OFILES)
	@echo [RM] $(BPREF)/main
	@rm $(BPREF)/main


rebuild: clean all

Bad_ptr ★★★★★
()

Хоть это и назовут неверным путём, но использую такую поделку (первая ссылка на Smake). Позволяет за полсекунды написать Makefile с явными зависимостями, что ускоряет сборку и экономит время во время разработки и изменения дерева файлов проекта. Работает для C и C++.

backbone ★★★★★
()
Ответ на: комментарий от backbone

Да, если интересно будет, для Вашего проекта команда генерации будет

smake.sh -t main -lGLU -lglut
Если есть какой-то другой подпроект, линкующийся статически, то путь к нему указывается через -i (smake.sh --help). Требует perl и bash.

backbone ★★★★★
()
%.o: %.c
    rule

но это gnu-extension

если нужна кроссплатформенность, то makefile'ами вообще лучше не пользоваться

Reset ★★★★★
()

все мелкое делаю на цмаке и не парюсь :)

Раньше тоже какие-то заготовки пользовал на мейке и т.д....

Jetty ★★★★★
()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.