// Copyright 2017 Google Inc. All rights reserved.
//
// Licensed under the Apache License, Version 2.0 (the "License");
// you may not use this file except in compliance with the License.
// You may obtain a copy of the License at
//
//     http://www.apache.org/licenses/LICENSE-2.0
//
// Unless required by applicable law or agreed to in writing, software
// distributed under the License is distributed on an "AS IS" BASIS,
// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
// See the License for the specific language governing permissions and
// limitations under the License.

subdirs = [
    "Lib",
]

cc_defaults {
    name: "py2-interp-defaults",
    cflags: [
        "-fwrapv",
        "-O3",
        "-Wall",
        "-Wstrict-prototypes",
        "-DPy_BUILD_CORE",
        "-Werror",
        "-Wno-error=invalid-source-encoding",
        "-Wno-error=macro-redefined",
        "-Wno-int-conversion",
        "-Wno-missing-field-initializers",
        "-Wno-shift-count-overflow",
        "-Wno-sign-compare",
        "-Wno-tautological-compare",
        "-Wno-tautological-constant-out-of-range-compare",
        "-Wno-unused-parameter",
        "-Wno-unused-result",
    ],
    local_include_dirs: ["Include"],
    target: {
        android_arm: {
            local_include_dirs: ["android_arm/pyconfig"],
        },
        android_arm64: {
            local_include_dirs: ["android_arm64/pyconfig"],
        },
        android_x86: {
            local_include_dirs: ["android_x86/pyconfig"],
        },
        android_x86_64: {
            local_include_dirs: ["android_x86_64/pyconfig"],
        },
        // Regenerate include dirs with android_regen.sh
        darwin_x86: {
            enabled: false,
        },
        darwin_x86_64: {
            local_include_dirs: ["darwin_x86_64/pyconfig"],
            cflags: [
                "-Wno-deprecated-declarations",
                "-Wno-pointer-arith",
            ],
        },
        linux_glibc_x86: {
            enabled: false,
        },
        linux_glibc_x86_64: {
            local_include_dirs: ["linux_x86_64/pyconfig"],
            cflags: ["-Werror"],
        },
        windows: {
            enabled: false,
        },
    },
    host_supported: true,
    compile_multilib: "both",
    multilib: {
        lib32: {
            suffix: "32",
        },
        lib64: {
            suffix: "64",
        },
    },
}

cc_library_static {
    name: "py2-interp-parser",
    defaults: ["py2-interp-defaults"],
    srcs: [
        "Parser/acceler.c",
        "Parser/bitset.c",
        "Parser/firstsets.c",
        "Parser/grammar.c",
        "Parser/grammar1.c",
        "Parser/listnode.c",
        "Parser/metagrammar.c",
        "Parser/myreadline.c",
        "Parser/node.c",
        "Parser/parser.c",
        "Parser/parsetok.c",
        "Parser/pgen.c",
        "Parser/tokenizer.c",
    ],
}

cc_library_static {
    name: "py2-interp-object",
    defaults: ["py2-interp-defaults"],
    srcs: [
        "Objects/abstract.c",
        "Objects/boolobject.c",
        "Objects/bufferobject.c",
        "Objects/bytes_methods.c",
        "Objects/bytearrayobject.c",
        "Objects/capsule.c",
        "Objects/cellobject.c",
        "Objects/classobject.c",
        "Objects/cobject.c",
        "Objects/codeobject.c",
        "Objects/complexobject.c",
        "Objects/descrobject.c",
        "Objects/enumobject.c",
        "Objects/exceptions.c",
        "Objects/genobject.c",
        "Objects/fileobject.c",
        "Objects/floatobject.c",
        "Objects/frameobject.c",
        "Objects/funcobject.c",
        "Objects/intobject.c",
        "Objects/iterobject.c",
        "Objects/listobject.c",
        "Objects/longobject.c",
        "Objects/dictobject.c",
        "Objects/memoryobject.c",
        "Objects/methodobject.c",
        "Objects/moduleobject.c",
        "Objects/object.c",
        "Objects/obmalloc.c",
        "Objects/rangeobject.c",
        "Objects/setobject.c",
        "Objects/sliceobject.c",
        "Objects/stringobject.c",
        "Objects/structseq.c",
        "Objects/tupleobject.c",
        "Objects/typeobject.c",
        "Objects/weakrefobject.c",
        "Objects/unicodeobject.c",
        "Objects/unicodectype.c",
    ],
}

