|
| 1 | +############################################################################ |
| 2 | +# apps/interpreters/python/Makefile |
| 3 | +# |
| 4 | +# Licensed to the Apache Software Foundation (ASF) under one or more |
| 5 | +# contributor license agreements. See the NOTICE file distributed with |
| 6 | +# this work for additional information regarding copyright ownership. The |
| 7 | +# ASF licenses this file to you under the Apache License, Version 2.0 (the |
| 8 | +# "License"); you may not use this file except in compliance with the |
| 9 | +# License. You may obtain a copy of the License at |
| 10 | +# |
| 11 | +# http://www.apache.org/licenses/LICENSE-2.0 |
| 12 | +# |
| 13 | +# Unless required by applicable law or agreed to in writing, software |
| 14 | +# distributed under the License is distributed on an "AS IS" BASIS, WITHOUT |
| 15 | +# WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the |
| 16 | +# License for the specific language governing permissions and limitations |
| 17 | +# under the License. |
| 18 | +# |
| 19 | +############################################################################ |
| 20 | + |
| 21 | +include $(APPDIR)/Make.defs |
| 22 | + |
| 23 | +CPYTHON_URL ?= "https://github.com/python/cpython/archive" |
| 24 | +CPYTHON_VERSION = $(patsubst "%",%,$(strip $(CONFIG_INTERPRETER_CPYTHON_VERSION))) |
| 25 | +CPYTHON_ZIP = v$(CPYTHON_VERSION).zip |
| 26 | + |
| 27 | +CPYTHON_UNPACKNAME = Python |
| 28 | +UNPACK ?= unzip -q -o |
| 29 | + |
| 30 | +MACHDEP=nuttx |
| 31 | +CONFIG_SITE=${CURDIR}/config.site |
| 32 | +CPYTHON_PATH=$(CURDIR)/$(CPYTHON_UNPACKNAME) |
| 33 | + |
| 34 | +BUILDIR=$(CURDIR)/build |
| 35 | +INSTALLDIR=$(CURDIR)/install |
| 36 | +HOSTBUILD=$(BUILDIR)/host |
| 37 | +HOSTINSTALL=$(INSTALLDIR)/host |
| 38 | +HOSTPYTHON=$(HOSTINSTALL)/bin/python3 |
| 39 | +TARGETBUILD=$(BUILDIR)/target |
| 40 | +TARGETINSTALL=$(INSTALLDIR)/target |
| 41 | +TARGETLIBPYTHON=$(TARGETINSTALL)/libpython3.13.a |
| 42 | +TARGETMODULESPACK=$(TARGETBUILD)/lib/python313.zip |
| 43 | +TARGETMODULES=$(TARGETINSTALL)/lib/ |
| 44 | + |
| 45 | +DEPPATH += --dep-path $(CPYTHON_UNPACKNAME)$(DELIM)Programs |
| 46 | +VPATH += :$(CPYTHON_UNPACKNAME)$(DELIM)Programs |
| 47 | + |
| 48 | +$(CPYTHON_ZIP): |
| 49 | + @echo "Downloading: $(CPYTHON_URL)/$(CPYTHON_ZIP)" |
| 50 | + $(Q) $(call DOWNLOAD,$(CPYTHON_URL),$(CPYTHON_ZIP)) |
| 51 | + |
| 52 | +$(CPYTHON_UNPACKNAME): $(CPYTHON_ZIP) |
| 53 | + @echo "Unpacking: $(CPYTHON_ZIP) -> $(CPYTHON_UNPACKNAME)" |
| 54 | + $(Q) $(UNPACK) $(CPYTHON_ZIP) |
| 55 | + $(Q) mv cpython-$(CPYTHON_VERSION) $(CPYTHON_UNPACKNAME) |
| 56 | + @echo "Patching $(CPYTHON_UNPACKNAME)" |
| 57 | + $(Q) patch -p1 -d $(CPYTHON_UNPACKNAME) < patch$(DELIM)0001-workaround-newlib-resource.h-limitations.patch |
| 58 | + $(Q) patch -p1 -d $(CPYTHON_UNPACKNAME) < patch$(DELIM)0002-fix-various-uint32_t-unsigned-int-type-mismatch-issu.patch |
| 59 | + $(Q) patch -p1 -d $(CPYTHON_UNPACKNAME) < patch$(DELIM)0003-reuse-wasm_assets.py-for-generating-an-archive-of-py.patch |
| 60 | + $(Q) patch -p1 -d $(CPYTHON_UNPACKNAME) < patch$(DELIM)0004-recognize-nuttx-as-a-supported-OS.patch |
| 61 | + $(Q) patch -p1 -d $(CPYTHON_UNPACKNAME) < patch$(DELIM)0005-gh-122907-Fix-Builds-Without-HAVE_DYNAMIC_LOADING-Se.patch |
| 62 | + $(Q) patch -p1 -d $(CPYTHON_UNPACKNAME) < patch$(DELIM)0006-change-var-name-to-avoid-conflict-with-nuttx-unused_.patch |
| 63 | + $(Q) patch -p1 -d $(CPYTHON_UNPACKNAME) < patch$(DELIM)0007-undef-atexit_register.patch |
| 64 | + $(Q) patch -p1 -d $(CPYTHON_UNPACKNAME) < patch$(DELIM)0008-declare-struct-timeval.patch |
| 65 | + $(Q) patch -p1 -d $(CPYTHON_UNPACKNAME) < patch$(DELIM)0009-include-nuttx-sys-select-header-to-define-FD_SETSIZE.patch |
| 66 | + $(Q) patch -p1 -d $(CPYTHON_UNPACKNAME) < patch$(DELIM)0010-check-for-the-d_ino-member-of-the-structure-dirent.patch |
| 67 | + |
| 68 | +$(HOSTPYTHON): |
| 69 | + mkdir -p $(HOSTBUILD) |
| 70 | + mkdir -p $(HOSTINSTALL) |
| 71 | + $(Q) ( \ |
| 72 | + cd $(HOSTBUILD) && $(CPYTHON_PATH)/configure \ |
| 73 | + --with-pydebug \ |
| 74 | + --prefix=$(HOSTINSTALL) \ |
| 75 | + ) |
| 76 | + $(MAKE) -C $(HOSTBUILD) install |
| 77 | + |
| 78 | +$(TARGETBUILD)/Makefile: $(HOSTPYTHON) |
| 79 | + $(Q) mkdir -p $(TARGETBUILD)/Modules |
| 80 | + $(Q) mkdir -p $(TARGETMODULES)/python3.13 |
| 81 | + $(Q) ( cp Setup.local $(TARGETBUILD)/Modules/Setup.local ) |
| 82 | + $(Q) ( ls -la $(TARGETBUILD)/Modules/Setup.local ) |
| 83 | + $(Q) ( \ |
| 84 | + cd $(TARGETBUILD); \ |
| 85 | + CFLAGS="$(CFLAGS)"; \ |
| 86 | + ARCH=$(CONFIG_ARCH); \ |
| 87 | + ARCH_CHIP=$(CONFIG_ARCH_CHIP); \ |
| 88 | + echo "ARCH: $${ARCH}"; \ |
| 89 | + echo "ARCH_CHIP: $${ARCH_CHIP}"; \ |
| 90 | + ARCH="$${ARCH//-/}"; \ |
| 91 | + ARCH_CHIP="$${ARCH_CHIP//-/}"; \ |
| 92 | + echo "ARCH: $${ARCH}"; \ |
| 93 | + echo "ARCH_CHIP: $${ARCH_CHIP}"; \ |
| 94 | + CFLAGS="$$(echo "$${CFLAGS}" | sed 's/-Os //')" \ |
| 95 | + CC="$(CC)" \ |
| 96 | + CXX="$(CXX)" \ |
| 97 | + AR="$(AR)" \ |
| 98 | + ARFLAGS=" " \ |
| 99 | + MACHDEP="$(MACHDEP)" \ |
| 100 | + OPT="-g -O0 -Wall" \ |
| 101 | + CONFIG_SITE="$(CONFIG_SITE)" \ |
| 102 | + $(CPYTHON_PATH)/configure \ |
| 103 | + --prefix=${TARGETINSTALL} \ |
| 104 | + --disable-shared \ |
| 105 | + --host=$${ARCH}-$${ARCH_CHIP}-nuttx \ |
| 106 | + --build=$(shell $(CPYTHON_PATH)/config.guess) \ |
| 107 | + --with-build-python=${HOSTPYTHON} \ |
| 108 | + --without-mimalloc \ |
| 109 | + --without-pymalloc \ |
| 110 | + --disable-test-modules \ |
| 111 | + ) |
| 112 | + |
| 113 | +$(TARGETLIBPYTHON): $(TARGETBUILD)/Makefile |
| 114 | + $(MAKE) -C $(TARGETBUILD) regen-frozen |
| 115 | + $(MAKE) -C $(TARGETBUILD) libpython3.13.a wasm_stdlib |
| 116 | + $(Q) ( cp $(TARGETBUILD)/libpython3.13.a $(TARGETLIBPYTHON) ) |
| 117 | + $(Q) $(UNPACK) $(TARGETMODULESPACK) -d $(TARGETMODULES)/python3.13 |
| 118 | + |
| 119 | +CFLAGS += ${INCDIR_PREFIX}$(CPYTHON_PATH)$(DELIM)Include |
| 120 | +CFLAGS += ${INCDIR_PREFIX}$(CPYTHON_PATH)$(DELIM)Test |
| 121 | +CFLAGS += ${INCDIR_PREFIX}$(CPYTHON_PATH)$(DELIM)Include$(DELIM)internal |
| 122 | +CFLAGS += ${INCDIR_PREFIX}$(APPDIR)$(DELIM)system |
| 123 | +CFLAGS += ${INCDIR_PREFIX}$(APPDIR)$(DELIM)system$(DELIM)zlib$(DELIM)zlib |
| 124 | +CFLAGS += ${INCDIR_PREFIX}$(TARGETBUILD) |
| 125 | + |
| 126 | +MODULE = $(CONFIG_INTERPRETER_CPYTHON) |
| 127 | + |
| 128 | +PROGNAME += $(CONFIG_INTERPRETER_CPYTHON_PROGNAME) |
| 129 | +PRIORITY += $(CONFIG_INTERPRETER_CPYTHON_PRIORITY) |
| 130 | +STACKSIZE += $(CONFIG_INTERPRETER_CPYTHON_STACKSIZE) |
| 131 | + |
| 132 | +MAINSRC += python.c |
| 133 | + |
| 134 | +PROGNAME += $(CONFIG_INTERPRETER_CPYTHON_MOUNT_MODULES_PROGNAME) |
| 135 | +PRIORITY += $(CONFIG_INTERPRETER_CPYTHON_MOUNT_MODULES_PRIORITY) |
| 136 | +STACKSIZE += $(CONFIG_INTERPRETER_CPYTHON_MOUNT_MODULES_STACKSIZE) |
| 137 | + |
| 138 | +MAINSRC += mount_modules.c |
| 139 | + |
| 140 | +checkgenromfs: |
| 141 | + @genromfs -h 1>/dev/null 2>&1 || { \ |
| 142 | + echo "Host executable genromfs not available in PATH"; \ |
| 143 | + echo "You may need to download in from https://romfs.sourceforge.net/"; \ |
| 144 | + exit 1; \ |
| 145 | + } |
| 146 | + |
| 147 | +romfs_cpython_modules.img : $(TARGETLIBPYTHON) checkgenromfs |
| 148 | + @genromfs -f $@ -d $(TARGETMODULES) -V "ROMFS_Test" || { echo "genromfs failed" ; exit 1 ; } |
| 149 | + |
| 150 | +romfs_cpython_modules.h : romfs_cpython_modules.img |
| 151 | + @xxd -i $< >$@ || { echo "xxd of $< failed" ; exit 1 ; } |
| 152 | + |
| 153 | +context:: $(CPYTHON_UNPACKNAME) |
| 154 | + |
| 155 | +depend:: romfs_cpython_modules.h |
| 156 | + |
| 157 | +distclean:: |
| 158 | + $(call DELDIR, $(BUILDIR)) |
| 159 | + $(call DELDIR, $(INSTALLDIR)) |
| 160 | + $(call DELDIR, $(CPYTHON_UNPACKNAME)) |
| 161 | + $(call DELFILE, $(CPYTHON_ZIP)) |
| 162 | + $(call DELFILE, romfs_cpython_modules.img) |
| 163 | + $(call DELFILE, romfs_cpython_modules.h) |
| 164 | + |
| 165 | +include $(APPDIR)/Application.mk |
0 commit comments