Skip to content

Instantly share code, notes, and snippets.

@SonoSooS
Created August 12, 2016 23:52
Show Gist options
  • Star 1 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save SonoSooS/1d912b519d31aeea3d42d6b510e181bd to your computer and use it in GitHub Desktop.
Save SonoSooS/1d912b519d31aeea3d42d6b510e181bd to your computer and use it in GitHub Desktop.
public Makefile for compiling Python27 for the 3DS
#---------------------------------------------------------------------------------
# Makefile by MarcusD (https://github.com/MarcuzD) © $(date +"%Y")
#---------------------------------------------------------------------------------
ifeq ($(strip $(DEVKITPRO)),)
$(error "Please set DEVKITPRO in your environment. export DEVKITPRO=<path to>devkitPro")
endif
ifeq ($(strip $(DEVKITARM)),)
$(error "Please set DEVKITARM in your environment. export DEVKITARM=<path to>devkitARM")
endif
TOPDIR ?= $(CURDIR)
include $(DEVKITARM)/base_tools
ifeq ($(strip $(CTRULIB)),)
export CTRULIB := $(DEVKITPRO)/libctru
endif
ifndef PYVERS
PYVERS := 2.7.12
endif
ANAME := libpython$(shell echo $(PYVERS) | sed 's/\([0-9]*\.\([0-9]*\)\).*/\1/').a
OUTDIR := py3DS$(PYVERS)
PYDIR := Python-$(PYVERS)
PYLINK := https://www.python.org/ftp/python/$(PYVERS)/Python-$(PYVERS).tgz
PYFILE := py.tgz
#---------------------------------------------------------------------------------
ARCH := -march=armv6k -mtune=mpcore -mfloat-abi=hard
CFLAGS := -g -Wall -O2 -mword-relocations \
-ffunction-sections -fno-strict-aliasing \
-fomit-frame-pointer -ffast-math \
-DARM11 -D_3DS \
$(ARCH) \
-I$(CTRULIB)/include
CXXFLAGS := $(CFLAGS) -fno-rtti -fno-exceptions -std=gnu++11
ASFLAGS := -g $(ARCH)
LDFLAGS := -g $(ARCH)
.PHONY: all clean
all: distfPY
distfPY: linkPY
@[ -d "$(OUTDIR)" ] || mkdir -p $(OUTDIR)
@[ -d "$(OUTDIR)/include" ] || mkdir -p $(OUTDIR)/include
@[ -d "$(OUTDIR)/include/py3DS" ] || mkdir -p $(OUTDIR)/include/py3DS
@[ -d "$(OUTDIR)/lib" ] || mkdir -p $(OUTDIR)/lib
cp $(ANAME) $(OUTDIR)/lib/
cp $(PYDIR)/Include/* $(OUTDIR)/include/py3DS
cp $(PYDIR)/pyconfig.h $(OUTDIR)/include/py3DS/
cp $(PYDIR)/Lib/socket.py $(PYDIR)/Lib/socket.pyX
cat $(PYDIR)/Lib/socket.pyX | sed 's/'"'"'getpeername'"'"', //g' >$(PYDIR)/Lib/socket.py
rm $(PYDIR)/Lib/socket.pyX
cd $(PYDIR)/Lib && ls *.py -1 | xargs zip ../../$(OUTDIR)/python.zip && find json/ encodings/ -type f | xargs zip ../../$(OUTDIR)/python.zip
touch distfPY
linkPY: soospatchPY
cd $(PYDIR) && make LIBRARY="$(ANAME)" LDLIBRARY="$(ANAME)" $(ANAME) && cd .. && cp $(PYDIR)/$(ANAME) . && touch linkPY
soospatchPY: compilePY
cp $(PYDIR)/pyconfig.h $(PYDIR)/pyconfig.h_old
cat $(PYDIR)/pyconfig.h_old | sed 's/^\([^#][^#]*#undef PY_FORMAT_LONG_LONG.*\)/\#define PY_FORMAT_LONG_LONG \"ll\" \1/' | sed 's/^\([^#][^#]*#undef HAVE_FSTATVFS.*\)/\#undef HAVE_FSTATVFS \1/' | sed 's/#define HAVE_\(EXECV\|FORK\|GETEGID\|GETEUID\|GETGID\|GETPPID\|GETUID\|KILL\|PIPE\|POPEN\|SYSTEM\|TTYNAME\|SYMLINK\|UTIME_H\|FDATASYNC\|TZNAME\|DECL_TZNAME\|WORKING_TZSET\).*/#undef HAVE_\1/g' | sed 's/^#define HAVE_\(STATVFS\|SYS_STATVFS_H\|FDATASYNC\|SYMLINK\|EXECV\|FORK\|GETEGID\|GETEUID\|GETGID\|GETPPID\|GETUID\|KILL\|PIPE\|POPEN\|SYSTEM\|TTYNAME\|SYMLINK\|UTIME_H\|FDATASYNC\|TZNAME\|DECL_TZNAME\|WORKING_TZSET\).*/#undef HAVE_\1/' | sed 's/^\([^#][^#]*#undef HAVE_SELECT.*\)/\#define HAVE_SELECT \1/' | sed 's/^\([^#][^#]*#undef HAVE_GETADDRINFO.*\)/struct servent {char*s_name;char**s_aliases;int s_port;char*s_proto;};\nstruct protoent{char*p_name;char**p_aliases;int p_proto;};\n#define SOCK_RAW 3\n#define SOCK_SEQPACKET 5\n#define IN_CLASSA_NSHIFT 24 \1/g' >$(PYDIR)/pyconfig.h
cp $(PYDIR)/Modules/posixmodule.c $(PYDIR)/Modules/posixmodule.c_old
cat $(PYDIR)/Modules/posixmodule.c_old | sed 's/\(^[^rt]*time_t atime, mtime;.*\)/return NULL; \1/' | sed 's/\(^[^ri]*i = (int)umask(i);.*\)/return NULL; \1/' | sed 's/^\([^#][^#]*#undef HAVE_FSTATVFS.*\)/\#undef HAVE_FSTATVFS \1/' | sed 's/#define HAVE_\(EXECV\|FORK\|GETEGID\|GETEUID\|GETGID\|GETPPID\|GETUID\|KILL\|PIPE\|POPEN\|SYSTEM\|TTYNAME\|SYMLINK\|UTIME_H\|FDATASYNC\).*/#undef HAVE_\1/g' | sed 's/^#define HAVE_\(STATVFS\|SYS_STATVFS_H\|FDATASYNC\|FTIME\|SYMLINK\|EXECV\|FORK\|GETEGID\|GETEUID\|GETGID\|GETPPID\|GETUID\|KILL\|PIPE\|POPEN\|SYSTEM\|TTYNAME\|SYMLINK\|UTIME_H\|FDATASYNC\).*/#undef HAVE_\1/' >$(PYDIR)/Modules/posixmodule.c
cp $(PYDIR)/Modules/socketmodule.c $(PYDIR)/Modules/socketmodule.c_old
cat $(PYDIR)/Modules/socketmodule.c_old | sed 's/ sizeof(addr->sa_data)/ 28/g' >$(PYDIR)/Modules/socketmodule.c
#cp $(PYDIR)/Objects/exceptions.c $(PYDIR)/Objects/exceptions.c_old
#cat $(PYDIR)/Objects/exceptions.c_old | sed 's/ESHUTDOWN/110/g' >$(PYDIR)/Objects/exceptions.c
#cp $(PYDIR)/Python/pytime.c $(PYDIR)/Python/pytime.c_old
#cat $(PYDIR)/Python/pytime.c_old | sed 's/CLOCK_MONOTONIC/(clockid_t)4/g' >$(PYDIR)/Python/pytime.c
touch soospatchPY
compilePY: extractedPY patchPY
cd $(PYDIR) && ./configure CC="$(CC)" CXX="$(CXX)" AS="$(AS)" AR="$(AR)" OBJCOPY="$(OBJCOPY)" STRIP="$(STRIP)" NM="$(NM)" RANLIB="$(RANLIB)" CFLAGS="$(CFLAGS)" CXXFLAGS="$(CXXFLAGS)" ASFLAGS="$(ASFLAGS)" LDFLAGS="$(LDFLAGS)" CONFIG_SITE="config.site" --disable-shared --without-threads --without-doc-strings --host=arm-none-eabi --build=`./config.guess` && cd .. && touch compilePY
patchPY:
cp $(PYDIR)/configure $(PYDIR)/configure_old
cat $(PYDIR)/configure_old | sed 's/ \*\-\*\-linux\*)/ \*\-\*\-linux\*\|arm\-none\-eabi)/g' >$(PYDIR)/configure
echo ac_cv_file__dev_ptmx=no >$(PYDIR)/config.site
echo ac_cv_file__dev_ptc=no >>$(PYDIR)/config.site
echo ac_cv_lib_dl_dlopen=no >>$(PYDIR)/config.site
cp $(PYDIR)/Modules/Setup.dist $(PYDIR)/Modules/Setup.dist_old
cat $(PYDIR)/Modules/Setup.dist_old | sed 's/^\([^#].* pwdmodule\.c.*\)/#\1/' | sed 's/^#\(array\|cmath\|math\|_struct\|operator\|_random\|_collections\|itertools\|strop\|unicodedata\|_io\|_csv\|_md5\|_sha\|_sha256\|_sha512\|binascii\|zlib\|select\|cStringIO\|time\|_functools\|_socket\|datetime\|_bisect\)\(.*\)/\1\2/' | sed "s#\\(zlib[^\$$]*\\)\$$(prefix)\\([^\$$]*\\)\$$(exec_prefix)\\(.*\\)#\1$(DEVKITPRO)/portlibs/armv6k\2$(DEVKITPRO)/portlibs/armv6k\3#" >$(PYDIR)/Modules/Setup.dist
touch patchPY
extractedPY: $(PYFILE)
tar xfzv $(PYFILE) && touch extractedPY
$(PYFILE):
wget -O "$(PYFILE)" "$(PYLINK)" || curl -Lo "$(PYFILE)" "$(PYLINK)"
clean:
@rm -rf $(PYDIR) $(PYFILE) patchPY extractedPY compilePY linkPY distfPY soospatchPY libpython*.a
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment