from build.c import cxxprogram, cxxlibrary, simplerule, clibrary from build.ab import simplerule from build.pkg import package from glob import glob from functools import reduce import operator from os.path import * import config cflags = [ '-DIMHEX_PROJECT_NAME=\\"fluxengine\\"', "-DIMHEX_STATIC_LINK_PLUGINS", '-DIMHEX_VERSION=\\"0.0.0\\"', "-DLUNASVG_BUILD_STATIC", "-DPLUTOVG_BUILD_STATIC", "-DUNICODE", # "-DDEBUG", ] if config.osx: cflags = cflags + ["-DOS_MACOS"] elif config.windows: cflags = cflags + ["-DOS_WINDOWS"] else: cflags = cflags + ["-DOS_LINUX"] def headers_from(path): hdrs = { k: f"{path}/{k}" for k in glob("**/*.h*", root_dir=path, recursive=True) } assert hdrs, f"path {path} contained no headers" return hdrs def sources_from(path, except_for=[]): srcs = [ join(path, f) for f in glob("**/*.[ch]*", root_dir=path, recursive=True) ] srcs = [f for f in srcs if f not in except_for] assert srcs, f"path {path} contained no sources" return srcs package(name="freetype2_lib", package="freetype2") package(name="libcurl_lib", package="libcurl") package(name="glfw3_lib", package="glfw3") package(name="magic_lib", package="libmagic") package(name="mbedtls_lib", package="mbedtls") cxxlibrary( name="nlohmannjson_lib", srcs=[], hdrs=headers_from("dep/nlohmann_json/single_include"), ) clibrary( name="md4c_lib", srcs=sources_from("dep/md4c/src"), hdrs={"md4c.h": "dep/md4c/src/md4c.h"}, ) cxxlibrary(name="cli11_lib", srcs=[], hdrs=headers_from("dep/cli11/include")) if config.osx: clibrary( name="libnfd", srcs=["dep/native-file-dialog/src/nfd_cocoa.m"], hdrs={ "nfd.hpp": "dep/native-file-dialog/src/include/nfd.hpp", "nfd.h": "dep/native-file-dialog/src/include/nfd.h", }, ) elif config.windows: cxxlibrary( name="libnfd", srcs=(["dep/native-file-dialog/src/nfd_win.cpp"]), hdrs={ "nfd.hpp": "dep/native-file-dialog/src/include/nfd.hpp", "nfd.h": "dep/native-file-dialog/src/include/nfd.h", }, ) else: package(name="dbus_lib", package="dbus-1") cxxlibrary( name="libnfd", srcs=(["dep/native-file-dialog/src/nfd_portal.cpp"]), hdrs={ "nfd.hpp": "dep/native-file-dialog/src/include/nfd.hpp", "nfd.h": "dep/native-file-dialog/src/include/nfd.h", }, deps=[".+dbus_lib"], ) clibrary( name="plutovg", srcs=sources_from("dep/lunasvg/plutovg/source"), hdrs=headers_from("dep/lunasvg/plutovg/include"), cflags=cflags, ) cxxlibrary( name="lunasvg", srcs=sources_from("dep/lunasvg/source"), hdrs=headers_from("dep/lunasvg/include"), deps=[".+plutovg", "+fmt_lib"], cflags=cflags, ) cxxlibrary( name="imgui", srcs=sources_from("dep/imhex/lib/third_party/imgui/backend/source") + sources_from("dep/imhex/lib/third_party/imgui/imnodes/source") + sources_from("dep/imhex/lib/third_party/imgui/implot/source") + sources_from("dep/imhex/lib/third_party/imgui/implot3d/source") + sources_from("dep/imhex/lib/third_party/imgui/imgui/source"), hdrs=reduce( operator.ior, [ headers_from(f"dep/imhex/lib/third_party/imgui/{d}/include") for d in [ "imgui", "backend", "implot", "implot3d", "imnodes", "cimgui", ] ], ) | { "imgui_freetype.h": "dep/imhex/lib/third_party/imgui/imgui/include/misc/freetype/imgui_freetype.h", "imconfig.h": "./imhex_overrides/imconfig.h", }, deps=[".+freetype2_lib", ".+lunasvg", ".+glfw3_lib"], ) cxxlibrary(name="libxdgpp", srcs=[], hdrs={"xdg.hpp": "dep/xdgpp/xdg.hpp"}) cxxprogram( name="mkromfs", srcs=["./tools/mkromfs.cc"], cflags=[ '-DLIBROMFS_PROJECT_NAME=\\"fluxengine\\"', '-DRESOURCE_LOCATION=\\"rsrc\\"', ], deps=["+fmt_lib"], ) if config.osx: clibrary( name="libwolv-io-fs", srcs=[ "dep/libwolv/libs/io/source/io/fs_macos.m", ], cflags=cflags, ) elif config.windows: cxxlibrary( name="libwolv-io-fs", srcs=["dep/libwolv/libs/io/source/io/file_win.cpp"], hdrs=( headers_from("dep/libwolv/libs/io/include") | headers_from("dep/libwolv/libs/types/include") | headers_from("dep/libwolv/libs/utils/include") ), cflags=cflags, ) else: cxxlibrary( name="libwolv-io-fs", srcs=[], cflags=cflags, ) wolv_modules = [ "types", "io", "utils", "containers", "hash", "math_eval", "net", ] cxxlibrary( name="libwolv", srcs=( [ "dep/libwolv/libs/io/source/io/file.cpp", "dep/libwolv/libs/io/source/io/fs.cpp", "dep/libwolv/libs/io/source/io/handle.cpp", "dep/libwolv/libs/math_eval/source/math_eval/math_evaluator.cpp", "dep/libwolv/libs/utils/source/utils/string.cpp", ] + sources_from("dep/libwolv/libs/net/source") + ( ["dep/libwolv/libs/io/source/io/file_unix.cpp"] if config.osx or config.unix else [] ) ), hdrs=reduce( operator.ior, [headers_from(f"dep/libwolv/libs/{d}/include") for d in wolv_modules], ) | { "types/uintwide_t.h": "dep/libwolv/libs/types/include/wolv/types/uintwide_t.h" }, deps=[".+libwolv-io-fs"], cflags=cflags, ) cxxlibrary( name="libthrowingptr", srcs=[], hdrs=headers_from("dep/throwing_ptr/include"), ) cxxlibrary( name="libpl", srcs=sources_from("dep/pattern-language/lib/source") + sources_from("dep/pattern-language/cli/source"), hdrs=( headers_from("dep/pattern-language/lib/include") | headers_from("dep/pattern-language/generators/include") | headers_from("dep/pattern-language/cli/include") ), deps=[ ".+libthrowingptr", ".+libwolv", "+fmt_lib", ".+cli11_lib", ".+nlohmannjson_lib", ], ) cxxlibrary( name="hacks", srcs=[], hdrs={"jthread.hpp": "./imhex_overrides/jthread.hpp"} ) clibrary( name="libmicrotar", srcs=sources_from("dep/imhex/lib/third_party/microtar/source"), hdrs=headers_from("dep/imhex/lib/third_party/microtar/include"), ) if config.osx: clibrary( name="libimhex-utils", srcs=[ "dep/imhex/lib/libimhex/source/helpers/utils_macos.m", "dep/imhex/lib/libimhex/source/helpers/macos_menu.m", ], hdrs=headers_from("dep/imhex/lib/libimhex/include"), cflags=cflags, deps=[".+glfw3_lib"], ) elif config.windows: cxxlibrary(name="libimhex-utils", srcs=[]) elif config.unix: cxxlibrary( name="libimhex-utils", srcs=["dep/imhex/lib/libimhex/source/helpers/utils_linux.cpp"], hdrs=headers_from("dep/imhex/lib/libimhex/include"), cflags=cflags, deps=[".+libwolv"], ) cxxlibrary( name="libimhex", srcs=( sources_from("dep/imhex/lib/libimhex/source/ui") + sources_from( "dep/imhex/lib/libimhex/source/api", except_for=[ "dep/imhex/lib/libimhex/source/api/achievement_manager.cpp" ], ) + sources_from("dep/imhex/lib/libimhex/source/data_processor") + sources_from("dep/imhex/lib/libimhex/source/providers") + [ "dep/imhex/lib/libimhex/source/subcommands/subcommands.cpp", "dep/imhex/lib/libimhex/source/helpers/crypto.cpp", "dep/imhex/lib/libimhex/source/helpers/debugging.cpp", "./imhex_overrides/achievement_manager.cpp", "./imhex_overrides/default_paths.cpp", "dep/imhex/lib/libimhex/source/helpers/fs.cpp", "dep/imhex/lib/libimhex/source/helpers/http_requests.cpp", "dep/imhex/lib/libimhex/source/helpers/http_requests_native.cpp", "dep/imhex/lib/libimhex/source/helpers/encoding_file.cpp", "dep/imhex/lib/libimhex/source/helpers/logger.cpp", "dep/imhex/lib/libimhex/source/helpers/magic.cpp", "dep/imhex/lib/libimhex/source/helpers/opengl.cpp", "dep/imhex/lib/libimhex/source/helpers/scaling.cpp", "dep/imhex/lib/libimhex/source/helpers/semantic_version.cpp", "dep/imhex/lib/libimhex/source/helpers/utils.cpp", "dep/imhex/lib/libimhex/source/helpers/patches.cpp", "dep/imhex/lib/libimhex/source/helpers/keys.cpp", "dep/imhex/lib/libimhex/source/helpers/tar.cpp", "dep/imhex/lib/libimhex/source/helpers/udp_server.cpp", ], ), hdrs=headers_from("dep/imhex/lib/libimhex/include"), cflags=cflags, deps=[ ".+libwolv", ".+imgui", ".+libpl", ".+libnfd", ".+libxdgpp", ".+libmicrotar", ".+libimhex-utils", ".+libcurl_lib", ".+glfw3_lib", ".+magic_lib", ".+mbedtls_lib", ".+hacks", ], ) cxxlibrary( name="libtrace", srcs=[ "dep/imhex/lib/trace/source/stacktrace.cpp", "dep/imhex/lib/trace/source/exceptions.cpp", "dep/imhex/lib/third_party/llvm-demangle/source/Demangle.cpp", "dep/imhex/lib/third_party/llvm-demangle/source/RustDemangle.cpp", "dep/imhex/lib/third_party/llvm-demangle/source/DLangDemangle.cpp", "dep/imhex/lib/third_party/llvm-demangle/source/ItaniumDemangle.cpp", "dep/imhex/lib/third_party/llvm-demangle/source/MicrosoftDemangle.cpp", "dep/imhex/lib/third_party/llvm-demangle/source/MicrosoftDemangleNodes.cpp", ], hdrs=( headers_from("dep/imhex/lib/trace/include") | headers_from("dep/imhex/lib/third_party/llvm-demangle/include") | { "ItaniumNodes.def": "dep/imhex/lib/third_party/llvm-demangle/include/llvm/Demangle/ItaniumNodes.def" } ), ) def romfs(name, id, dir): cxxprogram( name=f"{id}_mkromfs", srcs=["./tools/mkromfs.cc"], cflags=[ f'-DLIBROMFS_PROJECT_NAME=\\"{id}\\"', f'-DRESOURCE_LOCATION=\\"{dir}\\"', ], deps=["+fmt_lib"], ) simplerule( name=name, ins=[f for f in glob(dir + "/**", recursive=True) if isfile(f)], outs=["=romfs.cc"], deps=[f".+{id}_mkromfs"], commands=[ f"$[deps[0]] $[outs[0]] {dir}", ], label="ROMFS", ) def plugin(name, id, srcs, hdrs, romfsdir, deps): romfs(name=f"{id}_romfs", id=id, dir=romfsdir) cxxlibrary( name=name, srcs=srcs + [f".+{id}_romfs", "dep/libromfs/lib/source/romfs.cpp"], hdrs=hdrs | headers_from("dep/libromfs/lib/include"), cflags=cflags + [ f"-DIMHEX_PLUGIN_NAME={id}", f"-DLIBROMFS_PROJECT_NAME={id}", f"-DIMHEX_PLUGIN_FEATURES_CONTENT=", f"-Dromfs=romfs_{id}", ], deps=deps, ) plugin( name="fonts-plugin", id="fonts", srcs=sources_from("dep/imhex/plugins/fonts/source"), hdrs=headers_from("dep/imhex/plugins/fonts/include"), romfsdir="dep/imhex/plugins/fonts/romfs", deps=[".+libimhex"], ) plugin( name="ui-plugin", id="ui", srcs=( sources_from("dep/imhex/plugins/ui/source/ui/text_editor") + [ "dep/imhex/plugins/ui/source/ui/hex_editor.cpp", "dep/imhex/plugins/ui/source/ui/markdown.cpp", "dep/imhex/plugins/ui/source/ui/pattern_drawer.cpp", "dep/imhex/plugins/ui/source/ui/pattern_value_editor.cpp", "dep/imhex/plugins/ui/source/ui/visualizer_drawer.cpp", "dep/imhex/plugins/ui/source/ui/widgets.cpp", "dep/imhex/plugins/ui/source/library_ui.cpp", "./imhex_overrides/menu_items.cpp", ] ), hdrs=headers_from("dep/imhex/plugins/ui/include"), romfsdir="dep/imhex/plugins/ui/romfs", deps=[".+libimhex", ".+fonts-plugin", ".+md4c_lib"], ) plugin( name="builtin-plugin", id="builtin", srcs=sources_from( "dep/imhex/plugins/builtin/source", except_for=[ "dep/imhex/plugins/builtin/source/content/achievements.cpp", "dep/imhex/plugins/builtin/source/content/data_processor_nodes.cpp", "dep/imhex/plugins/builtin/source/content/main_menu_items.cpp", "dep/imhex/plugins/builtin/source/content/out_of_box_experience.cpp", "dep/imhex/plugins/builtin/source/content/providers.cpp", "dep/imhex/plugins/builtin/source/content/ui_items.cpp", "dep/imhex/plugins/builtin/source/content/views.cpp", "dep/imhex/plugins/builtin/source/content/views/view_achievements.cpp", "dep/imhex/plugins/builtin/source/content/views/view_data_processor.cpp", "dep/imhex/plugins/builtin/source/content/views/view_tutorials.cpp", "dep/imhex/plugins/builtin/source/content/welcome_screen.cpp", ] + glob( "dep/imhex/plugins/builtin/source/content/data_processor_nodes/*" ) + glob("dep/imhex/plugins/builtin/source/content/tutorials/*"), ) + [ "./imhex_overrides/main_menu_items.cpp", "./imhex_overrides/providers.cpp", "./imhex_overrides/stubs.cc", "./imhex_overrides/ui_items.cc", "./imhex_overrides/views.cpp", "./imhex_overrides/welcome.cc", ], hdrs=headers_from("dep/imhex/plugins/builtin/include"), romfsdir="dep/imhex/plugins/builtin/romfs", deps=[ ".+libimhex", ".+libtrace", ".+libpl", ".+libwolv", ".+ui-plugin", ".+fonts-plugin", "dep/imhex/plugins/builtin/source/content/ui_items.cpp", ], ) plugin( name="gui-plugin", id="gui", srcs=[ "./imhex_overrides/splash_window.cpp", "dep/imhex/main/gui/include/crash_handlers.hpp", "dep/imhex/main/gui/include/messaging.hpp", "dep/imhex/main/gui/include/window.hpp", "dep/imhex/main/gui/source/crash_handlers.cpp", "dep/imhex/main/gui/source/init/run/cli.cpp", "dep/imhex/main/gui/source/init/run/common.cpp", "dep/imhex/main/gui/source/init/run/desktop.cpp", "dep/imhex/main/gui/source/init/tasks.cpp", "dep/imhex/main/gui/source/main.cpp", "dep/imhex/main/gui/source/messaging/common.cpp", "dep/imhex/main/gui/source/window/window.cpp", ] + ( [ "dep/imhex/main/gui/source/window/platform/macos.cpp", "dep/imhex/main/gui/source/messaging/macos.cpp", ] if config.osx else ( [ "dep/imhex/main/gui/source/window/platform/windows.cpp", "dep/imhex/main/gui/source/messaging/windows.cpp", ] if config.windows else [ "dep/imhex/main/gui/source/window/platform/linux.cpp", "dep/imhex/main/gui/source/messaging/linux.cpp", ] ) ), hdrs=headers_from("dep/imhex/main/gui/include"), romfsdir="src/gui2/imhex_overrides/rsrc", deps=[ ".+libtrace", ".+libimhex", ".+imgui", ], ) plugin( name="fluxengine-plugin", id="fluxengine", srcs=[ "./abstractsectorview.cc", "./abstractsectorview.h", "./configview.cc", "./configview.h", "./controlpanelview.cc", "./controlpanelview.h", "./datastore.cc", "./datastore.h", "./diskprovider.cc", "./diskprovider.h", "./fluxengine.cc", "./globals.h", "./imageview.cc", "./imageview.h", "./logview.cc", "./logview.h", "./physicalview.cc", "./physicalview.h", "./summaryview.cc", "./summaryview.h", "./visualiserview.cc", "./visualiserview.h", "./utils.cc", "./utils.h", ], hdrs={}, romfsdir="src/gui2/rsrc", deps=[ ".+libimhex", ".+fonts-plugin", ".+ui-plugin", "+protocol", "dep/adflib", "dep/fatfs", "dep/hfsutils", "dep/libusbp", "lib/core", "lib/data", "lib/vfs", "lib/config", "lib/usb", "src/gui/drivetypes", "src/formats", "+z_lib", ], ) cxxprogram( name="gui2", srcs=[ "./main.cc", ], cflags=cflags, ldflags=["-lmbedcrypto"] + (["-ldl"] if config.unix else []) + (["-ldwmapi", "-lnetapi32"] if config.windows else []), deps=[ ".+libpl", "+fmt_lib", ".+builtin-plugin", ".+fonts-plugin", ".+ui-plugin", ".+gui-plugin", ".+fluxengine-plugin", ] # Windows needs this, for some reason. + (config.windows and [package(name="tre_lib", package="tre")] or []), ) if config.osx: simplerule( name="fluxengine_app_zip", ins=[ ".+gui2", "extras+fluxengine_icns", "extras+fluxengine_template", ], outs=["=FluxEngine.app.zip"], commands=[ "rm -rf $[dir]/FluxEngine.app", "unzip -q -d $[dir] $[ins[2]]", # creates FluxEngine.app "cp $[ins[0]] $[dir]/FluxEngine.app/Contents/MacOS/fluxengine-gui", "mkdir -p $[dir]/FluxEngine.app/Contents/Resources", "cp $[ins[1]] $[dir]/FluxEngine.app/Contents/Resources/FluxEngine.icns", "dylibbundler -of -x $[dir]/FluxEngine.app/Contents/MacOS/fluxengine-gui -b -d $[dir]/FluxEngine.app/Contents/libs -cd > /dev/null", # "cp $$(brew --prefix wxwidgets)/README.md FluxEngine.app/Contents/libs/wxWidgets.md", # "cp $$(brew --prefix protobuf)/LICENSE FluxEngine.app/Contents/libs/protobuf.txt", # "cp $$(brew --prefix fmt)/LICENSE* FluxEngine.app/Contents/libs/fmt.rst", # "cp $$(brew --prefix libpng)/LICENSE FluxEngine.app/Contents/libs/libpng.txt", # "cp $$(brew --prefix libjpeg)/README FluxEngine.app/Contents/libs/libjpeg.txt", # "cp $$(brew --prefix abseil)/LICENSE FluxEngine.app/Contents/libs/abseil.txt", # "cp $$(brew --prefix libtiff)/LICENSE.md FluxEngine.app/Contents/libs/libtiff.txt", # "cp $$(brew --prefix zstd)/LICENSE FluxEngine.app/Contents/libs/zstd.txt", "(cd $[dir] && zip -rq FluxEngine.app.zip FluxEngine.app)", "mv $[dir]/FluxEngine.app.zip $[outs[0]]", ], label="MKAPP", ) simplerule( name="fluxengine_pkg", ins=[ ".+fluxengine_app_zip", ], outs=["=FluxEngine.pkg"], commands=[ "rm -rf $[dir]/FluxEngine.app", "unzip -q -d $[dir] $[ins[0]]", "pkgbuild --quiet --install-location /Applications --component $[dir]/FluxEngine.app $[outs[0]]", ], label="MKPKG", )