platform.mk 4.64 KB
Newer Older
1
2
3
4
# Platform-specific stuff
# Don't touch this unless you're changing the way targets are compiled
# You have been warned

5
# Platform-dependent stuff checks
Marek Vavruša's avatar
Marek Vavruša committed
6
CCLD := $(CC)
7
CGO := go tool cgo
8
GO := go
9
CAT := cat
Marek Vavruša's avatar
Marek Vavruša committed
10
11
LIBEXT := .so
MODEXT := $(LIBEXT)
12
AREXT  := .a
Marek Vavruša's avatar
Marek Vavruša committed
13
14
LIBTYPE := shared
MODTYPE := shared
15
ARTYPE  := static
Marek Vavruša's avatar
Marek Vavruša committed
16
17
BINEXT :=
PLATFORM = Linux
18
ARCH := $(word 1, $(subst -, ,$(shell $(CC) -dumpmachine)))
19
# Library versioning flags (platform-specific)
20
21
comma := ,
SOVER = $(if $(1),-Wl$(comma)-soname$(comma)$(3)$(call SOVER_EXT,$(1)))
22
23
# Library versioned extension (platform-specific)
SOVER_EXT = $(LIBEXT).$(1)
Marek Vavruša's avatar
Marek Vavruša committed
24
25
26
27
28
29
30
31
32
33
34
35
ifeq ($(OS),Windows_NT)
	PLATFORM := Windows
	RM := del
	LN := link
	LIBEXT := .lib
	BINEXT := .exe
else
	UNAME := $(shell uname -s)
    ifeq ($(UNAME),Darwin)
        PLATFORM := Darwin
        LIBEXT := .dylib
        MODTYPE := dynamiclib
36
37
38
39
        # OS X specific hardening since -pie doesn't work
        ifneq ($(HARDENING),no)
            BINFLAGS += -Wl,-pie
        endif
40
41
42
        # Version is prepended to dylib
        SOVER_EXT = .$(1)$(LIBEXT)
        SOVER = $(if $(1), -compatibility_version $(2) -current_version $(1),)
Marek Vavruša's avatar
Marek Vavruša committed
43
    else
44
        PLATFORM := POSIX
45
        LDFLAGS += -pthread -lm -Wl,-E
46
47
48
49
50
        # ELF hardening options
        ifneq ($(HARDENING),no)
            BINFLAGS += -pie
            LDFLAGS += -Wl,-z,relro,-z,now
        endif
51
52
53
        ifeq (,$(findstring BSD,$(UNAME)))
            LDFLAGS += -ldl
        endif
Marek Vavruša's avatar
Marek Vavruša committed
54
55
56
57
58
59
60
61
    endif
endif

# Silent compilation
ifeq ($(V),1)
	quiet = $($1)
else
	quiet = @echo "  $1	$2"; $($1)
62
endif
Marek Vavruša's avatar
Marek Vavruša committed
63
64
65
66
67
68
69

# Make objects and depends (name)
define make_objs
$(1)_OBJ := $$($(1)_SOURCES:.c=.o)
$(1)_DEP := $$($(1)_SOURCES:.c=.d)
-include $$($(1)_DEP)
endef
70
71
72
73
define make_objrule
$(1): $(1:.o=.c)
	$$(call quiet,CC,$$<) $(2) -MMD -MP -c $$< -o $$@
endef
Marek Vavruša's avatar
Marek Vavruša committed
74

75
# Make target (name,path,ext,ldflags,dst,amalgable)
Marek Vavruša's avatar
Marek Vavruša committed
76
define make_target
77
78
79
80
81
82
83
84
85
ifeq ($(AMALG)|$(6), yes|yes)
$(1).amalg.c: $$($(1)_SOURCES)
	$(call quiet,CAT,$$@) $$($(1)_SOURCES) > $$@
# AR requires .o compiled
$(1)_OBJ := $(1).amalg.c
ifeq ($(4),-$(ARTYPE))
$(1)_OBJ := $(1).amalg.o
endif
else
Marek Vavruša's avatar
Marek Vavruša committed
86
$$(eval $$(call make_objs,$(1)))
87
endif
88
# Rules to generate objects with custom CFLAGS and binary/library
89
$$(foreach obj,$$($(1)_OBJ),$$(eval $$(call make_objrule,$$(obj),$$(BUILD_CFLAGS) $$($(1)_CFLAGS))))
90
$(1) := $(2)/$(1)$(3)
Marek Vavruša's avatar
Marek Vavruša committed
91
$(2)/$(1)$(3): $$($(1)_OBJ) $$($(1)_DEPEND)
92
93
94
ifeq ($(4),-$(ARTYPE))
	$(call quiet,AR,$$@) rcs $$@ $$($(1)_OBJ)
