xref: /freebsd/contrib/bmake/mk/cython.mk (revision 6580f5c38dd5b01aeeaed16b370f1a12423437f0)
1# SPDX-License-Identifier: BSD-2-Clause
2#
3# RCSid:
4#	$Id: cython.mk,v 1.9 2024/02/17 17:26:57 sjg Exp $
5#
6#	@(#) Copyright (c) 2014, Simon J. Gerraty
7#
8#	This file is provided in the hope that it will
9#	be of use.  There is absolutely NO WARRANTY.
10#	Permission to copy, redistribute or otherwise
11#	use this file is hereby granted provided that
12#	the above copyright notice and this notice are
13#	left intact.
14#
15#	Please send copies of changes and bug-fixes to:
16#	sjg@crufty.net
17#
18
19# pyprefix is where python bits are
20# which may not be where we want to put ours (prefix)
21.if exists(/usr/pkg/include)
22pyprefix?= /usr/pkg
23.endif
24pyprefix?= /usr/local
25
26PYTHON_VERSION?= 2.7
27PYTHON_H?= ${pyprefix}/include/python${PYTHON_VERSION}/Python.h
28PYVERSION:= ${PYTHON_VERSION:C,\..*,,}
29
30CFLAGS+= -I${PYTHON_H:H}
31
32# conf.host_target() is limited to uname -m rather than uname -p
33_HOST_MACHINE!= uname -m
34.if ${HOST_TARGET:M*${_HOST_MACHINE}} == ""
35PY_HOST_TARGET:= ${HOST_TARGET:S,${_HOST_ARCH:U${uname -p:L:sh}}$,${_HOST_MACHINE},}
36.endif
37
38COMPILE.c?= ${CC} -c ${CFLAGS}
39PICO?= .pico
40
41.SUFFIXES: ${PICO} .c
42
43.c${PICO}:
44	${COMPILE.c} ${PICFLAG} ${CC_PIC} ${.IMPSRC} -o ${.TARGET}
45
46# this is what we build
47.if !empty(CYTHON_MODULE_NAME)
48CYTHON_MODULE = ${CYTHON_MODULE_NAME}${CYTHON_PYVERSION}.so
49
50CYTHON_SRCS?= ${CYTHON_MODULE_NAME}.pyx
51
52# this is where we save generated src
53CYTHON_SAVEGENDIR?= ${.CURDIR}/gen
54
55# set this empty if you don't want to handle multiple versions
56.if !defined(CYTHON_PYVERSION)
57CYTHON_PYVERSION:= ${PYVERSION}
58.endif
59
60CYTHON_GENSRCS= ${CYTHON_SRCS:R:S,$,${CYTHON_PYVERSION}.c,}
61SRCS+= ${CYTHON_GENSRCS}
62
63.SUFFIXES: .pyx .c .So
64
65CYTHON?= ${pyprefix}/bin/cython
66
67# if we don't have cython we can use pre-generated srcs
68.if ${type ${CYTHON} 2> /dev/null || echo:L:sh:M/*} == ""
69.PATH: ${CYTHON_SAVEGENDIR}
70.else
71
72.if !empty(CYTHON_PYVERSION)
73.for c in ${CYTHON_SRCS}
74${c:R}${CYTHON_PYVERSION}.${c:E}: $c
75	ln -sf ${.ALLSRC:M*pyx} ${.TARGET}
76.endfor
77.endif
78
79.pyx.c:
80	${CYTHON} ${CYTHON_FLAGS} -${PYVERSION} -o ${.TARGET} ${.IMPSRC}
81
82
83save-gen: ${CYTHON_GENSRCS}
84	mkdir -p ${CYTHON_SAVEGENDIR}
85	cp -p ${.ALLSRC} ${CYTHON_SAVEGENDIR}
86
87.endif
88
89${CYTHON_MODULE}: ${SRCS:S,.c,${PICO},}
90	${CC} ${CC_SHARED:U-shared} -o ${.TARGET} ${.ALLSRC:M*${PICO}} ${LDADD}
91
92MODULE_BINDIR?= ${.CURDIR:H}/${PY_HOST_TARGET:U${HOST_TARGET}}
93
94build-cython-module: ${CYTHON_MODULE}
95
96install-cython-module: ${CYTHON_MODULE}
97	test -d ${DESTDIR}${MODULE_BINDIR} || \
98	${INSTALL} -d ${DESTDIR}${MODULE_BINDIR}
99	${INSTALL} -m 755 ${.ALLSRC} ${DESTDIR}${MODULE_BINDIR}
100
101CLEANFILES+= *${PICO} ${CYTHON_MODULE}
102
103.endif
104