-
Notifications
You must be signed in to change notification settings - Fork 1
/
Makefile
121 lines (83 loc) · 3.16 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
system := $(shell uname -s)
so_name := libfib.so
ifeq ($(system),Darwin)
so_name := libfib.dylib
endif
ghc_version := $(shell ghc --numeric-version)
ghc_prefix := $(shell dirname $(shell dirname $(shell which ghc)))
ghc_include := $(ghc_prefix)/lib/ghc-$(ghc_version)/include
ghc_flags := -O2 -Wall
dynamic_ghc_flags := $(ghc_flags) -dynamic -outputdir=dist/dynamic
static_ghc_flags := $(ghc_flags) -static -outputdir=dist/static
dynamic_so_ghc_flags := $(dynamic_ghc_flags) -shared
static_so_ghc_flags := $(static_ghc_flags) -shared
ifeq ($(system),Darwin)
static_so_ghc_flags += -optl-Wl,-no_compact_unwind
endif
ghc_rts_version := $(shell ghc-pkg field --simple-output rts version)
dynamic_ghc_rts_libs := -lHSrts_thr-ghc$(ghc_version)
static_ghc_rts_libs := rts-$(ghc_rts_version)/libHSrts_thr.a rts-$(ghc_rts_version)/libCffi_thr.a
cc_flags := -O2
ifeq ($(system),Darwin)
cc_flags += -Weverything
else
cc_flags += -Wall -fPIC
endif
test_cc_flags := $(cc_flags) -Isrc/libfib
o_cc_flags := $(cc_flags) -I$(ghc_include) -DSO_NAME=$(so_name)
dynamic_o_cc_flags := $(o_cc_flags) -DSO_FLAVOUR=dynamic -Idist/dynamic
static_o_cc_flags := $(o_cc_flags) -DSO_FLAVOUR=static -Idist/static
ifneq ($(system),Darwin)
test_cc_libs := -ldl -lpthread
else
test_cc_libs :=
endif
all: test
.PHONY: build clean test
build: dist/test dynamic-build static-build
clean:
rm -rf dist
test: dist/test dynamic-test static-test
dist:
mkdir $@
dist/test: src/test.c src/libfib/libfib.h | dist
cc $(test_cc_flags) -o $@ $< $(test_cc_libs)
.PHONY: dynamic-build dynamic-clean dynamic-test
dynamic-build: dist/dynamic/$(so_name)
dynamic-clean:
rm -rf dist/dynamic
dynamic-test: dist/test dynamic-build
dist/test dist/dynamic/$(so_name)
dist/dynamic: | dist
mkdir $@
dist/dynamic/Fib.o dist/dynamic/Fib_stub.h: src/libfib/Fib.hs | dist/dynamic
ghc -c $(dynamic_ghc_flags) $^
dist/dynamic/libfib.o: src/libfib/libfib.c src/libfib/libfib.h dist/dynamic/Fib_stub.h
cc -c $(dynamic_o_cc_flags) -o $@ $<
dist/dynamic/$(so_name): dist/dynamic/libfib.o dist/dynamic/Fib.o
ghc $(dynamic_so_ghc_flags) -o $@ $^ $(dynamic_ghc_rts_libs)
dist/ghc_pkgs: dist/dynamic/libfib.o dist/dynamic/Fib.o
$(eval ghc_pkgs := \
$(patsubst -lHS%-ghc$(ghc_version),%,\
$(filter -lHS%-ghc$(ghc_version),\
$(shell ghc $(dynamic_so_ghc_flags) -pgml echo $^ 2>&1))))
echo $(ghc_pkgs) >dist/ghc_pkgs
.PHONY: static-build static-clean static-test
static-build: dist/static/$(so_name)
static-clean:
rm -rf dist/static
static-test: dist/test static-build
dist/test dist/static/$(so_name)
dist/static: | dist
mkdir $@
dist/static/Fib.o dist/static/Fib_stub.h: src/libfib/Fib.hs | dist/static
ghc -c $(static_ghc_flags) $^
dist/static/libfib.o: src/libfib/libfib.c src/libfib/libfib.h dist/static/Fib_stub.h
cc -c $(static_o_cc_flags) -o $@ $<
dist/static/$(so_name): dist/static/libfib.o dist/static/Fib.o dist/ghc_pkgs
$(eval libs := \
$(patsubst %,$(ghc_prefix)/lib/ghc-$(ghc_version)/%,\
$(static_ghc_rts_libs) \
$(join $(patsubst %,%/libHS,$(ghc_pkgs)),\
$(patsubst %,%.a,$(ghc_pkgs)))))
ghc $(static_so_ghc_flags) -o $@ $(filter-out dist/ghc_pkgs,$^) $(libs)