diff --git a/.github/workflows/build.yml b/.github/workflows/build.yml index 979c552..a34360a 100644 --- a/.github/workflows/build.yml +++ b/.github/workflows/build.yml @@ -19,9 +19,7 @@ jobs: - uses: actions/cache@v4 with: path: ~/.cache/bazel - key: ${{ runner.os }}-bazel-${{ hashFiles('./WORKSPACE', '**/BUILD', '**/BUILD.bzl', '**/*.bzl', '.bazelrc') }} + key: ${{ runner.os }}-bazel-${{ hashFiles('./MODULE.bazel', './MODULE.bazel.lock', '**/BUILD', '**/BUILD.bzl', '**/*.bzl', '.bazelrc') }} restore-keys: | ${{ runner.os }}-bazel- - run: bazel test --config ci //:unreal_target_test - - run: bazel build --config ci //:rules-unreal-engine - diff --git a/BUILD b/BUILD index 1f35d44..1acb193 100644 --- a/BUILD +++ b/BUILD @@ -1,33 +1,5 @@ -load("@io_bazel_rules_go//go:def.bzl", "go_binary", "go_library") -load("@bazel_gazelle//:def.bzl", "gazelle") load(":rules_test.bzl", "unreal_target_test_suite") -# gazelle:prefix kreempuff.dev/rules-unreal-engine -gazelle(name = "gazelle") - -gazelle( - name = "gazelle-update-repos", - args = [ - "-from_file=go.mod", - "-to_macro=deps.bzl%go_dependencies", - "-prune", - ], - command = "update-repos", -) - -go_library( - name = "rules-unreal-engine_lib", - srcs = ["main.go"], - importpath = "kreempuff.dev/rules-unreal-engine", - visibility = ["//visibility:private"], - deps = ["//cmd"], -) - -go_binary( - name = "rules-unreal-engine", - embed = [":rules-unreal-engine_lib"], - visibility = ["//visibility:public"], -) unreal_target_test_suite( name = "unreal_target_test", diff --git a/MODULE.bazel b/MODULE.bazel index 904d287..982d671 100644 --- a/MODULE.bazel +++ b/MODULE.bazel @@ -1,4 +1,15 @@ module( name = "rules_unreal_engine", version = "0.0.1", -) \ No newline at end of file +) + +bazel_dep(name = "bazel_skylib", version = "1.7.1") + +unreal_engine = use_repo_rule("//internal/repo:rule.bzl", "unreal_engine") + +unreal_engine( + name = "unreal_engine", + commit = "kreempuff-release", + # git_repository = "https://github.com/kreempuff/UnrealEngine.git", + git_repository = "file:///Users/kareemmarch/Projects/UnrealEngine", +) diff --git a/MODULE.bazel.lock b/MODULE.bazel.lock new file mode 100644 index 0000000..afa02b7 --- /dev/null +++ b/MODULE.bazel.lock @@ -0,0 +1,111 @@ +{ + "lockFileVersion": 11, + "registryFileHashes": { + "https://bcr.bazel.build/bazel_registry.json": "8a28e4aff06ee60aed2a8c281907fb8bcbf3b753c91fb5a5c57da3215d5b3497", + "https://bcr.bazel.build/modules/abseil-cpp/20210324.2/MODULE.bazel": "7cd0312e064fde87c8d1cd79ba06c876bd23630c83466e9500321be55c96ace2", + "https://bcr.bazel.build/modules/abseil-cpp/20211102.0/MODULE.bazel": "70390338f7a5106231d20620712f7cccb659cd0e9d073d1991c038eb9fc57589", + "https://bcr.bazel.build/modules/abseil-cpp/20211102.0/source.json": "7e3a9adf473e9af076ae485ed649d5641ad50ec5c11718103f34de03170d94ad", + "https://bcr.bazel.build/modules/apple_support/1.5.0/MODULE.bazel": "50341a62efbc483e8a2a6aec30994a58749bd7b885e18dd96aa8c33031e558ef", + "https://bcr.bazel.build/modules/apple_support/1.5.0/source.json": "eb98a7627c0bc486b57f598ad8da50f6625d974c8f723e9ea71bd39f709c9862", + "https://bcr.bazel.build/modules/bazel_features/1.11.0/MODULE.bazel": "f9382337dd5a474c3b7d334c2f83e50b6eaedc284253334cf823044a26de03e8", + "https://bcr.bazel.build/modules/bazel_features/1.11.0/source.json": "c9320aa53cd1c441d24bd6b716da087ad7e4ff0d9742a9884587596edfe53015", + "https://bcr.bazel.build/modules/bazel_skylib/1.0.3/MODULE.bazel": "bcb0fd896384802d1ad283b4e4eb4d718eebd8cb820b0a2c3a347fb971afd9d8", + "https://bcr.bazel.build/modules/bazel_skylib/1.2.1/MODULE.bazel": "f35baf9da0efe45fa3da1696ae906eea3d615ad41e2e3def4aeb4e8bc0ef9a7a", + "https://bcr.bazel.build/modules/bazel_skylib/1.3.0/MODULE.bazel": "20228b92868bf5cfc41bda7afc8a8ba2a543201851de39d990ec957b513579c5", + "https://bcr.bazel.build/modules/bazel_skylib/1.6.1/MODULE.bazel": "8fdee2dbaace6c252131c00e1de4b165dc65af02ea278476187765e1a617b917", + "https://bcr.bazel.build/modules/bazel_skylib/1.7.1/MODULE.bazel": "3120d80c5861aa616222ec015332e5f8d3171e062e3e804a2a0253e1be26e59b", + "https://bcr.bazel.build/modules/bazel_skylib/1.7.1/source.json": "f121b43eeefc7c29efbd51b83d08631e2347297c95aac9764a701f2a6a2bb953", + "https://bcr.bazel.build/modules/buildozer/7.1.2/MODULE.bazel": "2e8dd40ede9c454042645fd8d8d0cd1527966aa5c919de86661e62953cd73d84", + "https://bcr.bazel.build/modules/buildozer/7.1.2/source.json": "c9028a501d2db85793a6996205c8de120944f50a0d570438fcae0457a5f9d1f8", + "https://bcr.bazel.build/modules/googletest/1.11.0/MODULE.bazel": "3a83f095183f66345ca86aa13c58b59f9f94a2f81999c093d4eeaa2d262d12f4", + "https://bcr.bazel.build/modules/googletest/1.11.0/source.json": "c73d9ef4268c91bd0c1cd88f1f9dfa08e814b1dbe89b5f594a9f08ba0244d206", + "https://bcr.bazel.build/modules/platforms/0.0.4/MODULE.bazel": "9b328e31ee156f53f3c416a64f8491f7eb731742655a47c9eec4703a71644aee", + "https://bcr.bazel.build/modules/platforms/0.0.5/MODULE.bazel": "5733b54ea419d5eaf7997054bb55f6a1d0b5ff8aedf0176fef9eea44f3acda37", + "https://bcr.bazel.build/modules/platforms/0.0.6/MODULE.bazel": "ad6eeef431dc52aefd2d77ed20a4b353f8ebf0f4ecdd26a807d2da5aa8cd0615", + "https://bcr.bazel.build/modules/platforms/0.0.7/MODULE.bazel": "72fd4a0ede9ee5c021f6a8dd92b503e089f46c227ba2813ff183b71616034814", + "https://bcr.bazel.build/modules/platforms/0.0.9/MODULE.bazel": "4a87a60c927b56ddd67db50c89acaa62f4ce2a1d2149ccb63ffd871d5ce29ebc", + "https://bcr.bazel.build/modules/platforms/0.0.9/source.json": "cd74d854bf16a9e002fb2ca7b1a421f4403cda29f824a765acd3a8c56f8d43e6", + "https://bcr.bazel.build/modules/protobuf/21.7/MODULE.bazel": "a5a29bb89544f9b97edce05642fac225a808b5b7be74038ea3640fae2f8e66a7", + "https://bcr.bazel.build/modules/protobuf/21.7/source.json": "bbe500720421e582ff2d18b0802464205138c06056f443184de39fbb8187b09b", + "https://bcr.bazel.build/modules/protobuf/3.19.0/MODULE.bazel": "6b5fbb433f760a99a22b18b6850ed5784ef0e9928a72668b66e4d7ccd47db9b0", + "https://bcr.bazel.build/modules/protobuf/3.19.6/MODULE.bazel": "9233edc5e1f2ee276a60de3eaa47ac4132302ef9643238f23128fea53ea12858", + "https://bcr.bazel.build/modules/rules_cc/0.0.1/MODULE.bazel": "cb2aa0747f84c6c3a78dad4e2049c154f08ab9d166b1273835a8174940365647", + "https://bcr.bazel.build/modules/rules_cc/0.0.2/MODULE.bazel": "6915987c90970493ab97393024c156ea8fb9f3bea953b2f3ec05c34f19b5695c", + "https://bcr.bazel.build/modules/rules_cc/0.0.8/MODULE.bazel": "964c85c82cfeb6f3855e6a07054fdb159aced38e99a5eecf7bce9d53990afa3e", + "https://bcr.bazel.build/modules/rules_cc/0.0.9/MODULE.bazel": "836e76439f354b89afe6a911a7adf59a6b2518fafb174483ad78a2a2fde7b1c5", + "https://bcr.bazel.build/modules/rules_cc/0.0.9/source.json": "1f1ba6fea244b616de4a554a0f4983c91a9301640c8fe0dd1d410254115c8430", + "https://bcr.bazel.build/modules/rules_java/4.0.0/MODULE.bazel": "5a78a7ae82cd1a33cef56dc578c7d2a46ed0dca12643ee45edbb8417899e6f74", + "https://bcr.bazel.build/modules/rules_java/7.6.5/MODULE.bazel": "481164be5e02e4cab6e77a36927683263be56b7e36fef918b458d7a8a1ebadb1", + "https://bcr.bazel.build/modules/rules_java/7.6.5/source.json": "a805b889531d1690e3c72a7a7e47a870d00323186a9904b36af83aa3d053ee8d", + "https://bcr.bazel.build/modules/rules_jvm_external/4.4.2/MODULE.bazel": "a56b85e418c83eb1839819f0b515c431010160383306d13ec21959ac412d2fe7", + "https://bcr.bazel.build/modules/rules_jvm_external/4.4.2/source.json": "a075731e1b46bc8425098512d038d416e966ab19684a10a34f4741295642fc35", + "https://bcr.bazel.build/modules/rules_license/0.0.3/MODULE.bazel": "627e9ab0247f7d1e05736b59dbb1b6871373de5ad31c3011880b4133cafd4bd0", + "https://bcr.bazel.build/modules/rules_license/0.0.7/MODULE.bazel": "088fbeb0b6a419005b89cf93fe62d9517c0a2b8bb56af3244af65ecfe37e7d5d", + "https://bcr.bazel.build/modules/rules_license/0.0.7/source.json": "355cc5737a0f294e560d52b1b7a6492d4fff2caf0bef1a315df5a298fca2d34a", + "https://bcr.bazel.build/modules/rules_pkg/0.7.0/MODULE.bazel": "df99f03fc7934a4737122518bb87e667e62d780b610910f0447665a7e2be62dc", + "https://bcr.bazel.build/modules/rules_pkg/0.7.0/source.json": "c2557066e0c0342223ba592510ad3d812d4963b9024831f7f66fd0584dd8c66c", + "https://bcr.bazel.build/modules/rules_proto/4.0.0/MODULE.bazel": "a7a7b6ce9bee418c1a760b3d84f83a299ad6952f9903c67f19e4edd964894e06", + "https://bcr.bazel.build/modules/rules_proto/5.3.0-21.7/MODULE.bazel": "e8dff86b0971688790ae75528fe1813f71809b5afd57facb44dad9e8eca631b7", + "https://bcr.bazel.build/modules/rules_proto/5.3.0-21.7/source.json": "d57902c052424dfda0e71646cb12668d39c4620ee0544294d9d941e7d12bc3a9", + "https://bcr.bazel.build/modules/rules_python/0.10.2/MODULE.bazel": "cc82bc96f2997baa545ab3ce73f196d040ffb8756fd2d66125a530031cd90e5f", + "https://bcr.bazel.build/modules/rules_python/0.22.1/MODULE.bazel": "26114f0c0b5e93018c0c066d6673f1a2c3737c7e90af95eff30cfee38d0bbac7", + "https://bcr.bazel.build/modules/rules_python/0.22.1/source.json": "57226905e783bae7c37c2dd662be078728e48fa28ee4324a7eabcafb5a43d014", + "https://bcr.bazel.build/modules/rules_python/0.4.0/MODULE.bazel": "9208ee05fd48bf09ac60ed269791cf17fb343db56c8226a720fbb1cdf467166c", + "https://bcr.bazel.build/modules/stardoc/0.5.1/MODULE.bazel": "1a05d92974d0c122f5ccf09291442580317cdd859f07a8655f1db9a60374f9f8", + "https://bcr.bazel.build/modules/stardoc/0.5.1/source.json": "a96f95e02123320aa015b956f29c00cb818fa891ef823d55148e1a362caacf29", + "https://bcr.bazel.build/modules/upb/0.0.0-20220923-a547704/MODULE.bazel": "7298990c00040a0e2f121f6c32544bab27d4452f80d9ce51349b1a28f3005c43", + "https://bcr.bazel.build/modules/upb/0.0.0-20220923-a547704/source.json": "f1ef7d3f9e0e26d4b23d1c39b5f5de71f584dd7d1b4ef83d9bbba6ec7a6a6459", + "https://bcr.bazel.build/modules/zlib/1.2.11/MODULE.bazel": "07b389abc85fdbca459b69e2ec656ae5622873af3f845e1c9d80fe179f3effa0", + "https://bcr.bazel.build/modules/zlib/1.2.12/MODULE.bazel": "3b1a8834ada2a883674be8cbd36ede1b6ec481477ada359cd2d3ddc562340b27", + "https://bcr.bazel.build/modules/zlib/1.3.1.bcr.3/MODULE.bazel": "af322bc08976524477c79d1e45e241b6efbeb918c497e8840b8ab116802dda79", + "https://bcr.bazel.build/modules/zlib/1.3.1.bcr.3/source.json": "2be409ac3c7601245958cd4fcdff4288be79ed23bd690b4b951f500d54ee6e7d" + }, + "selectedYankedVersions": {}, + "moduleExtensions": { + "@@apple_support~//crosstool:setup.bzl%apple_cc_configure_extension": { + "general": { + "bzlTransitiveDigest": "PjIds3feoYE8SGbbIq2SFTZy3zmxeO2tQevJZNDo7iY=", + "usagesDigest": "aLmqbvowmHkkBPve05yyDNGN7oh7QE9kBADr3QIZTZs=", + "recordedFileInputs": {}, + "recordedDirentsInputs": {}, + "envVariables": {}, + "generatedRepoSpecs": { + "local_config_apple_cc": { + "bzlFile": "@@apple_support~//crosstool:setup.bzl", + "ruleClassName": "_apple_cc_autoconf", + "attributes": {} + }, + "local_config_apple_cc_toolchains": { + "bzlFile": "@@apple_support~//crosstool:setup.bzl", + "ruleClassName": "_apple_cc_autoconf_toolchains", + "attributes": {} + } + }, + "recordedRepoMappingEntries": [ + [ + "apple_support~", + "bazel_tools", + "bazel_tools" + ] + ] + } + }, + "@@platforms//host:extension.bzl%host_platform": { + "general": { + "bzlTransitiveDigest": "xelQcPZH8+tmuOHVjL9vDxMnnQNMlwj0SlvgoqBkm4U=", + "usagesDigest": "meSzxn3DUCcYEhq4HQwExWkWtU4EjriRBQLsZN+Q0SU=", + "recordedFileInputs": {}, + "recordedDirentsInputs": {}, + "envVariables": {}, + "generatedRepoSpecs": { + "host_platform": { + "bzlFile": "@@platforms//host:extension.bzl", + "ruleClassName": "host_platform_repo", + "attributes": {} + } + }, + "recordedRepoMappingEntries": [] + } + } + } +} diff --git a/WORKSPACE b/WORKSPACE deleted file mode 100644 index 029c8f9..0000000 --- a/WORKSPACE +++ /dev/null @@ -1,76 +0,0 @@ -load("@bazel_tools//tools/build_defs/repo:http.bzl", "http_archive") -load("@bazel_tools//tools/build_defs/repo:git.bzl", "git_repository") - -http_archive( - name = "bazel_skylib", - sha256 = "bc283cdfcd526a52c3201279cda4bc298652efa898b10b4db0837dc51652756f", - urls = [ - "https://mirror.bazel.build/github.com/bazelbuild/bazel-skylib/releases/download/1.7.1/bazel-skylib-1.7.1.tar.gz", - "https://github.com/bazelbuild/bazel-skylib/releases/download/1.7.1/bazel-skylib-1.7.1.tar.gz", - ], -) - -load("@bazel_skylib//:workspace.bzl", "bazel_skylib_workspace") - -bazel_skylib_workspace() - -http_archive( - name = "io_bazel_rules_go", - sha256 = "6b65cb7917b4d1709f9410ffe00ecf3e160edf674b78c54a894471320862184f", - urls = [ - "https://mirror.bazel.build/github.com/bazelbuild/rules_go/releases/download/v0.39.0/rules_go-v0.39.0.zip", - "https://github.com/bazelbuild/rules_go/releases/download/v0.50.1/rules_go-v0.39.0.zip", - ], -) - -http_archive( - name = "bazel_gazelle", - sha256 = "8ad77552825b078a10ad960bec6ef77d2ff8ec70faef2fd038db713f410f5d87", - urls = [ - "https://mirror.bazel.build/github.com/bazelbuild/bazel-gazelle/releases/download/v0.38.0/bazel-gazelle-v0.38.0.tar.gz", - "https://github.com/bazelbuild/bazel-gazelle/releases/download/v0.38.0/bazel-gazelle-v0.38.0.tar.gz", - ], -) - -load("@io_bazel_rules_go//go:deps.bzl", "go_register_toolchains", "go_rules_dependencies") -load("@bazel_gazelle//:deps.bzl", "gazelle_dependencies") -load("//:deps.bzl", "go_dependencies") - -# gazelle:repository_macro deps.bzl%go_dependencies -go_dependencies() - -go_rules_dependencies() - -go_register_toolchains(version = "1.19.3") - -gazelle_dependencies() - -# A newer version should be fine -git_repository( - name = "io_bazel_rules_dotnet", - commit = "0b7ae93fa81b7327a655118da0581db5ebbe0b8d", - remote = "https://github.com/bazelbuild/rules_dotnet", - shallow_since = "1653416975 +0000", -) - -load("@io_bazel_rules_dotnet//dotnet:deps.bzl", "dotnet_repositories") - -dotnet_repositories() - -load( - "@io_bazel_rules_dotnet//dotnet:defs.bzl", - "dotnet_register_toolchains", - "dotnet_repositories_nugets", -) - -dotnet_register_toolchains() - -dotnet_repositories_nugets() - -load("@//internal/repo:rule.bzl", "unreal_engine") - -unreal_engine( - name = "unreal_engine", - commit = "kreempuff-release", - git_repository = "https://github.com/kreempuff/UnrealEngine.git", -) diff --git a/docs/decisions/0002-use-deno-typscript-for-all-scripting-and-bazel-adjacent-work.md b/docs/decisions/0002-use-deno-typscript-for-all-scripting-and-bazel-adjacent-work.md new file mode 100644 index 0000000..4790753 --- /dev/null +++ b/docs/decisions/0002-use-deno-typscript-for-all-scripting-and-bazel-adjacent-work.md @@ -0,0 +1,26 @@ +# 2. Use deno/typscript for all scripting and bazel adjacent work + +Date: 2024-05-24 + +## Status + +Accepted + +## Context + +While Bazel is the main tool being used to build the project, there are many tasks that are not well suited to Bazel. These include: + +- Preprocessing files +- Generating code +- Doing one-off tasks to get things ready for Bazel + +I started by using Golang as a way to not need to have external dependencies, but it's not a great language for scripting. I started using deno since it supports TypeScript and has a mechanism for importing modules from the web without needing to set up a package manager. + +## Decision + +For everything that can't be done with Bazel, use deno/TypeScript. + +## Consequences + +- Deno would need to be installed at some point during the build process +- This will cause a split in where to put certain logic but I'm hoping defaulting to Bazel will be enough to make it clear where to put things diff --git a/internal/repo/rule.bzl b/internal/repo/rule.bzl index 6a71191..854827b 100644 --- a/internal/repo/rule.bzl +++ b/internal/repo/rule.bzl @@ -1,10 +1,10 @@ def _unreal_engine_impl(repo_ctx): repo_ctx.file("WORKSPACE", "") repo_ctx.file("BUILD", """""") + exec_result = repo_ctx.execute(["git", "clone", repo_ctx.attr.git_repository, "--depth", "1", "--branch", repo_ctx.attr.commit, "UnrealEngine"], quiet = False) if exec_result.return_code != 0: - fail("Failed to clone Unreal Engine") - repo_ctx.file("UnrealEngine/BUILD", """exports_files(["Setup.sh"])""") + fail("Failed to clone Unreal Engine: " + exec_result.stdout + exec_result.stderr) version = "v1.30.1" arch = "" @@ -29,7 +29,8 @@ def _unreal_engine_impl(repo_ctx): repo_ctx.execute(["chmod", "+x", "tools/deno/deno"]) repo_ctx.execute(["tools/deno/deno", "run", "--allow-read", "--allow-write", repo_ctx.path(repo_ctx.attr._parse_xml_script), "UnrealEngine/Engine/Build/Commit.gitdeps.xml", "Commit.gitdeps.json"]) -# repo_ctx.execute(["tools/deno/deno", "run", "--allow-read", "--allow-write", "--allow-run", repo_ctx.attr._parse_xml_script.path, "UnrealEngine/Engine/Build/Commit.gitdeps.xml", "Commit.gitdeps.json"]) + # Create build file + repo_ctx.file("UnrealEngine/BUILD", """exports_files(["Setup.sh"])""") unreal_engine = repository_rule( implementation = _unreal_engine_impl, diff --git a/parse-xml-cli.ts b/parse-xml-cli.ts index 5ff5d91..4184199 100644 --- a/parse-xml-cli.ts +++ b/parse-xml-cli.ts @@ -3,14 +3,30 @@ import {parseString} from "npm:xml2js"; const decoder = new TextDecoder("utf-8"); const data = decoder.decode(await Deno.readFile(Deno.args[0])); +/** + * { + * "downloadUrl": "", + * "id": "", + * } + */ parseString(data, (err, result) => { if (err) { console.error(err); return; } + const baseUrl = result["DependencyManifest"]["$"]["BaseUrl"]; + + const packs = result["DependencyManifest"]["Packs"][0]["Pack"].reduce((shaMap, pack) => { + shaMap[pack["$"]["Hash"]] = { + downloadUrl: `${baseUrl}/${pack["$"]["RemotePath"]}/${pack["$"]["Hash"]}`, + id: pack["$"]["Hash"] + }; + return shaMap; + }, {}) try { - Deno.writeTextFileSync(Deno.args[1], JSON.stringify(result, null, 4)); + // Deno.writeTextFileSync(Deno.args[1], JSON.stringify(result, null, 4)); + Deno.writeTextFileSync(Deno.args[1], JSON.stringify(packs, null)); } catch (writeErr) { console.error(writeErr); }