Skip to content

Commit 5a1bc3c

Browse files
committed
unix: add support for aarch64-unknown-linux-gnu and armv7-unknown-linux-gnueabi
With Stretch based Linux cross-compiling in place, it is pretty easy to define new targets now! Same caveats as existing cross builds exists: these are probably broken in subtle ways.
1 parent 84a9573 commit 5a1bc3c

8 files changed

+179
-2
lines changed

cpython-unix/build-cpython.sh

Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -592,6 +592,16 @@ if [ "${BUILD_TRIPLE}" != "${TARGET_TRIPLE}" ]; then
592592
CONFIGURE_FLAGS="${CONFIGURE_FLAGS} ac_cv_file__dev_ptc=no"
593593
CONFIGURE_FLAGS="${CONFIGURE_FLAGS} ac_cv_file__dev_ptmx=no"
594594
;;
595+
aarch64-unknown-linux-gnu)
596+
CONFIGURE_FLAGS="${CONFIGURE_FLAGS} ac_cv_buggy_getaddrinfo=no"
597+
CONFIGURE_FLAGS="${CONFIGURE_FLAGS} ac_cv_file__dev_ptc=no"
598+
CONFIGURE_FLAGS="${CONFIGURE_FLAGS} ac_cv_file__dev_ptmx=no"
599+
;;
600+
armv7-unknown-linux-gnueabi)
601+
CONFIGURE_FLAGS="${CONFIGURE_FLAGS} ac_cv_buggy_getaddrinfo=no"
602+
CONFIGURE_FLAGS="${CONFIGURE_FLAGS} ac_cv_file__dev_ptc=no"
603+
CONFIGURE_FLAGS="${CONFIGURE_FLAGS} ac_cv_file__dev_ptmx=no"
604+
;;
595605
armv7-unknown-linux-gnueabihf)
596606
CONFIGURE_FLAGS="${CONFIGURE_FLAGS} ac_cv_buggy_getaddrinfo=no"
597607
CONFIGURE_FLAGS="${CONFIGURE_FLAGS} ac_cv_file__dev_ptc=no"

cpython-unix/build-libX11.sh

Lines changed: 13 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -45,19 +45,31 @@ fi
4545
# So we have to force a value.
4646
if [ "${BUILD_TRIPLE}" != "${TARGET_TRIPLE}" ]; then
4747
case "${TARGET_TRIPLE}" in
48-
i686-unknown-linux-gnu)
48+
aarch64-unknown-linux-gnu)
49+
EXTRA_FLAGS="${EXTRA_FLAGS} --enable-malloc0returnsnull"
50+
;;
51+
armv7-unknown-linux-gnueabi)
4952
EXTRA_FLAGS="${EXTRA_FLAGS} --enable-malloc0returnsnull"
5053
;;
5154
armv7-unknown-linux-gnueabihf)
5255
EXTRA_FLAGS="${EXTRA_FLAGS} --enable-malloc0returnsnull"
5356
;;
57+
i686-unknown-linux-gnu)
58+
EXTRA_FLAGS="${EXTRA_FLAGS} --enable-malloc0returnsnull"
59+
;;
5460
*)
5561
echo "cross-compiling but malloc(0) override not set; failures possible"
5662
;;
5763
esac
5864
fi
5965

6066
case "${TARGET_TRIPLE}" in
67+
aarch64-unknown-linux-gnu)
68+
CC_FOR_BUILD=gcc
69+
;;
70+
armv7-unknown-linux-gnueabi)
71+
CC_FOR_BUILD=gcc
72+
;;
6173
armv7-unknown-linux-gnueabihf)
6274
CC_FOR_BUILD=gcc
6375
;;

cpython-unix/build.cross.Dockerfile

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -46,5 +46,9 @@ RUN apt-get install \
4646

4747
# Cross-building.
4848
RUN apt-get install \
49+
gcc-aarch64-linux-gnu \
50+
gcc-arm-linux-gnueabi \
4951
gcc-arm-linux-gnueabihf \
52+
libc6-dev-arm64-cross \
53+
libc6-dev-armel-cross \
5054
libc6-dev-armhf-cross

