aboutsummaryrefslogtreecommitdiffstats
path: root/Makefile
blob: 27011eeca82c767cd3b5ab2304c6d2ab7feeaf08 (plain) (blame)
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
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
# Copying and distribution of this file, with or without modification,
# are permitted in any medium without royalty provided the copyright
# notice and this notice are preserved.  This file is offered as-is,
# without any warranty.


# The package path prefix, if you want to install to another root, set DESTDIR to that root
PREFIX ?= /usr
# The library path excluding prefix
LIB ?= /lib
# The resource path excluding prefix
DATA ?= /share
# The library path including prefix
LIBDIR ?= $(PREFIX)$(LIB)
# The resource path including prefix
DATADIR ?= $(PREFIX)$(DATA)
# The generic documentation path including prefix
DOCDIR ?= $(DATADIR)/doc
# The info manual documentation path including prefix
INFODIR ?= $(DATADIR)/info
# The license base path including prefix
LICENSEDIR ?= $(DATADIR)/licenses

# The target and host platform
PLATFORM = posix

# The major version number of the current Python installation
PY_MAJOR = 3
# The minor version number of the current Python installation
PY_MINOR = 4
# The version number of the current Python installation without a dot
PY_VER = $(PY_MAJOR)$(PY_MINOR)
# The version number of the current Python installation with a dot
PY_VERSION = $(PY_MAJOR).$(PY_MINOR)

# The directory for python modules
PYTHONDIR = $(LIBDIR)/python$(PY_VERSION)

# The name of the package as it should be installed
PKGNAME = pylibgamma


# The installed pkg-config command
PKGCONFIG ?= pkg-config
# The installed cython command
CYTHON ?= cython
# The installed python command
PYTHON = python$(PY_MAJOR)


# Libraries to link with using pkg-config
LIBS = python$(PY_MAJOR)

# The C standard for C code compilation
STD = c99
# Optimisation settings for C code compilation
OPTIMISE ?= -Og -g



# Flags to use when compiling
CC_FLAGS = $$($(PKGCONFIG) --cflags $(LIBS)) -std=$(STD) \
           $(OPTIMISE) -fPIC $(CFLAGS) $(CPPFLAGS)

# Flags to use when linking
LD_FLAGS = $$($(PKGCONFIG) --libs $(LIBS)) -lgamma -std=$(STD) \
           $(OPTIMISE) -shared $(LDFLAGS)


# The suffixless basename of the .py-files
PYTHON_SRC = libgamma_error libgamma_facade libgamma_method libgamma

# The suffixless basename of the .py-files
CYTHON_SRC = libgamma_native_error libgamma_native_facade libgamma_native_method



.PHONY: all pyc-files pyo-files so-files
all: pyc-files pyo-files so-files
pyc-files: $(foreach M,$(PYTHON_SRC),src/__pycache__/$(M).cpython-$(PY_VER).pyc)
pyo-files: $(foreach M,$(PYTHON_SRC),src/__pycache__/$(M).cpython-$(PY_VER).pyo)
so-files: $(foreach M,$(CYTHON_SRC),bin/$(M).so)

bin/%.so: obj/%.o
	@mkdir -p bin
	$(CC) $(LD_FLAGS) -o $@ $^

obj/%.o: obj/%.c src/*.h
	$(CC) $(CC_FLAGS) -iquote"src" -c -o $@ $<

obj/%.c: obj/%.pyx
	if ! $(CYTHON) -3 -v $< ; then rm $@ ; false ; fi

obj/libgamma_native_facade.pyx: src/libgamma_native_facade.pyx
	@mkdir -p obj
	cp $< $@

obj/libgamma_native_method.pyx: src/libgamma_native_method.pyx
	@mkdir -p obj
	cp $< $@

ifeq ($(PLATFORM),windows)
obj/libgamma_native_error.pyx: src/libgamma_native_error.w32.pyx
	@mkdir -p obj
	cp $< $@
else
obj/libgamma_native_error.pyx: src/libgamma_native_error.pyx
	@mkdir -p obj
	cp $< $@
endif

src/__pycache__/%.cpython-$(PY_VER).pyc: src/%.py
	$(PYTHON) -m compileall $<

src/__pycache__/%.cpython-$(PY_VER).pyo: src/%.py
	$(PYTHON) -OO -m compileall $<


.PHONY: install
install: install-base

.PHONY: install-all
install-all: install-base

.PHONY: install-base
install-base: install-lib install-copyright


.PHONY: install-lib
install-lib: install-source install-compiled install-optimised install-native

.PHONY: install-source
install-source: $(foreach M,$(PYTHON_SRC),src/$(M).py)
	install -dm755 -- "$(DESTDIR)$(PYTHONDIR)"
	install -m644 $^ -- "$(DESTDIR)$(PYTHONDIR)"

.PHONY: install-compiled
install-compiled: $(foreach M,$(PYTHON_SRC),src/__pycache__/$(M).cpython-$(PY_VER).pyc)
	install -dm755 -- "$(DESTDIR)$(PYTHONDIR)/__pycache__"
	install -m644 $^ -- "$(DESTDIR)$(PYTHONDIR)/__pycache__"

.PHONY: install-optimised
install-optimised: $(foreach M,$(PYTHON_SRC),src/__pycache__/$(M).cpython-$(PY_VER).pyo)
	install -dm755 -- "$(DESTDIR)$(PYTHONDIR)/__pycache__"
	install -m644 $^ -- "$(DESTDIR)$(PYTHONDIR)/__pycache__"

.PHONY: install-native
install-native: $(foreach M,$(CYTHON_SRC),bin/$(M).so)
	install -dm755 -- "$(DESTDIR)$(PYTHONDIR)"
	install -m755 $^ -- "$(DESTDIR)$(PYTHONDIR)"


.PHONY: install-copyright
install-copyright: install-copying install-license

.PHONY: install-copying
install-copying: COPYING
	install -dm755 -- "$(DESTDIR)$(LICENSEDIR)/$(PKGNAME)"
	install -m644 $^ -- "$(DESTDIR)$(LICENSEDIR)/$(PKGNAME)"

.PHONY: install-license
install-license: LICENSE
	install -dm755 -- "$(DESTDIR)$(LICENSEDIR)/$(PKGNAME)"
	install -m644 $^ -- "$(DESTDIR)$(LICENSEDIR)/$(PKGNAME)"



.PHONY: uninstall
uninstall:
	-rm -- "$(DESTDIR)$(LICENSEDIR)/$(PKGNAME)/LICENSE"
	-rm -- "$(DESTDIR)$(LICENSEDIR)/$(PKGNAME)/COPYING"
	-rmdir -- "$(DESTDIR)$(LICENSEDIR)/$(PKGNAME)"
	-rm -- $(foreach M,$(PYTHON_SRC),"$(DESTDIR)$(PYTHONDIR)/__pycache__/$(M).cpython-$(PY_VER).pyo")
	-rm -- $(foreach M,$(PYTHON_SRC),"$(DESTDIR)$(PYTHONDIR)/__pycache__/$(M).cpython-$(PY_VER).pyc")
	-rm -- $(foreach M,$(PYTHON_SRC),"$(DESTDIR)$(PYTHONDIR)/$(M).py")
	-rm -- $(foreach M,$(CYTHON_SRC),"$(DESTDIR)$(PYTHONDIR)/$(M).so")


.PHONY: clean
clean:
	-rm -r obj bin src/__pycache__