cc_library_static {
    name: "py2-interp-python",
    defaults: ["py2-interp-defaults"],
    target: {
        linux: {
            cflags: [
                "-DPLATFORM=\"linux2\"",
            ],
        },
        darwin_x86_64: {
            cflags: [
                "-DPLATFORM=\"darwin\"",
            ],
        },
    },
    srcs: [
        "Python/_warnings.c",
        "Python/Python-ast.c",
        "Python/asdl.c",
        "Python/ast.c",
        "Python/bltinmodule.c",
        "Python/ceval.c",
        "Python/compile.c",
        "Python/codecs.c",
        "Python/errors.c",
        "Python/frozen.c",
        "Python/frozenmain.c",
        "Python/future.c",
        "Python/getargs.c",
        "Python/getcompiler.c",
        "Python/getcopyright.c",
        "Python/getplatform.c",
        "Python/getversion.c",
        "Python/graminit.c",
        "Python/import.c",
        "Python/importdl.c",
        "Python/marshal.c",
        "Python/modsupport.c",
        "Python/mystrtoul.c",
        "Python/mysnprintf.c",
        "Python/peephole.c",
        "Python/pyarena.c",
        "Python/pyctype.c",
        "Python/pyfpe.c",
        "Python/pymath.c",
        "Python/pystate.c",
        "Python/pythonrun.c",
        "Python/random.c",
        "Python/structmember.c",
        "Python/symtable.c",
        "Python/sysmodule.c",
        "Python/traceback.c",
        "Python/getopt.c",
        "Python/pystrcmp.c",
        "Python/pystrtod.c",
        "Python/dtoa.c",
        "Python/formatter_unicode.c",
        "Python/formatter_string.c",
        "Python/dynload_shlib.c",
        "Python/thread.c",
    ],
}

cc_binary {
    name: "py2-launcher",
    defaults: ["py2-interp-defaults"],
    cflags: [
        "-DVERSION=\"2.7\"",
        "-DVPATH=\"\"",
        "-DPREFIX=\"\"",
        "-DEXEC_PREFIX=\"\"",
        "-DPYTHONPATH=\"\"",
        "-DDATE=\"xx/xx/xx\"",
        "-DTIME=\"xx:xx:xx\"",
    ],
    srcs: [
        "Launcher/launcher_main.cpp",
        "Launcher/launcher_internal.cpp",
        "Modules/gcmodule.c",
        "Modules/getpath.c",
        "Modules/config.c",
        "Modules/getbuildinfo.c",
        // Default built-in extension py2-c-modules.
        "Modules/threadmodule.c",
        "Modules/signalmodule.c",
        "Modules/posixmodule.c",
        "Modules/errnomodule.c",
        "Modules/pwdmodule.c",
        "Modules/_sre.c",
        "Modules/_codecsmodule.c",
        "Modules/_weakref.c",
        "Modules/zipimport.c",
        "Modules/symtablemodule.c",
    ],
    local_include_dirs: [
        "Launcher",
    ],
    // NOTE: Please update Modules/config.c if new lib get added in the static_libs.
    static_libs: [
        "libbase",
        // Be careful the order of these three static libraries below due to
        // missing symbols issues.
        "py2-interp-object",
        "py2-interp-python",
        "py2-interp-parser",
        "py2-c-module-array",
        "py2-c-module-cmath",
        "py2-c-module-math",
        "py2-c-module-_struct",
        "py2-c-module-time",
        "py2-c-module-operator",
        "py2-c-module-_testcapi",
        "py2-c-module-_random",
        "py2-c-module-_collections",
        "py2-c-module-_heapq",
        "py2-c-module-itertools",
        "py2-c-module-strop",
        "py2-c-module-_functools",
        "py2-c-module-datetime",
        "py2-c-module-_bisect",
        "py2-c-module-unicodedata",
        "py2-c-module-_io",
        "py2-c-module-fcntl",
        "py2-c-module-select",
        "py2-c-module-mmap",
        "py2-c-module-_csv",
        "py2-c-module-_socket",
        "py2-c-module-termios",
        "py2-c-module-_md5",
        "py2-c-module-_sha",
        "py2-c-module-_sha256",
        "py2-c-module-_sha512",
        "py2-c-module-binascii",
        "py2-c-module-parser",
        "py2-c-module-cStringIO",
        "py2-c-module-cPickle",
        "py2-c-module-xxsubtype",
        "py2-c-module-future_builtins",
        "py2-c-module-_json",
        "py2-c-module-_hotshot",
        "py2-c-module-_lsprof",
        "py2-c-module-grp",
        "py2-c-module-syslog",
        "py2-c-module-audioop",
        "py2-c-module-resource",
        "py2-c-module-_multibytecodec",
        "py2-c-module-_codecs_kr",
        "py2-c-module-_codecs_jp",
        "py2-c-module-_codecs_cn",
        "py2-c-module-_codecs_tw",
        "py2-c-module-_codecs_hk",
        "py2-c-module-_codecs_iso2022",
        "py2-c-module-_multiprocessing",
        "py2-c-module-zlib",
        "py2-c-module-pyexpat",
        "py2-c-module-_sqlite3",
        "py2-c-module-_ctypes_test",
        "py2-c-module-_ctypes",
        "libz",
        "libexpat",
    ],
    target: {
        linux_glibc_x86_64: {
            host_ldlibs: ["-lutil"],
            static_libs: [
                "libsqlite",
            ],
        },
        darwin_x86_64: {
            static_libs: [
                "libsqlite",
            ],
        },
        // Use shared libsqlite for device side, otherwise
        // the executable size will be really huge.
        android: {
            shared_libs: [
                "libsqlite",
            ],
        },
    },
}

