Skip to content

Instantly share code, notes, and snippets.

@hucsmn
Last active April 11, 2020 05:02
Show Gist options
  • Save hucsmn/f742455b970b34a8189adca38c9b2207 to your computer and use it in GitHub Desktop.
Save hucsmn/f742455b970b34a8189adca38c9b2207 to your computer and use it in GitHub Desktop.
Generate a table of rustc cfg (require nightly toolchain)
#!/usr/bin/python3
import re
import argparse
from subprocess import Popen, PIPE
YES = "\u2714"
NO = "\u2716"
NA = "N/A"
rustc = ["rustup", "run", "nightly-x86_64-unknown-linux-gnu", "rustc"]
meta_defaults = ["target", "arch", "width", "os", "family", "env"]
meta_atomics = [("ptr", "aptr"), ("8", "a8"), ("16", "a16"), ("32", "a32"), ("64", "a64"), ("128", "a128")]
meta_features = ["sse", "sse2", "sse3", "sse4.1", "sse4.2", "ssse3", "fxsr", "rdrand", "rdseed", "popcnt", "crt-static"]
rx_arch = re.compile(b'^target_arch="([^"]+)"$')
rx_ptr = re.compile(b'^target_pointer_width="([^"]+)"$')
rx_os = re.compile(b'^target_os="([^"]+)"$')
rx_family = re.compile(b'^target_family="([^"]+)"$')
rx_env = re.compile(b'^target_env="([^"]+)"$')
rx_atomic = re.compile(b'^target_has_atomic="([^"]+)"$')
rx_feature = re.compile(b'^target_feature="([^"]+)"$')
def get_cfg(rx, line, fallback):
mat = rx.match(line)
if mat:
return mat.group(1).decode('utf-8')
else:
return fallback
# main program
args_parser = argparse.ArgumentParser()
args_parser.add_argument('-a', '--atomics', action='store_true', help='list atomic integer supports')
args_parser.add_argument('-f', '--features', action='store_true', help='list target features')
args = args_parser.parse_args()
table = [[i for i in meta_defaults]]
atomic_columns = None
feature_columns = None
if args.atomics:
atomic_columns = [len(table[0]) + i for i in range(len(meta_atomics))]
table[0] += [title for (_, title) in meta_atomics]
if args.features:
feature_columns = [len(table[0]) + i for i in range(len(meta_features))]
table[0] += meta_features
width = list(map(len, table[0]))
for target in Popen(rustc + ["--print", "target-list"], stdout=PIPE).stdout:
target = target.decode('utf-8').strip()
row = [target, NA, NA, NA, NA, NA]
if args.atomics:
row += [NO for _ in range(len(meta_atomics))]
if args.features:
row += [NO for _ in range(len(meta_features))]
for line in Popen(rustc + ["--print", "cfg", "--target", target], stdout=PIPE).stdout:
row[1] = get_cfg(rx_arch, line, row[1])
row[2] = get_cfg(rx_ptr, line, row[2])
row[3] = get_cfg(rx_os, line, row[3])
row[4] = get_cfg(rx_family, line, row[4])
row[5] = get_cfg(rx_env, line, row[5])
if args.atomics:
atomic = get_cfg(rx_atomic, line, '')
if atomic != '':
for (i, (name, _)) in enumerate(meta_atomics):
if atomic == name:
row[atomic_columns[i]] = YES
if args.features:
feature = get_cfg(rx_feature, line, '')
if feature != '':
for (i, name) in enumerate(meta_features):
if feature == name:
row[feature_columns[i]] = YES
table.append(row)
width = list(map(max, zip(width, map(len, row))))
print("| " + " | ".join([col.center(w) for (col, w) in zip(table[0], width)]) + " |")
print("|" + "|".join(['-' * (w + 2) for w in width]) + "|")
for row in table[1:]:
print("| " + " | ".join([col.ljust(w) for (col, w) in zip(row, width)]) + " |")

generated by python gen_table_rustc_cfg.py --atomics --features.

