diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml index aed0cc5..7ffca34 100644 --- a/.github/workflows/ci.yml +++ b/.github/workflows/ci.yml @@ -29,6 +29,8 @@ jobs: USE_BAZEL_VERSION: "7.x" steps: - uses: actions/checkout@v2 + - name: tests + run: bazel test //test:all - name: workspace working-directory: examples/workspace run: bazel test //:all @@ -51,7 +53,7 @@ jobs: steps: - uses: actions/checkout@v2 - name: BUILD - run: bazel --output_user_root=C:/bzl build //... + run: bazel --output_user_root=C:/bzl test //test:all remote-execution: name: Bazel Remote Execution diff --git a/MODULE.bazel b/MODULE.bazel index 6847e7d..fd1da6f 100644 --- a/MODULE.bazel +++ b/MODULE.bazel @@ -2,38 +2,35 @@ module( name = "toolchains_arm_gnu", - compatibility_level = 1, version = "1.0.0", + compatibility_level = 1, ) bazel_dep(name = "platforms", version = "0.0.8") bazel_dep(name = "rules_cc", version = "0.0.9") # DEV ONLY (not needed for release) -bazel_dep(name = "aspect_bazel_lib", dev_dependency = True, version = "2.0.0") -bazel_dep(name = "bazel_skylib", dev_dependency = True, version = "1.5.0") +bazel_dep(name = "aspect_bazel_lib", version = "2.0.0", dev_dependency = True) +bazel_dep(name = "bazel_skylib", version = "1.5.0", dev_dependency = True) arm_toolchain = use_extension( "@toolchains_arm_gnu//:extensions.bzl", "arm_toolchain", dev_dependency = True, ) - arm_toolchain.arm_none_eabi() - use_repo(arm_toolchain, "arm_none_eabi") - arm_toolchain.arm_none_linux_gnueabihf() - use_repo(arm_toolchain, "arm_none_linux_gnueabihf") - arm_toolchain.aarch64_none_elf() - use_repo(arm_toolchain, "aarch64_none_elf") +arm_toolchain.aarch64_none_linux_gnu() +use_repo(arm_toolchain, "aarch64_none_linux_gnu") register_toolchains( "//test/toolchains:all", "@aarch64_none_elf//toolchain:all", + "@aarch64_none_linux_gnu//toolchain:all", "@arm_none_eabi//toolchain:all", "@arm_none_linux_gnueabihf//toolchain:all", dev_dependency = True, diff --git a/MODULE.bazel.lock b/MODULE.bazel.lock index d43b249..23e59d3 100644 --- a/MODULE.bazel.lock +++ b/MODULE.bazel.lock @@ -1,6 +1,6 @@ { "lockFileVersion": 3, - "moduleFileHash": "4a8c797fe907d0f4181bbea223642253c28a0bf9dd75b92ba07eaac54060ec17", + "moduleFileHash": "50804b6b325150c2e40e5294c534f39d2b773ffd9f789de82e7fdfd6fd60e184", "flags": { "cmdRegistries": [ "https://bcr.bazel.build/" @@ -25,6 +25,7 @@ "toolchainsToRegister": [ "//test/toolchains:all", "@aarch64_none_elf//toolchain:all", + "@aarch64_none_linux_gnu//toolchain:all", "@arm_none_eabi//toolchain:all", "@arm_none_linux_gnueabihf//toolchain:all" ], @@ -41,12 +42,14 @@ "imports": { "arm_none_eabi": "arm_none_eabi", "arm_none_linux_gnueabihf": "arm_none_linux_gnueabihf", - "aarch64_none_elf": "aarch64_none_elf" + "aarch64_none_elf": "aarch64_none_elf", + "aarch64_none_linux_gnu": "aarch64_none_linux_gnu" }, "devImports": [ "arm_none_eabi", "arm_none_linux_gnueabihf", - "aarch64_none_elf" + "aarch64_none_elf", + "aarch64_none_linux_gnu" ], "tags": [ { @@ -55,7 +58,7 @@ "devDependency": true, "location": { "file": "@@//:MODULE.bazel", - "line": 22, + "line": 21, "column": 28 } }, @@ -65,7 +68,7 @@ "devDependency": true, "location": { "file": "@@//:MODULE.bazel", - "line": 26, + "line": 23, "column": 39 } }, @@ -75,9 +78,19 @@ "devDependency": true, "location": { "file": "@@//:MODULE.bazel", - "line": 30, + "line": 25, "column": 31 } + }, + { + "tagName": "aarch64_none_linux_gnu", + "attributeValues": {}, + "devDependency": true, + "location": { + "file": "@@//:MODULE.bazel", + "line": 27, + "column": 37 + } } ], "hasDevUseExtension": true, @@ -856,7 +869,7 @@ "moduleExtensions": { "//:extensions.bzl%arm_toolchain": { "general": { - "bzlTransitiveDigest": "ADefdyKBxtMPa3FgB17+eZw31Y9l/FUd8YVRxOOqgr8=", + "bzlTransitiveDigest": "3FLQvbbwHCY3+2SJfn8bf0iLlPvqSsI//FzKTzYdWOg=", "accumulatedFileDigests": {}, "envVariables": {}, "generatedRepoSpecs": { @@ -959,6 +972,25 @@ ] } }, + "aarch64_none_linux_gnu_linux_x86_64": { + "bzlFile": "@@//:deps.bzl", + "ruleClassName": "arm_gnu_cross_hosted_platform_specific_repo", + "attributes": { + "toolchain_prefix": "aarch64-none-linux-gnu", + "version": "13.2.1", + "name": "_main~arm_toolchain~aarch64_none_linux_gnu_linux_x86_64", + "sha256": "12fcdf13a7430655229b20438a49e8566e26551ba08759922cdaf4695b0d4e23", + "strip_prefix": "arm-gnu-toolchain-13.2.Rel1-x86_64-aarch64-none-linux-gnu", + "url": "https://developer.arm.com/-/media/Files/downloads/gnu/13.2.rel1/binrel/arm-gnu-toolchain-13.2.rel1-x86_64-aarch64-none-linux-gnu.tar.xz?rev=22c39fc25e5541818967b4ff5a09ef3e&hash=B9FEDC2947EB21151985C2DC534ECCEC", + "patches": [ + "@@//toolchain:patches/0001-Resolve-libc-relative-to-sysroot-aarch64_none_linux_gnu.patch" + ], + "exec_compatible_with": [ + "@platforms//os:linux", + "@platforms//cpu:x86_64" + ] + } + }, "aarch64_none_elf_linux_aarch64": { "bzlFile": "@@//:deps.bzl", "ruleClassName": "arm_gnu_cross_hosted_platform_specific_repo", @@ -975,6 +1007,25 @@ ] } }, + "aarch64_none_linux_gnu_windows_x86_64": { + "bzlFile": "@@//:deps.bzl", + "ruleClassName": "arm_gnu_cross_hosted_platform_specific_repo", + "attributes": { + "toolchain_prefix": "aarch64-none-linux-gnu", + "version": "13.2.1", + "name": "_main~arm_toolchain~aarch64_none_linux_gnu_windows_x86_64", + "sha256": "ccca7e520adbc5deb36d53a2b373e28a0c7e21107c487d4f5fd9cc8e0dbf6a11", + "strip_prefix": "arm-gnu-toolchain-13.2.Rel1-mingw-w64-i686-aarch64-none-linux-gnu", + "url": "https://developer.arm.com/-/media/Files/downloads/gnu/13.2.rel1/binrel/arm-gnu-toolchain-13.2.rel1-mingw-w64-i686-aarch64-none-linux-gnu.zip?rev=861fed530201460f8f58b10dca7bd431&hash=A040842727683903E8646B42A96A8B98", + "patches": [ + "@@//toolchain:patches/0001-Resolve-libc-relative-to-sysroot-aarch64_none_linux_gnu.patch" + ], + "exec_compatible_with": [ + "@platforms//os:windows", + "@platforms//cpu:x86_64" + ] + } + }, "arm_none_eabi_windows_x86_64": { "bzlFile": "@@//:deps.bzl", "ruleClassName": "arm_gnu_cross_hosted_platform_specific_repo", @@ -1093,6 +1144,26 @@ ] } }, + "aarch64_none_linux_gnu": { + "bzlFile": "@@//:deps.bzl", + "ruleClassName": "toolchains_arm_gnu_repo", + "attributes": { + "name": "_main~arm_toolchain~aarch64_none_linux_gnu", + "toolchain_name": "aarch64_none_linux_gnu", + "toolchain_prefix": "aarch64-none-linux-gnu", + "version": "13.2.1", + "hosts": { + "aarch64_none_linux_gnu_linux_x86_64": [ + "@platforms//os:linux", + "@platforms//cpu:x86_64" + ], + "aarch64_none_linux_gnu_windows_x86_64": [ + "@platforms//os:windows", + "@platforms//cpu:x86_64" + ] + } + } + }, "arm_none_eabi": { "bzlFile": "@@//:deps.bzl", "ruleClassName": "toolchains_arm_gnu_repo", diff --git a/deps.bzl b/deps.bzl index bbf423f..8ac0dbf 100644 --- a/deps.bzl +++ b/deps.bzl @@ -1,9 +1,10 @@ """deps.bzl""" +load("@toolchains_arm_gnu//toolchain:toolchain.bzl", "tools") +load("@toolchains_arm_gnu//toolchain/archives:aarch64_none_elf.bzl", "AARCH64_NONE_ELF") +load("@toolchains_arm_gnu//toolchain/archives:aarch64_none_linux_gnu.bzl", "AARCH64_NONE_LINUX_GNU") load("@toolchains_arm_gnu//toolchain/archives:arm_none_eabi.bzl", "ARM_NONE_EABI") load("@toolchains_arm_gnu//toolchain/archives:arm_none_linux_gnueabihf.bzl", "ARM_NONE_LINUX_GNUEABIHF") -load("@toolchains_arm_gnu//toolchain/archives:aarch64_none_elf.bzl", "AARCH64_NONE_ELF") -load("@toolchains_arm_gnu//toolchain:toolchain.bzl", "tools") def _arm_gnu_cross_hosted_platform_specific_repo_impl(repository_ctx): """Defines a host-specific repository for the ARM GNU toolchain.""" @@ -148,7 +149,7 @@ def arm_none_linux_gnueabihf_deps(version = "13.2.1", archives = ARM_NONE_LINUX_ ) def aarch64_none_elf_deps(version = "13.2.1-1.1", archives = AARCH64_NONE_ELF): - """Workspace dependencies for the arm linux gcc toolchain + """Workspace dependencies for the arm gcc toolchain Args: version: The version of the toolchain to use. If None, the latest version is used. @@ -160,3 +161,17 @@ def aarch64_none_elf_deps(version = "13.2.1-1.1", archives = AARCH64_NONE_ELF): version, archives, ) + +def aarch64_none_linux_gnu_deps(version = "13.2.1", archives = AARCH64_NONE_LINUX_GNU): + """Workspace dependencies for the arm linux gcc toolchain + + Args: + version: The version of the toolchain to use. If None, the latest version is used. + archives: A dictionary of the version to archive attributes. + """ + toolchains_arm_gnu_deps( + "aarch64_none_linux_gnu", + "aarch64-none-linux-gnu", + version, + archives, + ) diff --git a/extensions.bzl b/extensions.bzl index dfb51e1..f5b004f 100644 --- a/extensions.bzl +++ b/extensions.bzl @@ -1,14 +1,25 @@ """Module extension for toolchains""" -load("@toolchains_arm_gnu//toolchain/archives:arm_none_eabi.bzl", "ARM_NONE_EABI") -load("@toolchains_arm_gnu//toolchain/archives:arm_none_linux_gnueabihf.bzl", "ARM_NONE_LINUX_GNUEABIHF") -load("@toolchains_arm_gnu//toolchain/archives:aarch64_none_elf.bzl", "AARCH64_NONE_ELF") load( "@toolchains_arm_gnu//:deps.bzl", "aarch64_none_elf_deps", + "aarch64_none_linux_gnu_deps", "arm_none_eabi_deps", "arm_none_linux_gnueabihf_deps", ) +load("@toolchains_arm_gnu//toolchain/archives:aarch64_none_elf.bzl", "AARCH64_NONE_ELF") +load( + "@toolchains_arm_gnu//toolchain/archives:aarch64_none_linux_gnu.bzl", + "AARCH64_NONE_LINUX_GNU", +) +load( + "@toolchains_arm_gnu//toolchain/archives:arm_none_eabi.bzl", + "ARM_NONE_EABI", +) +load( + "@toolchains_arm_gnu//toolchain/archives:arm_none_linux_gnueabihf.bzl", + "ARM_NONE_LINUX_GNUEABIHF", +) def _semver(version): """Parse a semantic version string into a list of integers.""" @@ -75,6 +86,10 @@ def _arm_toolchain_impl(ctx): tag = lambda mod: mod.tags.aarch64_none_elf, deps = aarch64_none_elf_deps, ), + _module_toolchain( + tag = lambda mod: mod.tags.aarch64_none_linux_gnu, + deps = aarch64_none_linux_gnu_deps, + ), ] for toolchain in available_toolchains: @@ -95,5 +110,8 @@ arm_toolchain = module_extension( "aarch64_none_elf": tag_class(attrs = { "version": attr.string(default = _max_version(AARCH64_NONE_ELF.keys())), }), + "aarch64_none_linux_gnu": tag_class(attrs = { + "version": attr.string(default = _max_version(AARCH64_NONE_LINUX_GNU.keys())), + }), }, ) diff --git a/test/BUILD b/test/BUILD index 2c8bd96..5177ec6 100644 --- a/test/BUILD +++ b/test/BUILD @@ -5,6 +5,11 @@ build_test( targets = ["//test/aarch64-none-elf:hex"], ) +build_test( + name = "aarch64_none_linux_gnu", + targets = ["//test/aarch64-none-linux-gnu:hex"], +) + build_test( name = "arm_none_eabi", targets = ["//test/arm-none-eabi:hex"], diff --git a/test/aarch64-none-linux-gnu/BUILD b/test/aarch64-none-linux-gnu/BUILD new file mode 100644 index 0000000..8e65c8e --- /dev/null +++ b/test/aarch64-none-linux-gnu/BUILD @@ -0,0 +1,59 @@ +# project/BUILD.bazel + +load("@aspect_bazel_lib//lib:transitions.bzl", "platform_transition_filegroup") +load("@rules_cc//cc:defs.bzl", "cc_binary", "cc_library") + +platform( + name = "aarch64_none_linux_gnu", + constraint_values = [ + "@platforms//cpu:aarch64", + "@platforms//os:linux", + ], +) + +cc_library( + name = "arm_library", + srcs = ["library.cpp"], + hdrs = ["library.h"], + copts = [ + "-mcpu=cortex-a53", + ], + includes = ["includes"], + target_compatible_with = [ + "@platforms//cpu:aarch64", + "@platforms//os:linux", + ], +) + +cc_binary( + name = "arm_elf", + srcs = ["main.cpp"], + copts = [ + "-mcpu=cortex-a53", + ], + linkopts = [ + "-nostartfiles", + "-Wl,--entry,main", + ], + deps = [":arm_library"], +) + +platform_transition_filegroup( + name = "elf", + srcs = [":arm_elf"], + target_compatible_with = select({ + "@platforms//os:linux": ["@platforms//cpu:x86_64"], # linux x86 (no arm) + "@platforms//os:windows": ["@platforms//cpu:x86_64"], # windows + "//conditions:default": ["@platforms//:incompatible"], + }), + target_platform = ":aarch64_none_linux_gnu", +) + +genrule( + name = "hex", + srcs = [":elf"], + outs = ["mock.hex"], + cmd = "$(execpath @aarch64_none_linux_gnu//:objcopy) -O ihex $< $@", + tools = ["@aarch64_none_linux_gnu//:objcopy"], + visibility = ["//visibility:public"], +) diff --git a/test/aarch64-none-linux-gnu/library.cpp b/test/aarch64-none-linux-gnu/library.cpp new file mode 100644 index 0000000..0f153b3 --- /dev/null +++ b/test/aarch64-none-linux-gnu/library.cpp @@ -0,0 +1,15 @@ +#include "library.h" +#include + +uint16_t baz(uint8_t a) { return a * 2; } + +uint32_t foo() { + static constexpr int k = 5; + return baz(k); +} + +uint16_t foobaz() { + std::vector vec(10); + vec.push_back(1); + return vec[0]; +} diff --git a/test/aarch64-none-linux-gnu/library.h b/test/aarch64-none-linux-gnu/library.h new file mode 100644 index 0000000..298320e --- /dev/null +++ b/test/aarch64-none-linux-gnu/library.h @@ -0,0 +1,5 @@ +#include + +uint16_t baz(uint8_t var); +uint32_t foo(void); +uint16_t foobaz(); diff --git a/test/aarch64-none-linux-gnu/main.cpp b/test/aarch64-none-linux-gnu/main.cpp new file mode 100644 index 0000000..b61259d --- /dev/null +++ b/test/aarch64-none-linux-gnu/main.cpp @@ -0,0 +1,5 @@ +// The simplest possible main function + +int main(){ + return 0; +} \ No newline at end of file diff --git a/test/arm-none-linux-gnueabihf/BUILD b/test/arm-none-linux-gnueabihf/BUILD index 128131e..9e2921d 100644 --- a/test/arm-none-linux-gnueabihf/BUILD +++ b/test/arm-none-linux-gnueabihf/BUILD @@ -3,11 +3,6 @@ load("@aspect_bazel_lib//lib:transitions.bzl", "platform_transition_filegroup") load("@rules_cc//cc:defs.bzl", "cc_binary", "cc_library") -config_setting( - name = "macos", # no compiler on macos (yet) - constraint_values = ["@platforms//os:macos"], -) - platform( name = "arm_linux_gnueabihf", constraint_values = [ @@ -45,7 +40,7 @@ platform_transition_filegroup( name = "elf", srcs = [":arm_elf"], target_compatible_with = select({ - ":macos": ["@platforms//:incompatible"], + "@platforms//os:macos": ["@platforms//:incompatible"], # no compiler on macos (yet) "//conditions:default": [], }), target_platform = ":arm_linux_gnueabihf", diff --git a/toolchain/archives/aarch64_none_linux_gnu.bzl b/toolchain/archives/aarch64_none_linux_gnu.bzl new file mode 100644 index 0000000..d78abfe --- /dev/null +++ b/toolchain/archives/aarch64_none_linux_gnu.bzl @@ -0,0 +1,28 @@ +"""aarch64-none-linux-gnu toolchiain archives""" + +AARCH64_NONE_LINUX_GNU = { + "13.2.1": [ + { + "name": "aarch64_none_linux_gnu_linux_x86_64", + "sha256": "12fcdf13a7430655229b20438a49e8566e26551ba08759922cdaf4695b0d4e23", + "strip_prefix": "arm-gnu-toolchain-13.2.Rel1-x86_64-aarch64-none-linux-gnu", + "url": "https://developer.arm.com/-/media/Files/downloads/gnu/13.2.rel1/binrel/arm-gnu-toolchain-13.2.rel1-x86_64-aarch64-none-linux-gnu.tar.xz?rev=22c39fc25e5541818967b4ff5a09ef3e&hash=B9FEDC2947EB21151985C2DC534ECCEC", + "patches": ["@toolchains_arm_gnu//toolchain:patches/0001-Resolve-libc-relative-to-sysroot-aarch64_none_linux_gnu.patch"], + "exec_compatible_with": [ + "@platforms//os:linux", + "@platforms//cpu:x86_64", + ], + }, + { + "name": "aarch64_none_linux_gnu_windows_x86_64", + "sha256": "ccca7e520adbc5deb36d53a2b373e28a0c7e21107c487d4f5fd9cc8e0dbf6a11", + "strip_prefix": "arm-gnu-toolchain-13.2.Rel1-mingw-w64-i686-aarch64-none-linux-gnu", + "url": "https://developer.arm.com/-/media/Files/downloads/gnu/13.2.rel1/binrel/arm-gnu-toolchain-13.2.rel1-mingw-w64-i686-aarch64-none-linux-gnu.zip?rev=861fed530201460f8f58b10dca7bd431&hash=A040842727683903E8646B42A96A8B98", + "patches": ["@toolchains_arm_gnu//toolchain:patches/0001-Resolve-libc-relative-to-sysroot-aarch64_none_linux_gnu.patch"], + "exec_compatible_with": [ + "@platforms//os:windows", + "@platforms//cpu:x86_64", + ], + }, + ], +} diff --git a/toolchain/patches/0001-Resolve-libc-relative-to-sysroot-aarch64_none_linux_gnu.patch b/toolchain/patches/0001-Resolve-libc-relative-to-sysroot-aarch64_none_linux_gnu.patch new file mode 100644 index 0000000..f78a419 --- /dev/null +++ b/toolchain/patches/0001-Resolve-libc-relative-to-sysroot-aarch64_none_linux_gnu.patch @@ -0,0 +1,16 @@ +Resolve libc relative to sysroot + +In the arm linux toolchain, libc.so is simply a link script that +points to the real libc.so shared library. However, the path of the +actual shared object is specified as an absolute path, which means +it is not resolved relative to the toolchain prefix or sysroot +directories. Adding '=' here causes ld to search for these files +relative to the library search directories. +--- a/aarch64-none-linux-gnu/libc/usr/lib64/libc.so ++++ b/aarch64-none-linux-gnu/libc/usr/lib64/libc.so +@@ -2,4 +2,4 @@ + Use the shared library, but some functions are only in + the static library, so try that secondarily. */ + OUTPUT_FORMAT(elf64-littleaarch64) +-GROUP ( /lib64/libc.so.6 /usr/lib64/libc_nonshared.a AS_NEEDED ( /lib/ld-linux-aarch64.so.1 ) ) ++GROUP ( =/lib64/libc.so.6 =/usr/lib64/libc_nonshared.a AS_NEEDED ( =/lib/ld-linux-aarch64.so.1 ) ) diff --git a/toolchain/toolchain.bzl b/toolchain/toolchain.bzl index 1f5d97a..76e6ac1 100644 --- a/toolchain/toolchain.bzl +++ b/toolchain/toolchain.bzl @@ -2,8 +2,8 @@ This module provides functions to register an arm-none-eabi toolchain """ -load("@toolchains_arm_gnu//toolchain:config.bzl", "cc_arm_gnu_toolchain_config") load("@rules_cc//cc:defs.bzl", "cc_toolchain") +load("@toolchains_arm_gnu//toolchain:config.bzl", "cc_arm_gnu_toolchain_config") tools = [ "as", @@ -38,6 +38,9 @@ target_constraints = { "aarch64-none-elf": { "arm": ["@platforms//os:none", "@platforms//cpu:aarch64"], }, + "aarch64-none-linux-gnu": { + "aarch64": ["@platforms//os:linux", "@platforms//cpu:aarch64"], + }, } hosts = { @@ -61,6 +64,10 @@ hosts = { "linux_aarch64": ["@platforms//os:linux", "@platforms//cpu:arm64"], "windows_x86_64": ["@platforms//os:windows", "@platforms//cpu:x86_64"], }, + "aarch64-none-linux-gnu": { + "linux_x86_64": ["@platforms//os:linux", "@platforms//cpu:x86_64"], + "windows_x86_64": ["@platforms//os:windows", "@platforms//cpu:x86_64"], + }, } def _arm_gnu_toolchain( @@ -180,3 +187,28 @@ def aarch64_none_elf_toolchain(name, version, **kwargs): abi_version = "elf", **kwargs ) + +def aarch64_none_linux_gnu_toolchain( + name, + version = "13.2.1", + linkopts = [], + **kwargs): + """ + Create an aarch64-none-linux-gnu toolchain with the given configuration. + + Args: + name: The name of the toolchain. + version: The version of the gcc toolchain. + linkopts: Additional linker options. + **kwargs: Additional keyword arguments. + """ + _arm_gnu_toolchain( + name, + toolchain = "aarch64_none_linux_gnu", + toolchain_prefix = "aarch64-none-linux-gnu", + version = version, + abi_version = "gnu", + linkopts = ["-lc", "-lstdc++"] + linkopts, + include_std = True, + **kwargs + )