// Enabled extension py2-c-modules.

cc_library_static {
    name: "py2-c-module-array",
    defaults: ["py2-interp-defaults"],
    srcs: [
        "Modules/arraymodule.c",
    ],
}

cc_library_static {
    name: "py2-c-module-cmath",
    defaults: ["py2-interp-defaults"],
    srcs: [
        "Modules/cmathmodule.c",
        "Modules/_math.c",
    ],
}

cc_library_static {
    name: "py2-c-module-math",
    defaults: ["py2-interp-defaults"],
    srcs: [
        "Modules/mathmodule.c",
        "Modules/_math.c",
    ],
}

cc_library_static {
    name: "py2-c-module-_struct",
    defaults: ["py2-interp-defaults"],
    srcs: [
        "Modules/_struct.c",
    ],
}

cc_library_static {
    name: "py2-c-module-time",
    defaults: ["py2-interp-defaults"],
    srcs: [
        "Modules/timemodule.c",
    ],
}

cc_library_static {
    name: "py2-c-module-operator",
    defaults: ["py2-interp-defaults"],
    srcs: [
        "Modules/operator.c",
    ],
}

cc_library_static {
    name: "py2-c-module-_testcapi",
    defaults: ["py2-interp-defaults"],
    srcs: [
        "Modules/_testcapimodule.c",
    ],
}

cc_library_static {
    name: "py2-c-module-_random",
    defaults: ["py2-interp-defaults"],
    srcs: [
        "Modules/_randommodule.c",
    ],
}

cc_library_static {
    name: "py2-c-module-_collections",
    defaults: ["py2-interp-defaults"],
    srcs: [
        "Modules/_collectionsmodule.c",
    ],
}

cc_library_static {
    name: "py2-c-module-_heapq",
    defaults: ["py2-interp-defaults"],
    srcs: [
        "Modules/_heapqmodule.c",
    ],
}

cc_library_static {
    name: "py2-c-module-itertools",
    defaults: ["py2-interp-defaults"],
    srcs: [
        "Modules/itertoolsmodule.c",
    ],
}

cc_library_static {
    name: "py2-c-module-strop",
    defaults: ["py2-interp-defaults"],
    srcs: [
        "Modules/stropmodule.c",
    ],
}

