Несколько месяцев назад я придумал следующее общее Makefile для школьных заданий:
# ------------------------------------------------
# Generic Makefile
#
# Author: [email protected]
# Date  : 2010-11-05
#
# Changelog :
#   0.01 - first version
# ------------------------------------------------
# project name (generate executable with this name)
TARGET   = projectname
CC       = gcc -std=c99 -c
# compiling flags here
CFLAGS   = -Wall -I.
LINKER   = gcc -o
# linking flags here
LFLAGS   = -Wall
SOURCES  := $(wildcard *.c)
INCLUDES := $(wildcard *.h)
OBJECTS  := $(SOURCES:.c=*.o)
rm       = rm -f
$(TARGET): obj
    @$(LINKER) $(TARGET) $(LFLAGS) $(OBJECTS)
    @echo "Linking complete!"
obj: $(SOURCES) $(INCLUDES)
    @$(CC) $(CFLAGS) $(SOURCES)
    @echo "Compilation complete!"
clean:
    @$(rm) $(TARGET) $(OBJECTS)
    @echo "Cleanup complete!"
Это будет скомпилировать каждый файл .c и .h для генерации файлов .o и исполняемого файла projectname в той же папке.
Теперь я хотел бы немного подтолкнуть это. Как написать Makefile для компиляции проекта C со следующей структурой каталогов?
 ./
 ./Makefile
 ./src/*.c;*.h
 ./obj/*.o
 ./bin/<executable>
Другими словами, я хотел бы иметь Makefile, который компилирует исходники C из ./src/ в ./obj/, а затем связывает все, чтобы создать исполняемый файл в ./bin/.
Я пытался читать разные Make файлы, но я просто не могу заставить их работать над структурой проекта выше; вместо этого проект не может скомпилировать всевозможные ошибки. Конечно, я мог бы использовать полномасштабную IDE (Monodevelop, Anjuta и т.д.), Но я честно предпочитаю придерживаться gEdit и хорошего терминала.
Есть ли гуру, который может дать мне рабочее решение или получить четкую информацию о том, как это можно сделать? Спасибо!
** ОБНОВЛЕНИЕ (v4) **
Окончательное решение:
# ------------------------------------------------
# Generic Makefile
#
# Author: [email protected]
# Date  : 2011-08-10
#
# Changelog :
#   2010-11-05 - first version
#   2011-08-10 - added structure : sources, objects, binaries
#                thanks to http://stackoverflow.com/users/128940/beta
#   2017-04-24 - changed order of linker params
# ------------------------------------------------
# project name (generate executable with this name)
TARGET   = projectname
CC       = gcc
# compiling flags here
CFLAGS   = -std=c99 -Wall -I.
LINKER   = gcc
# linking flags here
LFLAGS   = -Wall -I. -lm
# change these to proper directories where each file should be
SRCDIR   = src
OBJDIR   = obj
BINDIR   = bin
SOURCES  := $(wildcard $(SRCDIR)/*.c)
INCLUDES := $(wildcard $(SRCDIR)/*.h)
OBJECTS  := $(SOURCES:$(SRCDIR)/%.c=$(OBJDIR)/%.o)
rm       = rm -f
$(BINDIR)/$(TARGET): $(OBJECTS)
    @$(LINKER) $(OBJECTS) $(LFLAGS) -o [email protected]
    @echo "Linking complete!"
$(OBJECTS): $(OBJDIR)/%.o : $(SRCDIR)/%.c
    @$(CC) $(CFLAGS) -c $< -o [email protected]
    @echo "Compiled "$<" successfully!"
.PHONY: clean
clean:
    @$(rm) $(OBJECTS)
    @echo "Cleanup complete!"
.PHONY: remove
remove: clean
    @$(rm) $(BINDIR)/$(TARGET)
    @echo "Executable removed!"