cpython-unix/build.py

Lines changed: 9 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -94,6 +94,10 @@ def add_target_env(env, build_platform, target_triple, build_env):
9494
env["CC"] = "musl-clang"
9595
else:
9696
env["CC"] = "clang"
97+
elif target_triple == "aarch64-unknown-linux-gnu":
98+
env["CC"] = "aarch64-linux-gnu-gcc"
99+
elif target_triple == "armv7-unknown-linux-gnueabi":
100+
env["CC"] = "arm-linux-gnueabi-gcc"
97101
elif target_triple == "armv7-unknown-linux-gnueabihf":
98102
env["CC"] = "arm-linux-gnueabihf-gcc"
99103
else:
@@ -110,7 +114,11 @@ def add_target_env(env, build_platform, target_triple, build_env):
110114
if build_platform == "linux64":
111115
env["BUILD_TRIPLE"] = "x86_64-unknown-linux-gnu"
112116

113-
if target_triple == "armv7-unknown-linux-gnueabihf":
117+
if target_triple == "aarch64-unknown-linux-gnu":
118+
env["TARGET_TRIPLE"] = "aarch64-unknown-linux-gnu"
119+
elif target_triple == "armv7-unknown-linux-gnueabi":
120+
env["TARGET_TRIPLE"] = "armv7-unknown-linux-gnueabi"
121+
elif target_triple == "armv7-unknown-linux-gnueabihf":
114122
env["TARGET_TRIPLE"] = "armv7-unknown-linux-gnueabihf"
115123
elif target_triple in ("x86_64-unknown-linux-gnu", "x86_64-unknown-linux-musl"):
116124
env["TARGET_TRIPLE"] = "x86_64-unknown-linux-gnu"
Lines changed: 43 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,43 @@
1+
# Setup.dist doesn't have entries for all modules. This file defines
2+
# what's missing. The content here is reconstructed from logic in
3+
# setup.py and what was observed to execute in a normal build via setup.py.
4+
# We should audit this every time we upgrade CPython.
5+
6+
_bz2 _bz2module.c -lbz2
7+
_crypt _cryptmodule.c -lcrypt
8+
_ctypes _ctypes/_ctypes.c _ctypes/callbacks.c _ctypes/callproc.c _ctypes/stgdict.c _ctypes/cfield.c -I/tools/deps/include -L/tools/deps/lib -lffi -ldl
9+
_ctypes_test _ctypes/_ctypes_test.c -lm
10+
_curses _cursesmodule.c -DHAVE_NCURSESW=1 -I/tools/deps/include/ncursesw -L/tools/deps/lib -lncursesw
11+
_curses_panel _curses_panel.c -DHAVE_NCURSESW=1 -I/tools/deps/include/ncursesw -L/tools/deps/lib -lpanelw -lncursesw
12+
_dbm _dbmmodule.c -DHAVE_BERKDB_H -DDB_DBM_HSEARCH -I/tools/deps/include -L/tools/deps/lib -ldb
13+
_decimal _decimal/_decimal.c _decimal/libmpdec/basearith.c _decimal/libmpdec/constants.c _decimal/libmpdec/context.c _decimal/libmpdec/convolute.c _decimal/libmpdec/crt.c _decimal/libmpdec/difradix2.c _decimal/libmpdec/fnt.c _decimal/libmpdec/fourstep.c _decimal/libmpdec/io.c _decimal/libmpdec/mpalloc.c _decimal/libmpdec/mpdecimal.c _decimal/libmpdec/numbertheory.c _decimal/libmpdec/sixstep.c _decimal/libmpdec/transpose.c -DCONFIG_64=1 -DANSI=1 -DHAVE_UINT128_T=1 -IModules/_decimal/libmpdec
14+
_elementtree _elementtree.c -DHAVE_EXPAT_CONFIG_H=1 -DXML_POOR_ENTROPY=1 -DUSE_PYEXPAT_CAPI -IModules/expat
15+
_gdbm _gdbmmodule.c -DHAVE_NDBM_H -I/tools/deps/include -L/tools/deps/lib -lgdbm
16+
_hashlib _hashopenssl.c -I/tools/deps/include -L/tools/deps/lib -lssl -lcrypto
17+
_json _json.c
18+
_lsprof _lsprof.c rotatingtree.c
19+
_lzma _lzmamodule.c -I/tools/deps/include -L/tools/deps/lib -llzma
20+
# TODO check setup.py logic for semaphore.c and possibly fix missing
21+
# dependency.
22+
_multiprocessing _multiprocessing/multiprocessing.c _multiprocessing/semaphore.c
23+
_opcode _opcode.c
24+
_posixshmem _multiprocessing/posixshmem.c -IModules/_multiprocessing -lrt
25+
_queue _queuemodule.c
26+
_sqlite3 _sqlite/cache.c _sqlite/connection.c _sqlite/cursor.c _sqlite/microprotocols.c _sqlite/module.c _sqlite/prepare_protocol.c _sqlite/row.c _sqlite/statement.c _sqlite/util.c -I/tools/deps/include -IModules/_sqlite -DMODULE_NAME=\"sqlite3\" -DSQLITE_OMIT_LOAD_EXTENSION=1 -L/tools/deps/lib -lsqlite3
27+
_ssl _ssl.c -I/tools/deps/include -lssl -lcrypto
28+
_testbuffer _testbuffer.c
29+
_testimportmultiple _testimportmultiple.c
30+
_testinternalcapi _testinternalcapi.c -DPy_BUILD_CORE_MODULE
31+
_testmultiphase _testmultiphase.c
32+
_tkinter _tkinter.c tkappinit.c -DWITH_APPINIT -I/tools/deps/include/X11 -L/tools/deps/lib -ltcl8.6 -ltk8.6 -lX11 -lxcb -lXau
33+
_uuid _uuidmodule.c -I/tools/deps/include/uuid -luuid
34+
_xxsubinterpreters _xxsubinterpretersmodule.c
35+
_xxtestfuzz _xxtestfuzz/_xxtestfuzz.c _xxtestfuzz/fuzzer.c
36+
ossaudiodev ossaudiodev.c
37+
pyexpat pyexpat.c expat/xmlparse.c expat/xmlrole.c expat/xmltok.c -DHAVE_EXPAT_CONFIG_H=1 -DXML_POOR_ENTROPY=1 -DUSE_PYEXPAT_CAPI -IModules/expat
38+
# readline variant needs to come first because libreadline is in /tools/deps and is
39+
# picked up by build. We /could/ make libedit first. But since we employ a hack to
40+
# coerce use of libedit on Linux, it seems prudent for the build system to pick
41+
# up readline.
42+
readline VARIANT=readline readline.c -I/tools/deps/include -I/tools/deps/include/ncursesw -L/tools/deps/lib -lreadline -lncursesw
43+
readline VARIANT=libedit readline-libedit.c -DUSE_LIBEDIT=1 -I/tools/deps/libedit/include -I/tools/deps/libedit/include/ncursesw -L/tools/deps/libedit/lib -ledit -lncursesw
Lines changed: 43 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,43 @@
1+
# Setup.dist doesn't have entries for all modules. This file defines
2+
# what's missing. The content here is reconstructed from logic in
3+
# setup.py and what was observed to execute in a normal build via setup.py.
4+
# We should audit this every time we upgrade CPython.
5+
6+
_bz2 _bz2module.c -lbz2
7+
_crypt _cryptmodule.c -lcrypt
8+
_ctypes _ctypes/_ctypes.c _ctypes/callbacks.c _ctypes/callproc.c _ctypes/stgdict.c _ctypes/cfield.c -I/tools/deps/include -L/tools/deps/lib -lffi -ldl
9+
_ctypes_test _ctypes/_ctypes_test.c -lm
10+
_curses _cursesmodule.c -DHAVE_NCURSESW=1 -I/tools/deps/include/ncursesw -L/tools/deps/lib -lncursesw
11+
_curses_panel _curses_panel.c -DHAVE_NCURSESW=1 -I/tools/deps/include/ncursesw -L/tools/deps/lib -lpanelw -lncursesw
12+
_dbm _dbmmodule.c -DHAVE_BERKDB_H -DDB_DBM_HSEARCH -I/tools/deps/include -L/tools/deps/lib -ldb
13+
_decimal _decimal/_decimal.c _decimal/libmpdec/basearith.c _decimal/libmpdec/constants.c _decimal/libmpdec/context.c _decimal/libmpdec/convolute.c _decimal/libmpdec/crt.c _decimal/libmpdec/difradix2.c _decimal/libmpdec/fnt.c _decimal/libmpdec/fourstep.c _decimal/libmpdec/io.c _decimal/libmpdec/mpalloc.c _decimal/libmpdec/mpdecimal.c _decimal/libmpdec/numbertheory.c _decimal/libmpdec/sixstep.c _decimal/libmpdec/transpose.c -DCONFIG_32=1 -DANSI=1 -IModules/_decimal/libmpdec
14+
_elementtree _elementtree.c -DHAVE_EXPAT_CONFIG_H=1 -DXML_POOR_ENTROPY=1 -DUSE_PYEXPAT_CAPI -IModules/expat
15+
_gdbm _gdbmmodule.c -DHAVE_NDBM_H -I/tools/deps/include -L/tools/deps/lib -lgdbm
16+
_hashlib _hashopenssl.c -I/tools/deps/include -L/tools/deps/lib -lssl -lcrypto
17+
_json _json.c
18+
_lsprof _lsprof.c rotatingtree.c
19+
_lzma _lzmamodule.c -I/tools/deps/include -L/tools/deps/lib -llzma
20+
# TODO check setup.py logic for semaphore.c and possibly fix missing
21+
# dependency.
22+
_multiprocessing _multiprocessing/multiprocessing.c _multiprocessing/semaphore.c
23+
_opcode _opcode.c
24+
_posixshmem _multiprocessing/posixshmem.c -IModules/_multiprocessing -lrt
25+
_queue _queuemodule.c
26+
_sqlite3 _sqlite/cache.c _sqlite/connection.c _sqlite/cursor.c _sqlite/microprotocols.c _sqlite/module.c _sqlite/prepare_protocol.c _sqlite/row.c _sqlite/statement.c _sqlite/util.c -I/tools/deps/include -IModules/_sqlite -DMODULE_NAME=\"sqlite3\" -DSQLITE_OMIT_LOAD_EXTENSION=1 -L/tools/deps/lib -lsqlite3
27+
_ssl _ssl.c -I/tools/deps/include -lssl -lcrypto
28+
_testbuffer _testbuffer.c
29+
_testimportmultiple _testimportmultiple.c
30+
_testinternalcapi _testinternalcapi.c -DPy_BUILD_CORE_MODULE
31+
_testmultiphase _testmultiphase.c
32+
_tkinter _tkinter.c tkappinit.c -DWITH_APPINIT -I/tools/deps/include/X11 -L/tools/deps/lib -ltcl8.6 -ltk8.6 -lX11 -lxcb -lXau
33+
_uuid _uuidmodule.c -I/tools/deps/include/uuid -luuid
34+
_xxsubinterpreters _xxsubinterpretersmodule.c
35+
_xxtestfuzz _xxtestfuzz/_xxtestfuzz.c _xxtestfuzz/fuzzer.c
36+
ossaudiodev ossaudiodev.c
37+
pyexpat pyexpat.c expat/xmlparse.c expat/xmlrole.c expat/xmltok.c -DHAVE_EXPAT_CONFIG_H=1 -DXML_POOR_ENTROPY=1 -DUSE_PYEXPAT_CAPI -IModules/expat
38+
# readline variant needs to come first because libreadline is in /tools/deps and is
39+
# picked up by build. We /could/ make libedit first. But since we employ a hack to
40+
# coerce use of libedit on Linux, it seems prudent for the build system to pick
41+
# up readline.
42+
readline VARIANT=readline readline.c -I/tools/deps/include -I/tools/deps/include/ncursesw -L/tools/deps/lib -lreadline -lncursesw
43+
readline VARIANT=libedit readline-libedit.c -DUSE_LIBEDIT=1 -I/tools/deps/libedit/include -I/tools/deps/libedit/include/ncursesw -L/tools/deps/libedit/lib -ledit -lncursesw