cc_library_static {
    name: "py2-c-module-_functools",
    defaults: ["py2-interp-defaults"],
    srcs: [
        "Modules/_functoolsmodule.c",
    ],
}

cc_library_static {
    name: "py2-c-module-datetime",
    defaults: ["py2-interp-defaults"],
    srcs: [
        "Modules/datetimemodule.c",
    ],
}

cc_library_static {
    name: "py2-c-module-_bisect",
    defaults: ["py2-interp-defaults"],
    srcs: [
        "Modules/_bisectmodule.c",
    ],
}

cc_library_static {
    name: "py2-c-module-unicodedata",
    defaults: ["py2-interp-defaults"],
    srcs: [
        "Modules/unicodedata.c",
    ],
}

cc_library_static {
    name: "py2-c-module-_io",
    defaults: ["py2-interp-defaults"],
    srcs: [
        "Modules/_io/bufferedio.c",
        "Modules/_io/bytesio.c",
        "Modules/_io/fileio.c",
        "Modules/_io/iobase.c",
        "Modules/_io/_iomodule.c",
        "Modules/_io/stringio.c",
        "Modules/_io/textio.c",
    ],
    local_include_dirs: [
        "Modules/_io",
    ],
}

cc_library_static {
    name: "py2-c-module-fcntl",
    defaults: ["py2-interp-defaults"],
    srcs: [
        "Modules/fcntlmodule.c",
    ],
}

cc_library_static {
    name: "py2-c-module-select",
    defaults: ["py2-interp-defaults"],
    srcs: [
        "Modules/selectmodule.c",
    ],
}

cc_library_static {
    name: "py2-c-module-mmap",
    defaults: ["py2-interp-defaults"],
    srcs: [
        "Modules/mmapmodule.c",
    ],
}

cc_library_static {
    name: "py2-c-module-_csv",
    defaults: ["py2-interp-defaults"],
    srcs: [
        "Modules/_csv.c",
    ],
}

cc_library_static {
    name: "py2-c-module-_socket",
    defaults: ["py2-interp-defaults"],
    srcs: [
        "Modules/socketmodule.c",
        "Modules/timemodule.c",
    ],
}

cc_library_static {
    name: "py2-c-module-termios",
    defaults: ["py2-interp-defaults"],
    srcs: [
        "Modules/termios.c",
    ],
}

cc_library_static {
    name: "py2-c-module-_md5",
    defaults: ["py2-interp-defaults"],
    srcs: [
        "Modules/md5module.c",
        "Modules/md5.c",
    ],
}

cc_library_static {
    name: "py2-c-module-_sha",
    defaults: ["py2-interp-defaults"],
    srcs: [
        "Modules/shamodule.c",
    ],
}

cc_library_static {
    name: "py2-c-module-_sha256",
    defaults: ["py2-interp-defaults"],
    srcs: [
        "Modules/sha256module.c",
    ],
}

cc_library_static {
    name: "py2-c-module-_sha512",
    defaults: ["py2-interp-defaults"],
    srcs: [
        "Modules/sha512module.c",
    ],
}

cc_library_static {
    name: "py2-c-module-binascii",
    defaults: ["py2-interp-defaults"],
    srcs: [
        "Modules/binascii.c",
    ],
}

cc_library_static {
    name: "py2-c-module-parser",
    defaults: ["py2-interp-defaults"],
    srcs: [
        "Modules/parsermodule.c",
    ],
}

cc_library_static {
    name: "py2-c-module-cStringIO",
    defaults: ["py2-interp-defaults"],
    srcs: [
        "Modules/cStringIO.c",
    ],
}

cc_library_static {
    name: "py2-c-module-cPickle",
    defaults: ["py2-interp-defaults"],
    srcs: [
        "Modules/cPickle.c",
    ],
}

cc_library_static {
    name: "py2-c-module-xxsubtype",
    defaults: ["py2-interp-defaults"],
    srcs: [
        "Modules/xxsubtype.c",
    ],
}

cc_library_static {
    name: "py2-c-module-future_builtins",
    defaults: ["py2-interp-defaults"],
    srcs: [
        "Modules/future_builtins.c",
    ],
}

