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

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

# Make objects and depends (name)
define make_objs
$(1)_OBJ := $$($(1)_SOURCES:.c=.o)
$(1)_DEP := $$($(1)_SOURCES:.c=.d)
-include $$($(1)_DEP)
endef
71 72 73 74
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
75

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

123
# Make targets (name,path,amalgable yes|no,abiver)
124
make_bin = $(call make_target,$(1),$(2),$(BINEXT),$(BINFLAGS),$(BINDIR),$(3))
125
make_sbin = $(call make_target,$(1),$(2),$(BINEXT),$(BINFLAGS),$(SBINDIR),$(3))
126
make_lib = $(call make_target,$(1),$(2),$(LIBEXT),-$(LIBTYPE),$(LIBDIR),$(3),$(4))
127 128 129
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
130 131 132

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

136 137
# Find library alternative (pkg-config)
define find_alt
Marek Vavruša's avatar
Marek Vavruša committed
138
	ifeq ($$(strip $$($(1)_LIBS)),)
139 140 141 142 143 144 145
		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
146
	endif
147 148 149 150 151
	ifeq ($$(strip $$($(1)_LIBS)),)
		HAS_$(1) := no
	else
		HAS_$(1) := yes
	endif
152 153
endef

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

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

176 177 178 179
# Find Go package
define find_gopkg
	HAS_$(1) := $(shell go list $(2) > /dev/null 2>&1 && echo yes || echo no)
endef
180 181 182 183 184 185 186 187 188 189 190 191 192 193 194 195 196 197 198 199 200 201 202 203 204 205

define find_soname

# N/A on Windows
ifeq ($(PLATFORM),Windows)
	$(1)_SONAME = $(1).dll
endif

# Use otool -D on OS X
ifeq ($(PLATFORM),Darwin)
	$(1)_SONAME = $$(shell otool -D $$$$(pkg-config --variable=libdir $(1))/$(1)$(LIBEXT) | sed -ne 's,.*/\($(1)\.[0-9]*.$(LIBEXT)\),\1,p')
endif

# Use objdump -p on Linux and BSDs
ifeq ($(PLATFORM),POSIX)
ifeq ($(UNAME),OpenBSD)
	$(1)_SONAME = $$(shell basename $$$$(readlink -f $$$$(pkg-config --variable=libdir $(1))/$(1)$(LIBEXT)) | cut -f 1-3 -d .)
else
	$(1)_SONAME = $$(shell objdump -p $$$$(pkg-config --variable=libdir $(1))/$(1)$(LIBEXT) | sed -ne 's/[[:space:]]*SONAME[[:space:]]*\($(1)\.so\.[0-4]*\)/\1/p')
endif
endif

endef # find_soname

# Use this on OpenBSD
#