diff --git a/.gitmodules b/.gitmodules new file mode 100644 index 000000000..ad5d7dd67 --- /dev/null +++ b/.gitmodules @@ -0,0 +1,22 @@ +[submodule "3rdparty/spdlog"] + url = https://github.com/gabime/spdlog + path = 3rdparty/spdlog +[submodule "3rdparty/cpp-httplib"] + url = https://github.com/yhirose/cpp-httplib + path = 3rdparty/cpp-httplib +[submodule "3rdparty/cryptopp"] + url = https://github.com/weidai11/cryptopp + path = 3rdparty/cryptopp +[submodule "3rdparty/cryptopp-cmake"] + url = https://github.com/abdes/cryptopp-cmake + path = 3rdparty/cryptopp-cmake +[submodule "3rdparty/cxxopts"] + url = https://github.com/jarro2783/cxxopts + path = 3rdparty/cxxopts +[submodule "3rdparty/jsoncpp"] + url = https://github.com/open-source-parsers/jsoncpp + path = 3rdparty/jsoncpp +[submodule "3rdparty/pybind11"] + url = https://github.com/pybind/pybind11 + path = 3rdparty/pybind11 + branch = v2.13 \ No newline at end of file diff --git a/builddep.py b/builddep.py new file mode 100644 index 000000000..59236816d --- /dev/null +++ b/builddep.py @@ -0,0 +1,179 @@ +import argparse +import os.path +from typing import List + +from pydep.packages.cryptopp import CryptoppCMakePackage, CryptoppCMakeOptions +from pydep.packages.cxxopts import CxxoptsPackage, CxxoptsOptions +from pydep.packages.jsoncpp import JsonCppPackage, JsonCppOptions +from pydep.packages.pybind11 import Pybind11Package, Pybind11Options +from pydep.packages.spdlog import SpdlogPackage, SpdlogOptions +from pydep.tools.builder import PackageBuilder +from pydep.packages.cpphttplib import CppHttpLibPackage +from pydep.tools.cmakelists import * + +THIRD_PARTY_ROOT_DIR = "./3rdparty" +BUILD_ROOT_DIR = f"{THIRD_PARTY_ROOT_DIR}/build" +PKGS_ROOT_DIR = f"{THIRD_PARTY_ROOT_DIR}/pkgs" +PYTHON_DIR = "./python" + +ANDROID_ARCH_ABI = [ + "x86", + "x86_64", + "arm64-v8a", + "armeabi-v7a", +] + + +def get_android_builder(cls, name, options=None) -> list: + builders = [] + + cmake = CMakeLists() + cmake.set_generator(CMakeGenerator.MinGW_Makefiles).add_option([ + CMakeSystemName("Android"), + CMakeToolChainFile(f"{NDK_ROOT}/build/cmake/android.toolchain.cmake"), + CMakeDefine("ANDROID_PLATFORM", "21"), + ]) + for abi in ANDROID_ARCH_ABI: + android = cls() + android.set_cmakelists(cmake) \ + .set_source_dir(f"{THIRD_PARTY_ROOT_DIR}/{name}") \ + .set_build_dir(f"{BUILD_ROOT_DIR}/{name}-android-{abi}") \ + .set_install_dir(f"{PKGS_ROOT_DIR}/{name}-android-{abi}") \ + .add_cmake_option(CMakeDefine("ANDROID_ABI", abi)) \ + .set_options(options) + builders.append(android) + return builders + + +def get_windows_builder(cls, name, options=None) -> list: + builders = [] + windows = cls() + windows.set_source_dir(f"{THIRD_PARTY_ROOT_DIR}/{name}") \ + .set_build_dir(f"{BUILD_ROOT_DIR}/{name}-windows") \ + .set_install_dir(f"{PKGS_ROOT_DIR}/{name}-windows") \ + .set_options(options) + builders.append(windows) + return builders + + +def get_linux_builder(cls, name, options=None) -> list: + builders = [] + # TODO: linux platform package + return builders + + +def get_all_platform_builder(cls, name, options=None) -> list: + builders = [] + + builders.extend(get_android_builder(cls, name, options)) + builders.extend(get_windows_builder(cls, name, options)) + builders.extend(get_linux_builder(cls, name, options)) + + return builders + + +def get_cpp_httplib_builders() -> List[CppHttpLibPackage]: + return get_all_platform_builder(CppHttpLibPackage, "cpp-httplib") + + +def get_jsoncpp_builders() -> List[JsonCppPackage]: + return get_all_platform_builder(JsonCppPackage, "jsoncpp", JsonCppOptions( + JSONCPP_WITH_TESTS=False, + JSONCPP_WITH_POST_BUILD_UNITTEST=False, + BUILD_SHARED_LIBS=False, + BUILD_OBJECT_LIBS=False, + )) + + +def get_spdlog_builders() -> List[SpdlogPackage]: + return get_all_platform_builder(SpdlogPackage, "spdlog", SpdlogOptions( + SPDLOG_BUILD_EXAMPLE=False, + )) + + +def get_cxxopts_builders() -> List[CxxoptsPackage]: + return get_all_platform_builder(CxxoptsPackage, "cxxopts", CxxoptsOptions( + CXXOPTS_BUILD_EXAMPLES=False, + CXXOPTS_BUILD_TESTS=False, + )) + + +def get_cryptopp_builders() -> List[CryptoppCMakePackage]: + builders = [] + options = CryptoppCMakeOptions( + CRYPTOPP_BUILD_TESTING=False, + ) + + cmake = CMakeLists() + cmake.set_generator(CMakeGenerator.MinGW_Makefiles).add_option([ + CMakeSystemName("Android"), + CMakeToolChainFile(f"{NDK_ROOT}/build/cmake/android.toolchain.cmake"), + CMakeDefine("ANDROID_PLATFORM", "21"), + ]) + for abi in ANDROID_ARCH_ABI: + android = CryptoppCMakePackage() + android.set_cmakelists(cmake) \ + .set_source_dir(f"{THIRD_PARTY_ROOT_DIR}/cryptopp", f"{THIRD_PARTY_ROOT_DIR}/cryptopp-cmake") \ + .set_build_dir(f"{BUILD_ROOT_DIR}/cryptopp-android-{abi}") \ + .set_install_dir(f"{PKGS_ROOT_DIR}/cryptopp-android-{abi}") \ + .add_cmake_option(CMakeDefine("ANDROID_ABI", abi)) \ + .set_options(options) + builders.append(android) + + windows = CryptoppCMakePackage() + windows.set_source_dir(f"{THIRD_PARTY_ROOT_DIR}/cryptopp", f"{THIRD_PARTY_ROOT_DIR}/cryptopp-cmake") \ + .set_build_dir(f"{BUILD_ROOT_DIR}/cryptopp-windows") \ + .set_install_dir(f"{PKGS_ROOT_DIR}/cryptopp-windows") \ + .set_options(options) + builders.append(windows) + + # TODO: cryptopp on linux + + return builders + + +def get_pybind11_builders() -> List[Pybind11Package]: + builders = [] + builders.extend(get_windows_builder(Pybind11Package, "pybind11", Pybind11Options( + PYBIND11_TEST=False, + PYBIND11_NOPYTHON=True, + ))) + + # TODO: pybind11 on linux and macos + + return builders + + +NDK_ROOT = "E:/ndk" + + +def main(): + parser = argparse.ArgumentParser() + parser.add_argument("--ndk", type=str, help="ndk install dir") + args = parser.parse_args() + + global NDK_ROOT + NDK_ROOT = args.ndk + + if not os.path.exists(BUILD_ROOT_DIR): + os.makedirs(BUILD_ROOT_DIR) + if not os.path.exists(PKGS_ROOT_DIR): + os.makedirs(PKGS_ROOT_DIR) + + pkg_builders: List[PackageBuilder] = [] + + pkg_builders.extend(get_cpp_httplib_builders()) + pkg_builders.extend(get_jsoncpp_builders()) + pkg_builders.extend(get_spdlog_builders()) + pkg_builders.extend(get_cxxopts_builders()) + pkg_builders.extend(get_cryptopp_builders()) + pkg_builders.extend(get_pybind11_builders()) + + for p in pkg_builders: + p.configure() + p.build() + p.install() + + +if __name__ == "__main__": + main()