cc_library_static {
    name: "py2-c-module-_json",
    defaults: ["py2-interp-defaults"],
    srcs: [
        "Modules/_json.c",
    ],
}

cc_library_static {
    name: "py2-c-module-_hotshot",
    defaults: ["py2-interp-defaults"],
    srcs: [
        "Modules/_hotshot.c",
    ],
}

cc_library_static {
    name: "py2-c-module-_lsprof",
    defaults: ["py2-interp-defaults"],
    srcs: [
        "Modules/_lsprof.c",
        "Modules/rotatingtree.c",
    ],
}

cc_library_static {
    name: "py2-c-module-grp",
    defaults: ["py2-interp-defaults"],
    srcs: [
        "Modules/grpmodule.c",
        "Modules/rotatingtree.c",
    ],
}

cc_library_static {
    name: "py2-c-module-syslog",
    defaults: ["py2-interp-defaults"],
    srcs: [
        "Modules/syslogmodule.c",
    ],
}

cc_library_static {
    name: "py2-c-module-audioop",
    defaults: ["py2-interp-defaults"],
    srcs: [
        "Modules/audioop.c",
    ],
}

cc_library_static {
    name: "py2-c-module-resource",
    defaults: ["py2-interp-defaults"],
    srcs: [
        "Modules/resource.c",
    ],
}

cc_library_static {
    name: "py2-c-module-_multibytecodec",
    defaults: ["py2-interp-defaults"],
    srcs: [
        "Modules/cjkcodecs/multibytecodec.c",
    ],
}

cc_library_static {
    name: "py2-c-module-_codecs_kr",
    defaults: ["py2-interp-defaults"],
    srcs: ["Modules/cjkcodecs/_codecs_kr.c"],
}

cc_library_static {
    name: "py2-c-module-_codecs_jp",
    defaults: ["py2-interp-defaults"],
    srcs: ["Modules/cjkcodecs/_codecs_jp.c"],
}

cc_library_static {
    name: "py2-c-module-_codecs_cn",
    defaults: ["py2-interp-defaults"],
    srcs: ["Modules/cjkcodecs/_codecs_cn.c"],
}

cc_library_static {
    name: "py2-c-module-_codecs_tw",
    defaults: ["py2-interp-defaults"],
    srcs: ["Modules/cjkcodecs/_codecs_tw.c"],
}

cc_library_static {
    name: "py2-c-module-_codecs_hk",
    defaults: ["py2-interp-defaults"],
    srcs: ["Modules/cjkcodecs/_codecs_hk.c"],
}

cc_library_static {
    name: "py2-c-module-_codecs_iso2022",
    defaults: ["py2-interp-defaults"],
    srcs: ["Modules/cjkcodecs/_codecs_iso2022.c"],
}

cc_library_static {
    name: "py2-c-module-_multiprocessing",
    defaults: ["py2-interp-defaults"],
    srcs: [
        "Modules/_multiprocessing/multiprocessing.c",
        "Modules/_multiprocessing/semaphore.c",
        "Modules/_multiprocessing/socket_connection.c",
    ],
}

cc_library_static {
    name: "py2-c-module-zlib",
    defaults: [
        "py2-interp-defaults",
    ],
    cflags: [
        "-DUSE_ZLIB_CRC32",
    ],
    srcs: [
        "Modules/zlibmodule.c",
    ],
    static_libs: [
        "libz",
    ],
}

cc_library_static {
    name: "py2-c-module-pyexpat",
    defaults: [
        "py2-interp-defaults",
    ],
    cflags: [
        "-DUSE_PYEXPAT_CAPI",
    ],
    srcs: [
        "Modules/pyexpat.c",
    ],
    static_libs: [
        "libexpat",
    ],
}