target arch width os family env aptr a8 a16 a32 a64 a128 sse sse2 sse3 sse4.1 sse4.2 ssse3 fxsr rdrand rdseed popcnt crt-static
aarch64-fuchsia aarch64 64 fuchsia unix N/A
aarch64-linux-android aarch64 64 android unix N/A
aarch64-pc-windows-msvc aarch64 64 windows windows msvc
aarch64-unknown-cloudabi aarch64 64 cloudabi N/A N/A
aarch64-unknown-freebsd aarch64 64 freebsd unix N/A
aarch64-unknown-hermit aarch64 64 hermit N/A N/A
aarch64-unknown-linux-gnu aarch64 64 linux unix gnu
aarch64-unknown-linux-musl aarch64 64 linux unix musl
aarch64-unknown-netbsd aarch64 64 netbsd unix N/A
aarch64-unknown-none aarch64 64 none N/A N/A
aarch64-unknown-none-softfloat aarch64 64 none N/A N/A
aarch64-unknown-openbsd aarch64 64 openbsd unix N/A
aarch64-unknown-redox aarch64 64 redox unix relibc
aarch64-uwp-windows-msvc aarch64 64 windows windows msvc
aarch64-wrs-vxworks aarch64 64 vxworks unix gnu
arm-linux-androideabi arm 32 android unix N/A
arm-unknown-linux-gnueabi arm 32 linux unix gnu
arm-unknown-linux-gnueabihf arm 32 linux unix gnu
arm-unknown-linux-musleabi arm 32 linux unix musl
arm-unknown-linux-musleabihf arm 32 linux unix musl
armebv7r-none-eabi arm 32 none N/A N/A
armebv7r-none-eabihf arm 32 none N/A N/A
armv4t-unknown-linux-gnueabi arm 32 linux unix gnu
armv5te-unknown-linux-gnueabi arm 32 linux unix gnu
armv5te-unknown-linux-musleabi arm 32 linux unix musl
armv6-unknown-freebsd arm 32 freebsd unix gnueabihf
armv6-unknown-netbsd-eabihf arm 32 netbsd unix eabihf
armv7-linux-androideabi arm 32 android unix N/A
armv7-unknown-cloudabi-eabihf arm 32 cloudabi N/A N/A
armv7-unknown-freebsd arm 32 freebsd unix gnueabihf
armv7-unknown-linux-gnueabi arm 32 linux unix gnu
armv7-unknown-linux-gnueabihf arm 32 linux unix gnu
armv7-unknown-linux-musleabi arm 32 linux unix musl
armv7-unknown-linux-musleabihf arm 32 linux unix musl
armv7-unknown-netbsd-eabihf arm 32 netbsd unix eabihf
armv7-wrs-vxworks-eabihf arm 32 vxworks unix gnu
armv7a-none-eabi arm 32 none N/A N/A
armv7a-none-eabihf arm 32 none N/A N/A
armv7r-none-eabi arm 32 none N/A N/A
armv7r-none-eabihf arm 32 none N/A N/A
asmjs-unknown-emscripten wasm32 32 emscripten unix N/A
hexagon-unknown-linux-musl hexagon 32 linux unix musl
i586-pc-windows-msvc x86 32 windows windows msvc
i586-unknown-linux-gnu x86 32 linux unix gnu
i586-unknown-linux-musl x86 32 linux unix musl
i686-apple-darwin x86 32 macos unix N/A
i686-linux-android x86 32 android unix N/A
i686-pc-windows-gnu x86 32 windows windows gnu
i686-pc-windows-msvc x86 32 windows windows msvc
i686-unknown-cloudabi x86 32 cloudabi N/A N/A
i686-unknown-freebsd x86 32 freebsd unix N/A
i686-unknown-haiku x86 32 haiku unix N/A
i686-unknown-linux-gnu x86 32 linux unix gnu
i686-unknown-linux-musl x86 32 linux unix musl
i686-unknown-netbsd x86 32 netbsd unix N/A
i686-unknown-openbsd x86 32 openbsd unix N/A
i686-unknown-uefi x86 32 uefi N/A N/A
i686-uwp-windows-gnu x86 32 windows windows gnu
i686-uwp-windows-msvc x86 32 windows windows msvc
i686-wrs-vxworks x86 32 vxworks unix gnu
mips-unknown-linux-gnu mips 32 linux unix gnu
mips-unknown-linux-musl mips 32 linux unix musl
mips-unknown-linux-uclibc mips 32 linux unix uclibc
mips64-unknown-linux-gnuabi64 mips64 64 linux unix gnu
mips64-unknown-linux-muslabi64 mips64 64 linux unix musl
mips64el-unknown-linux-gnuabi64 mips64 64 linux unix gnu
mips64el-unknown-linux-muslabi64 mips64 64 linux unix musl
mipsel-unknown-linux-gnu mips 32 linux unix gnu
mipsel-unknown-linux-musl mips 32 linux unix musl
mipsel-unknown-linux-uclibc mips 32 linux unix uclibc
mipsisa32r6-unknown-linux-gnu mips 32 linux unix gnu
mipsisa32r6el-unknown-linux-gnu mips 32 linux unix gnu
mipsisa64r6-unknown-linux-gnuabi64 mips64 64 linux unix gnu
mipsisa64r6el-unknown-linux-gnuabi64 mips64 64 linux unix gnu
msp430-none-elf msp430 16 none N/A N/A
nvptx64-nvidia-cuda nvptx64 64 cuda N/A N/A
powerpc-unknown-linux-gnu powerpc 32 linux unix gnu
powerpc-unknown-linux-gnuspe powerpc 32 linux unix gnu
powerpc-unknown-linux-musl powerpc 32 linux unix musl
powerpc-unknown-netbsd powerpc 32 netbsd unix N/A
powerpc-wrs-vxworks powerpc 32 vxworks unix gnu
powerpc-wrs-vxworks-spe powerpc 32 vxworks unix gnu
powerpc64-unknown-freebsd powerpc64 64 freebsd unix N/A
powerpc64-unknown-linux-gnu powerpc64 64 linux unix gnu
powerpc64-unknown-linux-musl powerpc64 64 linux unix musl
powerpc64-wrs-vxworks powerpc64 64 vxworks unix gnu
powerpc64le-unknown-linux-gnu powerpc64 64 linux unix gnu
powerpc64le-unknown-linux-musl powerpc64 64 linux unix musl
riscv32i-unknown-none-elf riscv32 32 none N/A N/A
riscv32imac-unknown-none-elf riscv32 32 none N/A N/A
riscv32imc-unknown-none-elf riscv32 32 none N/A N/A
riscv64gc-unknown-linux-gnu riscv64 64 linux unix gnu
riscv64gc-unknown-none-elf riscv64 64 none N/A N/A
riscv64imac-unknown-none-elf riscv64 64 none N/A N/A
s390x-unknown-linux-gnu s390x 64 linux unix gnu
sparc-unknown-linux-gnu sparc 32 linux unix gnu
sparc64-unknown-linux-gnu sparc64 64 linux unix gnu
sparc64-unknown-netbsd sparc64 64 netbsd unix N/A
sparc64-unknown-openbsd sparc64 64 openbsd unix N/A
sparcv9-sun-solaris sparc64 64 solaris unix N/A
thumbv6m-none-eabi arm 32 none N/A N/A
thumbv7a-pc-windows-msvc arm 32 windows windows msvc
thumbv7em-none-eabi arm 32 none N/A N/A
thumbv7em-none-eabihf arm 32 none N/A N/A
thumbv7m-none-eabi arm 32 none N/A N/A
thumbv7neon-linux-androideabi arm 32 android unix N/A
thumbv7neon-unknown-linux-gnueabihf arm 32 linux unix gnu
thumbv7neon-unknown-linux-musleabihf arm 32 linux unix musl
thumbv8m.base-none-eabi arm 32 none N/A N/A
thumbv8m.main-none-eabi arm 32 none N/A N/A
thumbv8m.main-none-eabihf arm 32 none N/A N/A
wasm32-unknown-emscripten wasm32 32 emscripten unix N/A
wasm32-unknown-unknown wasm32 32 unknown N/A N/A
wasm32-wasi wasm32 32 wasi N/A N/A
x86_64-apple-darwin x86_64 64 macos unix N/A
x86_64-fortanix-unknown-sgx x86_64 64 unknown N/A sgx
x86_64-fuchsia x86_64 64 fuchsia unix N/A
x86_64-linux-android x86_64 64 android unix N/A
x86_64-linux-kernel x86_64 64 none unix gnu
x86_64-pc-solaris x86_64 64 solaris unix N/A
x86_64-pc-windows-gnu x86_64 64 windows windows gnu
x86_64-pc-windows-msvc x86_64 64 windows windows msvc
x86_64-rumprun-netbsd x86_64 64 netbsd unix N/A
x86_64-sun-solaris x86_64 64 solaris unix N/A
x86_64-unknown-cloudabi x86_64 64 cloudabi N/A N/A
x86_64-unknown-dragonfly x86_64 64 dragonfly unix N/A
x86_64-unknown-freebsd x86_64 64 freebsd unix N/A
x86_64-unknown-haiku x86_64 64 haiku unix N/A
x86_64-unknown-hermit x86_64 64 hermit N/A N/A
x86_64-unknown-hermit-kernel x86_64 64 hermit N/A N/A
x86_64-unknown-l4re-uclibc x86_64 64 l4re unix uclibc
x86_64-unknown-linux-gnu x86_64 64 linux unix gnu
x86_64-unknown-linux-gnux32 x86_64 32 linux unix gnu
x86_64-unknown-linux-musl x86_64 64 linux unix musl
x86_64-unknown-netbsd x86_64 64 netbsd unix N/A
x86_64-unknown-openbsd x86_64 64 openbsd unix N/A
x86_64-unknown-redox x86_64 64 redox unix relibc
x86_64-unknown-uefi x86_64 64 uefi N/A N/A
x86_64-uwp-windows-gnu x86_64 64 windows windows gnu
x86_64-uwp-windows-msvc x86_64 64 windows windows msvc
x86_64-wrs-vxworks x86_64 64 vxworks unix gnu
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment