aboutsummaryrefslogtreecommitdiffstats
path: root/Makefile
blob: bba43f4432f18695ace6f0bb3a371bcef7c1b22b (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
# 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 license base path including prefix
LICENSEDIR = ${DATADIR}/licenses


# The major version number of the current Python installation
PY_MAJOR = $(shell python -V | cut -d ' ' -f 2 | cut -d . -f 1)
# The minor version number of the current Python installation
PY_MINOR = $(shell python -V | cut -d ' ' -f 2 | cut -d . -f 2)
# 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 = python-bus


# 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 = -O2


# 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}) -lbus -std=${STD} ${OPTIMISE} -shared ${LDFLAGS}


# The suffixless basename of the .py-files
PYTHON_SRC = bus

# The suffixless basename of the .py-files
CYTHON_SRC = native_bus


# Filename extension for -OO optimised python files
ifeq ($(shell test $(PY_VER) -ge 35 ; echo $$?),0)
PY_OPT2_EXT = opt-2.pyc
else
PY_OPT2_EXT = pyo
endif



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}.$(PY_OPT2_EXT))
so-files: $(foreach M,${CYTHON_SRC},bin/${M}.so)

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

obj/%.o: obj/%.c
	${CC} ${CC_FLAGS} -iquote"src" -c -o $@ $<

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

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

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

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



install: install-base

install-all: install-base
install-base: install-lib install-copyright
install-lib: install-source install-compiled install-optimised install-native

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

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

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

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

install-copyright: install-license

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



uninstall:
	-rm -- "${DESTDIR}${LICENSEDIR}/${PKGNAME}/LICENSE"
	-rmdir -- "${DESTDIR}${LICENSEDIR}/${PKGNAME}"
	-rm -- $(foreach M,${PYTHON_SRC},"${DESTDIR}${PYTHONDIR}/__pycache__/${M}.cpython-${PY_VER}.$(PY_OPT2_EXT)")
	-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")



clean:
	-rm -r obj bin src/__pycache__



.PHONY: all pyc-files pyo-files so-files install install-all install-base \
        install-lib install-source install-compiled install-optimised \
        install-native install-copyright install-license uninstall clean