cc_library_static {
    name: "py2-c-module-_sqlite3",
    defaults: [
        "py2-interp-defaults",
    ],
    cflags: [
        "-DMODULE_NAME=\"sqlite3\"",
        "-DSQLITE_OMIT_LOAD_EXTENSION",
        "-Wno-format-security",
        "-Wno-type-limits",
        "-Wno-char-subscripts",
    ],
    local_include_dirs: [
        "Modules/_sqlite",
    ],
    srcs: [
        "Modules/_sqlite/cache.c",
        "Modules/_sqlite/connection.c",
        "Modules/_sqlite/cursor.c",
        "Modules/_sqlite/microprotocols.c",
        "Modules/_sqlite/module.c",
        "Modules/_sqlite/prepare_protocol.c",
        "Modules/_sqlite/row.c",
        "Modules/_sqlite/statement.c",
        "Modules/_sqlite/util.c",
    ],
    target: {
        linux_glibc_x86_64: {
            static_libs: [
                "libsqlite",
            ],
        },
        darwin_x86_64: {
            static_libs: [
                "libsqlite",
            ],
        },
        android: {
            shared_libs: [
                "libsqlite",
            ]
        },
    },
}

cc_library_static {
    name: "py2-c-module-_ctypes_test",
    defaults: ["py2-interp-defaults"],
    srcs: ["Modules/_ctypes/_ctypes_test.c"],
}

cc_library_static {
    name: "py2-c-module-_ctypes",
    defaults: [
        "py2-interp-defaults",
    ],
    local_include_dirs: [
        "Modules/_ctypes/libffi/include",
    ],
    srcs: [
        "Modules/_ctypes/_ctypes.c",
        "Modules/_ctypes/callbacks.c",
        "Modules/_ctypes/callproc.c",
        "Modules/_ctypes/stgdict.c",
        "Modules/_ctypes/cfield.c",
        "Modules/_ctypes/libffi/src/prep_cif.c",
        "Modules/_ctypes/libffi/src/closures.c",
    ],
    arch: {
        x86_64: {
            local_include_dirs: [
                "Modules/_ctypes/libffi/src/x86",
            ],
            srcs: [
                "Modules/_ctypes/libffi/src/x86/ffi64.c",
                "Modules/_ctypes/libffi/src/x86/ffi.c",
                "Modules/_ctypes/libffi/src/x86/sysv.S",
            ],
        },
        x86: {
            local_include_dirs: [
                "Modules/_ctypes/libffi/src/x86",
            ],
            srcs: [
                "Modules/_ctypes/libffi/src/x86/ffi.c",
                "Modules/_ctypes/libffi/src/x86/sysv.S",
            ],
        },
        arm: {
            local_include_dirs: [
                "android_arm/libffi",
                "Modules/_ctypes/libffi/src/arm",
            ],
            srcs: [
                "Modules/_ctypes/libffi/src/arm/ffi.c",
                "Modules/_ctypes/libffi/src/arm/sysv.S",
                "Modules/_ctypes/libffi/src/arm/trampoline.S",
            ]
        },
        arm64: {
            // arithmetic on a pointer in _ctypes/libffi/src/aarch64/ffi.c
            cflags: ["-Wno-pointer-arith"],
            local_include_dirs: [
                "android_arm64/libffi",
                "Modules/_ctypes/libffi/src/aarch64",
            ],
            srcs: [
                "Modules/_ctypes/libffi/src/aarch64/ffi.c",
                "Modules/_ctypes/libffi/src/aarch64/sysv.S",
            ]
        },
    },
    target: {
        // Regenerate include dirs with android_regen.sh
        darwin_x86_64: {
            local_include_dirs: ["darwin_x86_64/libffi"],
            srcs: [
                "Modules/_ctypes/libffi/src/x86/darwin.S",
                "Modules/_ctypes/libffi/src/x86/darwin64.S",
            ],
        },
        linux_glibc_x86_64: {
            local_include_dirs: ["linux_x86_64/libffi"],
            srcs: [
                "Modules/_ctypes/libffi/src/x86/unix64.S",
            ],
        },
        android_x86: {
            local_include_dirs: ["android_x86/libffi"],
            srcs: [
                "Modules/_ctypes/libffi/src/x86/win32.S",
            ],
        },
        android_x86_64: {
            local_include_dirs: ["android_x86_64/libffi"],
            srcs: [
                "Modules/_ctypes/libffi/src/x86/unix64.S",
            ],
        },
    },
}