xref: /illumos-gate/usr/src/tools/Makefile.python (revision b8052df9f609edb713f6828c9eecc3d7be19dfb3)
1#
2# CDDL HEADER START
3#
4# The contents of this file are subject to the terms of the
5# Common Development and Distribution License (the "License").
6# You may not use this file except in compliance with the License.
7#
8# You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE
9# or http://www.opensolaris.org/os/licensing.
10# See the License for the specific language governing permissions
11# and limitations under the License.
12#
13# When distributing Covered Code, include this CDDL HEADER in each
14# file and include the License file at usr/src/OPENSOLARIS.LICENSE.
15# If applicable, add the following below this CDDL HEADER, with the
16# fields enclosed by brackets "[]" replaced with your own identifying
17# information: Portions Copyright [yyyy] [name of copyright owner]
18#
19# CDDL HEADER END
20#
21
22#
23# Copyright (c) 2010, Oracle and/or its affiliates. All rights reserved.
24# Copyright 2018 OmniOS Community Edition (OmniOSce) Association.
25#
26
27#
28# This Makefile provides a framework for building the onbld python
29# modules with multiple versions of python.
30#
31# It expects as input:
32#
33#    PYSRCS   - List of python source files, these are also delivered as
34#               build product.
35#
36#    PYOBJS   - List of compiled python (.pyc) files, with no directory prefix
37#
38#    PYTOPDIR - Absolute (including $(ROOT)) path to which files will
39#               be installed, up until the version specific component.
40#
41#    PYMODDIR - Relative path to which files will be installed, below
42#               the version specific component.
43#
44#    For example, to install to /opt/onbld/lib/onbld/python*/bar/
45#
46#          PYTOPDIR = $(ROOTONBLDLIB)
47#          PYMODDIR = bar
48#
49#
50# It provides as output:
51#
52#    ROOTPYFILES - The list of $(ROOT)-relative paths to which python
53#                  source and binary files will be installed.  Your
54#                  Makefile's 'install' target should depend upon
55#                  this.
56#
57#    PYVERSOBJS  - The list of paths to compiled python build products,
58#                  including their subdirectory.
59#
60#    pyclobber   - A target on which 'clobber' should depend, which
61#                  removes the per-version python directories and the
62#                  output within them.
63#
64
65PYFILES = $(PYSRCS) $(PYOBJS)
66
67ROOTPYDIR = $(PYTOPDIR)/python$(PYVER)/$(PYMODDIR)
68ROOTPYFILES	= $(PYFILES:%=$(ROOTPYDIR)/%)
69
70$(ROOTPYFILES) := FILEMODE = 0444
71
72PYVERSDIRS = python$(PYVER)
73
74PYVERSOBJS = $(PYOBJS:%=python$(PYVER)/%)
75
76CLOBBERFILES += $(PYVERSOBJS)
77CLOBBERDIRS += $(PYVERSDIRS)
78
79.KEEP_STATE:
80
81$(ROOTPYDIR)/%.py: ../%.py
82	$(INS.pyfile)
83
84pyclobber:
85	$(RM) $(CLOBBERFILES)
86	$(RM) -rf $(CLOBBERDIRS)
87
88# Python module compilation
89python$(PYVER)/__pycache__/%.cpython$(PYPKGVERS).pyc: ../%.py
90	@[ -d $(@D) ] || mkdir -p $(@D)
91	$(RM) $@
92	$(PYTHON3) -mpy_compile $<
93	$(MV) ../__pycache__/$(*).cpython$(PYPKGVERS).pyc $@
94
95$(ROOTPYDIR)/__pycache__/%.pyc: python$(PYVER)/__pycache__/%.pyc
96	$(INS.pyfile)
97