Files

333 lines
9.4 KiB
Python

import enum
from dataclasses import dataclass
from typing import Dict, List, Union
ASMDIFF_FLAG_PREFIX = "-DIFF"
class Language(enum.Enum):
C = "C"
OLD_CXX = "C++"
CXX = "C++"
PASCAL = "Pascal"
ASSEMBLY = "Assembly"
OBJECTIVE_C = "ObjectiveC"
def get_file_extension(self) -> str:
return {
Language.C: "c",
Language.CXX: "cpp",
Language.OLD_CXX: "c++",
Language.PASCAL: "p",
Language.ASSEMBLY: "s",
Language.OBJECTIVE_C: "m",
}[self]
@dataclass(frozen=True)
class Checkbox:
id: str
flag: str
def to_json(self) -> Dict[str, str]:
return {
"type": "checkbox",
"id": self.id,
"flag": self.flag,
}
@dataclass(frozen=True)
class FlagSet:
id: str
flags: List[str]
def to_json(self) -> Dict[str, Union[str, List[str]]]:
return {
"type": "flagset",
"id": self.id,
"flags": self.flags,
}
@dataclass(frozen=True)
class LanguageFlagSet:
id: str
flags: Dict[str, Language]
def to_json(self) -> Dict[str, Union[str, List[str]]]:
# To the client, we're a regular FlagSet - the extra metadata we carry
# is purely for the backend to determine the scratch's language
return {
"type": "flagset",
"id": self.id,
"flags": list(self.flags.keys()),
}
Flags = List[Union[Checkbox, FlagSet, LanguageFlagSet]]
COMMON_ARMCC_FLAGS: Flags = [
FlagSet(
id="armcc_opt_level", flags=["-O0", "-O1", "-O2", "-O3", "-Ospace", "-Otime"]
),
LanguageFlagSet(
id="armcc_language",
flags={"--c90": Language.C, "--c99": Language.C, "--cpp": Language.CXX},
),
FlagSet(id="armcc_instset", flags=["--arm", "--thumb"]),
Checkbox(id="armcc_debug", flag="--debug"),
]
COMMON_CLANG_FLAGS: Flags = [
FlagSet(
id="clang_opt_level", flags=["-O0", "-O1", "-O2", "-O3", "-Ofast", "-Os", "-Oz"]
),
FlagSet(id="clang_debug_level", flags=["-g0", "-g1", "-g2", "-g3"]),
LanguageFlagSet(
id="clang_language", flags={"-x c++": Language.CXX, "-x c": Language.C}
),
FlagSet(
id="clang_language_standard",
flags=[
"-std=c++98",
"-std=c++03",
"-std=gnu++98",
"-std=c++0x",
"-std=c++11",
"-std=gnu++0x",
"-std=gnu++11",
"-std=c++1y",
"-std=c++14",
"-std=gnu++1y",
"-std=gnu++14",
"-std=c++1z",
"-std=gnu++1z",
],
),
Checkbox(id="clang_no_rtti", flag="-fno-rtti"),
Checkbox(id="clang_no_exceptions", flag="-fno-exceptions"),
]
COMMON_SHC_FLAGS: Flags = [
FlagSet(id="shc_opt_level", flags=["-optimize=0", "-optimize=1"]),
FlagSet(id="shc_opt_type", flags=["-speed", "-size"]),
FlagSet(id="shc_round", flags=["-round=zero", "-round=nearest"]),
Checkbox(id="shc_debug", flag="-debug"),
Checkbox(id="shc_loop", flag="-loop"),
Checkbox(id="shc_inline", flag="-inline"),
]
COMMON_GCC_FLAGS: Flags = [
FlagSet(id="gcc_opt_level", flags=["-O0", "-O1", "-O2", "-O3"]),
FlagSet(
id="gcc_debug_level", flags=["-gdwarf-2", "-gdwarf", "-g0", "-g1", "-g2", "-g3"]
),
FlagSet(id="gcc_char_type", flags=["-fsigned-char", "-funsigned-char"]),
Checkbox("gcc_force_addr", "-fforce-addr"),
]
COMMON_IDO_FLAGS: Flags = [
FlagSet(id="ido_opt_level", flags=["-O0", "-O1", "-O2", "-O3"]),
FlagSet(id="ido_debug_level", flags=["-g0", "-g1", "-g2", "-g3"]),
FlagSet(id="mips_version", flags=["-mips1", "-mips2", "-mips3"]),
Checkbox("kpic", "-KPIC"),
Checkbox("pass", "-v"),
]
COMMON_DIFF_FLAGS: Flags = [
FlagSet(
id="diff_algorithm",
flags=[ASMDIFF_FLAG_PREFIX + "levenshtein", ASMDIFF_FLAG_PREFIX + "difflib"],
),
Checkbox("diff_function_symbols", ASMDIFF_FLAG_PREFIX + "diff_function_symbols"),
]
COMMON_MIPS_DIFF_FLAGS: Flags = [
FlagSet(
id="mips_mreg_names",
flags=[
"",
"-Mreg-names=32",
"-Mreg-names=n32",
"-Mreg-names=64",
"-Mreg-names=numeric",
],
),
Checkbox("mno_aliases", "-Mno-aliases"),
Checkbox("no_show_rodata_refs", ASMDIFF_FLAG_PREFIX + "no_show_rodata_refs"),
]
COMMON_MWCC_FLAGS: Flags = [
FlagSet(
id="mwcc_opt_level",
flags=[
"-O0",
"-O0,p",
"-O0,s",
"-O1",
"-O1,p",
"-O1,s",
"-O2",
"-O2,p",
"-O2,s",
"-O3",
"-O3,p",
"-O3,s",
"-O4",
"-O4,p",
"-O4,s",
],
),
FlagSet(
id="mwcc_inline_options",
flags=[
"-inline on",
"-inline off",
"-inline auto",
"-inline noauto",
"-inline all",
"-inline deferred",
"-inline bottomup",
"-inline nobottomup",
],
),
FlagSet(
id="mwcc_string_constant_options",
flags=["-str reuse", "-str pool", "-str readonly", "-str reuse,pool,readonly"],
),
LanguageFlagSet(
id="mwcc_source_language",
flags={
"-lang=c": Language.C,
"-lang=c++": Language.CXX,
"-lang=c99": Language.C,
"-lang=ec++": Language.CXX,
"-lang=objc": Language.OBJECTIVE_C,
},
),
FlagSet(id="mwcc_char_signedness", flags=["-char signed", "-char unsigned"]),
Checkbox(id="mwcc_cpp_exceptions_off", flag="-Cpp_exceptions off"),
FlagSet(id="mwcc_enum_size", flags=["-enum int", "-enum min"]),
Checkbox(id="mwcc_rtti_off", flag="-RTTI off"),
Checkbox(id="mwcc_line_numbers_on", flag="-sym on"),
]
COMMON_MWCC_NDS_ARM9_FLAGS = COMMON_MWCC_FLAGS + [
FlagSet(
id="mwcc_floating_point",
flags=[
"-fp soft",
"-fp vfpv1",
"-fp vfpv2",
],
),
Checkbox(id="mwcc_rostr", flag="-rostr"),
Checkbox(id="mwcc_enc_sjis", flag="-enc SJIS"),
]
COMMON_MWCC_PS2_FLAGS = COMMON_MWCC_FLAGS + [
FlagSet(id="mwcc_floating_point", flags=["-fp off", "-fp single"]),
]
COMMON_MWCC_PSP_FLAGS = COMMON_MWCC_FLAGS + [
FlagSet(id="mwcc_floating_point", flags=["-fp off", "-fp single"]),
]
COMMON_MWCC_WII_GC_FLAGS = COMMON_MWCC_FLAGS + [
FlagSet(
id="mwcc_floating_point",
flags=[
"-fp off",
"-fp soft",
"-fp hard",
"-fp fmadd",
"-fp efpu",
"-fp dpfp",
],
),
Checkbox(id="mwcc_rostr", flag="-rostr"),
Checkbox(id="mwcc_enc_sjis", flag="-enc SJIS"),
Checkbox(id="mwcc_fp_contract_on", flag="-fp_contract on"),
Checkbox(id="mwcc_use_lmw_stmw_on", flag="-use_lmw_stmw on"),
]
COMMON_GCC_PS1_FLAGS: Flags = [
FlagSet(id="psyq_opt_level", flags=["-O0", "-O1", "-O2", "-O3", "-Os"]),
FlagSet(id="gcc_debug_level", flags=["-g0", "-g1", "-g2", "-g3"]),
FlagSet(id="gcc_char_type", flags=["-fsigned-char", "-funsigned-char"]),
FlagSet(id="sdata_limit", flags=["-G0", "-G4", "-G8"]),
FlagSet(id="endianness", flags=["-mel", "-meb"]),
]
COMMON_GCC_PS2_FLAGS: Flags = COMMON_GCC_FLAGS + [
LanguageFlagSet(
id="gcc_source_language",
flags={
"-x c": Language.C,
"-x c++": Language.CXX,
},
),
]
COMMON_GCC_SATURN_FLAGS: Flags = [
FlagSet(id="gcc_opt_level", flags=["-O0", "-O1", "-O2", "-O3"]),
FlagSet(id="gcc_arch", flags=["-m2"]),
]
COMMON_MSVC_FLAGS: Flags = [
FlagSet(
id="msvc_opt_level", flags=["/Od", "/O1", "/O2", "/Os", "/Ot", "/Og", "/Ox"]
),
FlagSet(id="msvc_codegen", flags=["/GB", "/G3", "/G4", "/G5", "/G6"]),
FlagSet(id="msvc_fp", flags=["/fp:precise", "/fp:strict", "/fp:fast"]),
FlagSet(id="msvc_rtlib", flags=["/ML", "/MT", "/MD", "/MLd", "/MTd", "/MDd"]),
FlagSet(id="msvc_inline", flags=["/Ob0", "/Ob1", "/Ob2"]),
FlagSet(id="msvc_alignment", flags=["/Zp1", "/Zp2", "/Zp4", "/Zp8", "/Zp16"]),
FlagSet(id="msvc_callconv", flags=["/Gd", "/Gr", "/Gz"]),
Checkbox("msvc_compile_cpp", "/TP"),
Checkbox("msvc_use_rtti", "/GR"),
Checkbox("msvc_use_ehsc", "/GX"),
Checkbox("msvc_disable_stack_checking", "/Gs"),
Checkbox("msvc_disable_buffer_security_checks", "/GS-"),
Checkbox("msvc_runtime_debug_checks", "/GZ"),
]
COMMON_WATCOM_FLAGS: Flags = [
FlagSet(
id="watcom_codegen",
flags=[
"-0",
"-1",
"-2",
"-3r",
"-3s",
"-4r",
"-4s",
"-5r",
"-5s",
"-6r",
"-6s",
],
),
FlagSet(id="watcom_packing", flags=["-zp1", "-zp2", "-zp4", "-zp8"]),
FlagSet(id="watcom_platform", flags=["-bt=nt", "-bt=dos"]),
Checkbox("watcom_disable_opt", "-od"),
Checkbox("watcom_favour_space", "-os"),
Checkbox("watcom_favour_perf", "-ot"),
Checkbox("watcom_stack_frames", "-of+"),
Checkbox("watcom_instr_sched", "-or"),
Checkbox("watcom_inline_lib", "-oi"),
Checkbox("watcom_inline_fpu", "-om"),
Checkbox("watcom_loop_opt", "-ol"),
Checkbox("watcom_fpu_recip", "-on"),
Checkbox("watcom_fpu_result", "-op"),
Checkbox("watcom_nostackchk", "-s"),
Checkbox("watcom_signedchar", "-j"),
Checkbox("watcom_fpu", "-fpi87"),
]
COMMON_MSDOS_DIFF_FLAGS: Flags = [Checkbox("diff_reloc", "--reloc")]
COMMON_BORLAND_FLAGS: Flags = []