else
95
	$(call quiet,CCLD,$$@) $$($(1)_CFLAGS) $(BUILD_CFLAGS) $$($(1)_OBJ) $(call SOVER,$(7),$(7),$(1)) -o $$@ $(4) $$($(1)_LIBS) $(BUILD_LDFLAGS) $$($(1)_LDFLAGS)
96
endif
97
# Additional rules
Marek Vavruša's avatar
Marek Vavruša committed
98
$(1)-clean:
99
100
101
102
	$(RM) $$($(1)_OBJ) $$($(1)_DEP) $(2)/$(1)$(3)
ifeq ($(6), yes)
	$(RM) $(1).amalg.c $(1).amalg.o
endif
Marek Vavruša's avatar
Marek Vavruša committed
103
$(1)-install: $(2)/$(1)$(3)
104
# Modules install to special path
105
ifneq ($(5),$(MODULEDIR))
Marek Vavruša's avatar
Marek Vavruša committed
106
	$(INSTALL) -d $(DESTDIR)$(5)
107
endif
108
109
110
111
112
# Versioned library install
ifneq ($(strip $(7)),)
	$(INSTALL) $(2)/$(1)$(3) $(DESTDIR)$(5)/$(1)$(call SOVER_EXT,$(7))
	$(LN) -f $(1)$(call SOVER_EXT,$(7)) $(DESTDIR)$(5)/$(1)$(3)
else
Marek Vavruša's avatar
Marek Vavruša committed
113
	$(INSTALL) $(2)/$(1)$(3) $(DESTDIR)$(5)
114
endif
Marek Vavruša's avatar
Marek Vavruša committed
115
ifneq ($$(strip $$($(1)_HEADERS)),)
Marek Vavruša's avatar
Marek Vavruša committed
116
117
	$(INSTALL) -d $(DESTDIR)$(INCLUDEDIR)/$(1)
	$(INSTALL) -m 644 $$($(1)_HEADERS) $(DESTDIR)$(INCLUDEDIR)/$(1)
Marek Vavruša's avatar
Marek Vavruša committed
118
endif
119
.PHONY: $(1)-clean $(1)-install
Marek Vavruša's avatar
Marek Vavruša committed
120
121
endef

122
# Make targets (name,path,amalgable yes|no,abiver)
123
make_bin = $(call make_target,$(1),$(2),$(BINEXT),$(BINFLAGS),$(BINDIR),$(3))
124
make_lib = $(call make_target,$(1),$(2),$(LIBEXT),-$(LIBTYPE),$(LIBDIR),$(3),$(4))
125
126
127
make_module = $(call make_target,$(1),$(2),$(LIBEXT),-$(LIBTYPE),$(MODULEDIR),$(3))
make_shared = $(call make_target,$(1),$(2),$(MODEXT),-$(MODTYPE),$(LIBDIR),$(3))
make_static = $(call make_target,$(1),$(2),$(AREXT),-$(ARTYPE),$(LIBDIR),$(3))
Marek Vavruša's avatar
Marek Vavruša committed
128
129
130

# Find library (pkg-config)
define find_lib
131
	$(call find_alt,$(1),$(1),$(2))
Marek Vavruša's avatar
Marek Vavruša committed
132
133
endef

134
135
# Find library alternative (pkg-config)
define find_alt
Marek Vavruša's avatar
Marek Vavruša committed
136
	ifeq ($$(strip $$($(1)_LIBS)),)
137
138
139
140
141
142
143
		ifneq ($(strip $(3)),)
			$(1)_VER := $(shell pkg-config --atleast-version=$(3) $(2) && echo $(3))
		endif
		ifeq ($(strip $(3)),$$($(1)_VER))
			$(1)_CFLAGS := $(shell pkg-config --cflags $(2) --silence-errors)
			$(1)_LIBS := $(shell pkg-config --libs $(2)  --silence-errors)
		endif
Marek Vavruša's avatar
Marek Vavruša committed
144
	endif
145
146
147
148
149
	ifeq ($$(strip $$($(1)_LIBS)),)
		HAS_$(1) := no
	else
		HAS_$(1) := yes
	endif
150
151
endef

152
153
154
# Find binary
define find_bin
	ifeq ($$(strip $$($(1)_BIN)),)
Marek Vavruša's avatar
Marek Vavruša committed
155
156
157
158
		$(1)_BIN := $(shell which $(1))
	endif
	ifeq ($$(strip $$($(1)_BIN)),)
		HAS_$(1) := no
159
160
161
162
163
	else
		HAS_$(1) := yes
		$(1) := $$($(1)_BIN)
	endif
endef
164
165
166

# Find version
define find_ver
167
	ifeq ($(shell test $(2) -ge $(3); echo $$?),0)
168
169
170
171
172
173
		HAS_$(1) := yes
	else
		HAS_$(1) := no
	endif
endef

174
175
176
177
# Find Go package
define find_gopkg
	HAS_$(1) := $(shell go list $(2) > /dev/null 2>&1 && echo yes || echo no)
endef