cpython-unix/targets.yml

Lines changed: 52 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -46,6 +46,32 @@ aarch64-apple-ios:
4646
- zlib
4747
openssl_target: ios64-cross
4848

49+
aarch64-unknown-linux-gnu:
50+
host_platforms:
51+
- linux
52+
docker_image_suffix: .cross
53+
needs:
54+
- bdb
55+
- binutils
56+
- bzip2
57+
- gdbm
58+
- libedit
59+
- libffi
60+
- libX11
61+
- libXau
62+
- libxcb
63+
- ncurses
64+
- readline
65+
- sqlite
66+
- tcl
67+
- tk
68+
- tix
69+
- uuid
70+
- xorgproto
71+
- xz
72+
- zlib
73+
openssl_target: linux-aarch64
74+
4975
arm64-apple-tvos:
5076
host_platforms:
5177
- darwin
@@ -57,6 +83,32 @@ arm64-apple-tvos:
5783
- zlib
5884
openssl_target: todo
5985

86+
armv7-unknown-linux-gnueabi:
87+
host_platforms:
88+
- linux
89+
docker_image_suffix: .cross
90+
needs:
91+
- bdb
92+
- binutils
93+
- bzip2
94+
- gdbm
95+
- libedit
96+
- libffi
97+
- libX11
98+
- libXau
99+
- libxcb
100+
- ncurses
101+
- readline
102+
- sqlite
103+
- tcl
104+
- tk
105+
- tix
106+
- uuid
107+
- xorgproto
108+
- xz
109+
- zlib
110+
openssl_target: linux-armv4
111+
60112
armv7-unknown-linux-gnueabihf:
61113
host_platforms:
62114
- linux

