/
Makefile
126 lines (106 loc) · 3.46 KB
/
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
export GO111MODULE=on
# Platform specific variables
PLATFORM_STATIC_LIB_SUFFIX :=
PLATFORM_SHARED_LIB_SUFFIX :=
ifeq ($(OS),Windows_NT)
PLATFORM_STATIC_LIB_SUFFIX := .lib
PLATFORM_SHARED_LIB_SUFFIX := .dll
else
UNAME_S := $(shell uname -s)
ifeq ($(UNAME_S),Linux)
PLATFORM_STATIC_LIB_SUFFIX := .a
PLATFORM_SHARED_LIB_SUFFIX := .so
endif
ifeq ($(UNAME_S),Darwin)
PLATFORM_STATIC_LIB_SUFFIX := .a
PLATFORM_SHARED_LIB_SUFFIX := .dylib
endif
endif
# PREFIX is environment variable, but if it is not set, then set default value
ifeq ($(PREFIX),)
PREFIX := /usr/local
endif
ifdef DEBUG
GODEBUG=cgocheck=2
export GODEBUG
GO_FLAGS += -gcflags=all="-N -l"
endif
# strip, and disable dwraf info
LDFLAGS = -s -w
STATIC_LDFLAGS =
SHARED_LDFLAGS =
ifdef STATIC
CC = /usr/bin/musl-gcc
export CC
LDFLAGS += -linkmode external -extldflags '-static'
endif
ifeq ($(UNAME_S),Linux)
LDFLAGS += -extldflags '-static-libgcc -static-libstdc++'
SHARED_LDFLAGS += -extldflags '-Wl,--version-script=objectfs.map'
endif
ifeq ($(UNAME_S),Darwin)
SHARED_LDFLAGS += -extldflags '-install_name @rpath/libobjectfs_shared.dylib'
endif
GO_FLAGS := -mod=vendor -trimpath
SOURCES = $(wildcard *.go)
EXPORT_HEADER := include/objectfs/objectfs_generated.h
STATIC_LIBRARY := lib/libobjectfs_static$(PLATFORM_STATIC_LIB_SUFFIX)
SHARED_LIBRARY := lib/libobjectfs_shared$(PLATFORM_SHARED_LIB_SUFFIX)
all: build
build: build-static build-shared
build-static: vendor $(STATIC_LIBRARY)
$(STATIC_LIBRARY): $(SOURCES)
go build $(GO_FLAGS) -ldflags="$(LDFLAGS)" -ldflags="$(STATIC_LDFLAGS)" -buildmode=c-archive -o $(STATIC_LIBRARY)
@mv lib/libobjectfs_static.h $(EXPORT_HEADER)
build-shared: vendor $(SHARED_LIBRARY)
$(SHARED_LIBRARY): $(SOURCES)
go build $(GO_FLAGS) -ldflags="$(LDFLAGS)" -ldflags="$(SHARED_LDFLAGS)" -buildmode=c-shared -o $(SHARED_LIBRARY)
@mv lib/libobjectfs_shared.h $(EXPORT_HEADER)
clean:
@rm -f $(EXPORT_HEADER)
@rm -f $(STATIC_LIBRARY)
@rm -f $(SHARED_LIBRARY)
@rm -rf bin/*
.PHONY: clean
# Installation
install: build
install -d $(DESTDIR)$(PREFIX)/lib/
install -m 644 $(STATIC_LIBRARY) $(DESTDIR)$(PREFIX)/lib/
install -m 644 $(SHARED_LIBRARY) $(DESTDIR)$(PREFIX)/lib/
install -d $(DESTDIR)$(PREFIX)/share/cmake
install -m 644 cmake/FindObjectFS.cmake $(DESTDIR)$(PREFIX)/share/cmake
install -d $(DESTDIR)$(PREFIX)/include/objectfs
install -m 644 $(EXPORT_HEADER) $(DESTDIR)$(PREFIX)/include/objectfs/
docker-build:
docker build -t objectfs .
.PHONY: docker-build
fmt:
@go fmt ./...
@clang-format -i include/objectfs/objectfs.h
@clang-format -i examples/*.cpp
.PHONY: fmt
vendor:
go mod tidy
go mod vendor
.PHONY: vendor
# Examples
examples: read_local
EXAMPLE_CC_LDFLAGS := -pthread
ifeq ($(UNAME_S),Linux)
EXAMPLE_CC_LDFLAGS += -Wl,"-rpath,\$$ORIGIN/../lib"
endif
ifeq ($(UNAME_S),Darwin)
EXAMPLE_CC_LDFLAGS += -Wl,"-rpath,@loader_path/../lib" -Wl,"-rpath,@executable_path/../lib"
endif
EXAMPLE_CC_FLAGS := -std=c++11 -O2 -Wall -Iinclude -Llib $(EXAMPLE_CC_LDFLAGS)
EXAMPLE_DEPS :=
ifdef STATIC
EXAMPLE_CC_FLAGS := $(EXAMPLE_CC_FLAGS) -lobjectfs_static
EXAMPLE_DEPS := $(EXAMPLE_DEPS) $(STATIC_LIBRARY)
else
EXAMPLE_CC_FLAGS := $(EXAMPLE_CC_FLAGS) -lobjectfs_shared
EXAMPLE_DEPS := $(EXAMPLE_DEPS) $(SHARED_LIBRARY)
endif
read_local: $(EXAMPLE_DEPS)
@mkdir -p bin/
$(CXX) examples/read_local.cpp $(EXAMPLE_CC_FLAGS) -o bin/read_local