ConfIO

ref: main

./Makefile


  1
  2
  3
  4
  5
  6
  7
  8
  9
 10
 11
 12
 13
 14
 15
 16
 17
 18
 19
 20
 21
 22
 23
 24
 25
 26
 27
 28
 29
 30
 31
 32
 33
 34
 35
 36
 37
 38
 39
 40
 41
 42
 43
 44
 45
 46
 47
 48
 49
 50
 51
 52
 53
 54
 55
 56
 57
 58
 59
 60
 61
 62
 63
 64
 65
 66
 67
 68
 69
 70
 71
 72
 73
 74
 75
 76
 77
 78
 79
 80
 81
 82
 83
 84
 85
 86
 87
 88
 89
 90
 91
 92
 93
 94
 95
 96
 97
 98
 99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
export CFLAGS CPPFLAGS LDFLAGS LDLIBS DEBUG ASAN O

SRCDIR ?= src
INCDIR ?= include
OBJDIR ?= obj
OUTDIR ?= lib

ifneq ($(DEBUG),y)
    OBJDIR := $(OBJDIR)/release
else
    OBJDIR := $(OBJDIR)/debug
endif
ifeq ($(ASAN),y)
    OBJDIR := $(OBJDIR)_asan
endif
OBJDIR_STATIC := $(OBJDIR)/static
OBJDIR_DYNAMIC := $(OBJDIR)/dynamic

SOURCES := $(wildcard $(SRCDIR)/*.c)
OBJECTS_STATIC := $(patsubst $(SRCDIR)/%.c,$(OBJDIR_STATIC)/%.o,$(SOURCES))
OBJECTS_DYNAMIC := $(patsubst $(SRCDIR)/%.c,$(OBJDIR_DYNAMIC)/%.o,$(SOURCES))

VER_MAJOR := $(shell grep -m 1 '#define CONFIO_VER_MAJOR ' $(INCDIR)/confio/version.h | sed 's/#define .* //')
VER_MINOR := $(shell grep -m 1 '#define CONFIO_VER_MINOR ' $(INCDIR)/confio/version.h | sed 's/#define .* //')
VER_PATCH := $(shell grep -m 1 '#define CONFIO_VER_PATCH ' $(INCDIR)/confio/version.h | sed 's/#define .* //')
VER := $(VER_MAJOR).$(VER_MINOR).$(VER_PATCH)

BIN ?= confio
BIN_STATIC := lib$(BIN).a
BIN_DYNAMIC := lib$(BIN).so

TARGET_STATIC := $(OUTDIR)/$(BIN_STATIC)
TARGET_DYNAMIC := $(OUTDIR)/$(BIN_DYNAMIC).$(VER)

SYSROOT ?= /usr
SYSINC ?= $(SYSROOT)/include
SYSLIB ?= $(SYSROOT)/lib

CC ?= gcc
LD := $(CC)
AR ?= ar
_CC := $(TOOLCHAIN)$(CC)
_LD := $(TOOLCHAIN)$(LD)
_AR := $(TOOLCHAIN)$(AR)

_CFLAGS := $(CFLAGS) -std=c99 -Wall -Wextra -Wuninitialized -Wundef
_CPPFLAGS := $(CPPFLAGS) -I$(INCDIR)
_LDFLAGS := $(LDFLAGS)
_LDLIBS := $(LDLIBS)

ifeq ($(DEBUG),y)
    _CFLAGS += -g -fsanitize=address -fno-omit-frame-pointer -Wdouble-promotion
    #_CFLAGS += -Wconversion
    _LDFLAGS += -fsanitize=address
    O ?= g
else
    _CPPFLAGS += -DNDEBUG
    O ?= 2
endif
_CFLAGS += -O$(O)
ifeq ($(ASAN),y)
    _CFLAGS += -fsanitize=address
    _LDFLAGS += -fsanitize=address
endif

.SECONDEXPANSION:

define mkdir
if [ ! -d '$(1)' ]; then echo 'Creating $(1)/...'; mkdir -p '$(1)'; fi; true
endef
define rm
if [ -f '$(1)' ]; then echo 'Removing $(1)...'; rm -f '$(1)'; fi; true
endef
define rmdir
if [ -d '$(1)' ]; then echo 'Removing $(1)/...'; rm -rf '$(1)'; fi; true
endef

deps.filter := %.c %.h
deps.option := -MM
define deps
$$(filter $$(deps.filter),,$$(shell $(_CC) $(_CFLAGS) $(_CPPFLAGS) -E $(deps.option) $(1)))
endef

build: $(TARGET_STATIC) $(TARGET_DYNAMIC)
	@:

static: $(TARGET_STATIC)
	@:

dynamic: $(TARGET_DYNAMIC)
	@:

$(OUTDIR):
	@$(call mkdir,$@)

$(OBJDIR_STATIC):
	@$(call mkdir,$@)

$(OBJDIR_DYNAMIC):
	@$(call mkdir,$@)

$(OBJDIR_STATIC)/%.o: $(SRCDIR)/%.c $(call deps,$(SRCDIR)/%.c) | $(OBJDIR_STATIC) $(OUTDIR)
	@echo Compiling $<...
	@$(_CC) $(_CFLAGS) $(_CPPFLAGS) $< -c -o $@
	@echo Compiled $<

$(OBJDIR_DYNAMIC)/%.o: $(SRCDIR)/%.c $(call deps,$(SRCDIR)/%.c) | $(OBJDIR_DYNAMIC) $(OUTDIR)
	@echo Compiling $<... '(dynamic)'
	@$(_CC) $(_CFLAGS) -fPIC $(_CPPFLAGS) -DCONFIO_DYNAMIC $< -c -o $@
	@echo Compiled $< '(dynamic)'

$(TARGET_STATIC): $(OBJECTS_STATIC) | $(OUTDIR)
	@echo Creating $@...
	@$(_AR) rcs $@ $^
	@echo Created $@

$(TARGET_DYNAMIC): $(OBJECTS_DYNAMIC) | $(OUTDIR)
	@echo Linking $@...
	@$(_LD) $(_LDFLAGS) -shared $^ $(_LDLIBS) -o $@
	-@cd -- $(OUTDIR) && [ -e $(BIN_DYNAMIC).$(VER_MAJOR) ] || ln -s -- $(BIN_DYNAMIC).$(VER) $(BIN_DYNAMIC).$(VER_MAJOR)
	-@cd -- $(OUTDIR) && [ -e $(BIN_DYNAMIC) ] || ln -s -- $(BIN_DYNAMIC).$(VER_MAJOR) $(BIN_DYNAMIC)
	@echo Linked $@

clean:
	@$(call rmdir,$(OBJDIR))

distclean: clean
	@$(call rm,$(TARGET_STATIC))
	@$(call rm,$(OUTDIR)/$(BIN_DYNAMIC))
	@$(call rm,$(OUTDIR)/$(BIN_DYNAMIC).$(VER_MAJOR))
	@$(call rm,$(TARGET_DYNAMIC))

tests:
	@$(MAKE) -C tests

clean-tests:
	@$(MAKE) -C tests clean

distclean-tests:
	@$(MAKE) -C tests distclean

install:
	@echo Installing headers...
	@cp -r $(INCDIR)/* $(SYSINC)/
	@echo Installing libraries...
	@cp -r $(OUTDIR)/* $(SYSLIB)/
	@echo Done

.PHONY: build static dynamic clean distclean tests clean-tests distclean-tests install