src/main.rs

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -25,6 +25,8 @@ use {
2525
const RECOGNIZED_TRIPLES: &[&str] = &[
2626
"aarch64-apple-darwin",
2727
"aarch64-apple-ios",
28+
"aarch64-unknown-linux-gnu",
29+
"armv7-unknown-linux-gnueabi",
2830
"armv7-unknown-linux-gnueabihf",
2931
"arm64-apple-tvos",
3032
"i686-pc-windows-msvc",
@@ -117,6 +119,7 @@ lazy_static! {
117119

118120
static ref ELF_ALLOWED_LIBRARIES_BY_TRIPLE: HashMap<&'static str, Vec<&'static str>> = {
119121
[
122+
("armv7-unknown-linux-gnueabi", vec!["ld-linux.so.3", "libgcc_s.so.1"]),
120123
("armv7-unknown-linux-gnueabihf", vec!["ld-linux-armhf.so.3", "libgcc_s.so.1"]),
121124
].iter().cloned().collect()
122125
};
@@ -264,6 +267,8 @@ lazy_static! {
264267
[
265268
("aarch64-apple-darwin", "macosx-11.0-arm64"),
266269
("aarch64-apple-ios", "iOS-aarch64"),
270+
("aarch64-unknown-linux-gnu", "linux-aarch64"),
271+
("armv7-unknown-linux-gnueabi", "linux-arm"),
267272
("armv7-unknown-linux-gnueabihf", "linux-arm"),
268273
("i686-pc-windows-msvc", "win32"),
269274
("i686-unknown-linux-gnu", "linux-i686"),

0 commit comments

Comments
 (0)