2
0
Fork 0
mirror of https://github.com/bazel-contrib/rules_foreign_cc synced 2024-11-29 12:33:51 +00:00
rules_foreign_cc/toolchains/built_toolchains.bzl
jheaff1 3cbd0a9938
Add meson support (#986)
* Add meson support

* Modify zlib to be detected via pkgconfig in dependent rules

* Modify zlib and expat to be linked to shared libs in dependent rules

* Add example usage of Meson rule

This commit adds the glib library to the "examples" build. glib requires
pcre2, so pcre and libgit2 (a dependent of pcre) have been
updated/modified

* Add example usage of meson_with_requirements macro

This commit adds mesa to the "examples" build.

This commit also changes the "examples" build to use the hermetic python
toolchain provided by rules_foreign_cc. As such, the python toolchain
built by rules_foreign_cc is no longer used, as it cannot be used in
workspace rules, .e.g pip_parse(). As such, the python2 build has been
removed from the examples as python2 is end-of-life.

Until Bazel 4.2.0, the built-in android toolchain required Python 2. As
such the minimum supported version has been upversioned to 4.2.0.

Note that the BAZEL_VC env var was removed from CI as mesa requires MSVC
2019.

* Set visibility for each target in foreign_cc_rule_variant

* Apply formatting changes

* Get meson examples working with bzlmod

Note that a newer version of pkgconfig than that installed in ubuntu 20
must be used to build libxau, therefore the built_pkgconfig_toolchain is
now registered
2023-06-09 11:29:12 +01:00

277 lines
8.9 KiB
Python

"""
Defines repositories and register toolchains for versions of the tools built
from source
"""
load("@bazel_tools//tools/build_defs/repo:http.bzl", "http_archive")
load("@bazel_tools//tools/build_defs/repo:utils.bzl", "maybe")
load("@rules_foreign_cc//toolchains:cmake_versions.bzl", _CMAKE_SRCS = "CMAKE_SRCS")
_ALL_CONTENT = """\
filegroup(
name = "all_srcs",
srcs = glob(["**"]),
visibility = ["//visibility:public"],
)
"""
_MESON_BUILD_FILE_CONTENT = """\
exports_files(["meson.py"])
filegroup(
name = "runtime",
srcs = glob(["mesonbuild/**"]),
visibility = ["//visibility:public"],
)
"""
# buildifier: disable=unnamed-macro
def built_toolchains(cmake_version, make_version, ninja_version, meson_version, pkgconfig_version, register_toolchains, register_built_pkgconfig_toolchain):
"""
Register toolchains for built tools that will be built from source
Args:
cmake_version: The CMake version to build
make_version: The Make version to build
ninja_version: The Ninja version to build
meson_version: The Meson version to build
pkgconfig_version: The pkg-config version to build
register_toolchains: If true, registers the toolchains via native.register_toolchains. Used by bzlmod
register_built_pkgconfig_toolchain: If true, the built pkgconfig toolchain will be registered.
"""
_cmake_toolchain(cmake_version, register_toolchains)
_make_toolchain(make_version, register_toolchains)
_ninja_toolchain(ninja_version, register_toolchains)
_meson_toolchain(meson_version, register_toolchains)
if register_built_pkgconfig_toolchain:
_pkgconfig_toolchain(pkgconfig_version, register_toolchains)
def _cmake_toolchain(version, register_toolchains):
if register_toolchains:
native.register_toolchains(
"@rules_foreign_cc//toolchains:built_cmake_toolchain",
)
if _CMAKE_SRCS.get(version):
cmake_meta = _CMAKE_SRCS[version]
urls = cmake_meta[0]
prefix = cmake_meta[1]
sha256 = cmake_meta[2]
maybe(
http_archive,
name = "cmake_src",
build_file_content = _ALL_CONTENT,
sha256 = sha256,
strip_prefix = prefix,
urls = urls,
)
return
fail("Unsupported cmake version: " + str(version))
def _make_toolchain(version, register_toolchains):
if register_toolchains:
native.register_toolchains(
"@rules_foreign_cc//toolchains:built_make_toolchain",
)
if version == "4.4":
maybe(
http_archive,
name = "gnumake_src",
build_file_content = _ALL_CONTENT,
sha256 = "581f4d4e872da74b3941c874215898a7d35802f03732bdccee1d4a7979105d18",
strip_prefix = "make-4.4",
urls = [
"https://mirror.bazel.build/ftpmirror.gnu.org/gnu/make/make-4.4.tar.gz",
"http://ftpmirror.gnu.org/gnu/make/make-4.4.tar.gz",
],
)
return
if version == "4.3":
maybe(
http_archive,
name = "gnumake_src",
build_file_content = _ALL_CONTENT,
patches = [Label("//toolchains:make-reproducible-bootstrap.patch")],
sha256 = "e05fdde47c5f7ca45cb697e973894ff4f5d79e13b750ed57d7b66d8defc78e19",
strip_prefix = "make-4.3",
urls = [
"https://mirror.bazel.build/ftpmirror.gnu.org/gnu/make/make-4.3.tar.gz",
"http://ftpmirror.gnu.org/gnu/make/make-4.3.tar.gz",
],
)
return
fail("Unsupported make version: " + str(version))
def _ninja_toolchain(version, register_toolchains):
if register_toolchains:
native.register_toolchains(
"@rules_foreign_cc//toolchains:built_ninja_toolchain",
)
if version == "1.11.1":
maybe(
http_archive,
name = "ninja_build_src",
build_file_content = _ALL_CONTENT,
sha256 = "31747ae633213f1eda3842686f83c2aa1412e0f5691d1c14dbbcc67fe7400cea",
strip_prefix = "ninja-1.11.1",
urls = [
"https://github.com/ninja-build/ninja/archive/v1.11.1.tar.gz",
],
)
return
if version == "1.11.0":
maybe(
http_archive,
name = "ninja_build_src",
build_file_content = _ALL_CONTENT,
sha256 = "3c6ba2e66400fe3f1ae83deb4b235faf3137ec20bd5b08c29bfc368db143e4c6",
strip_prefix = "ninja-1.11.0",
urls = [
"https://github.com/ninja-build/ninja/archive/v1.11.0.tar.gz",
],
)
return
if version == "1.10.2":
maybe(
http_archive,
name = "ninja_build_src",
build_file_content = _ALL_CONTENT,
sha256 = "ce35865411f0490368a8fc383f29071de6690cbadc27704734978221f25e2bed",
strip_prefix = "ninja-1.10.2",
urls = [
"https://github.com/ninja-build/ninja/archive/v1.10.2.tar.gz",
],
)
return
fail("Unsupported ninja version: " + str(version))
def _meson_toolchain(version, register_toolchains):
if register_toolchains:
native.register_toolchains(
"@rules_foreign_cc//toolchains:built_meson_toolchain",
)
if version == "0.63.0":
maybe(
http_archive,
name = "meson_src",
build_file_content = _MESON_BUILD_FILE_CONTENT,
sha256 = "3b51d451744c2bc71838524ec8d96cd4f8c4793d5b8d5d0d0a9c8a4f7c94cd6f",
strip_prefix = "meson-0.63.0",
url = "https://github.com/mesonbuild/meson/releases/download/0.63.0/meson-0.63.0.tar.gz",
)
return
fail("Unsupported meson version: " + str(version))
def _pkgconfig_toolchain(version, register_toolchains):
if register_toolchains:
native.register_toolchains(
"@rules_foreign_cc//toolchains:built_pkgconfig_toolchain",
)
maybe(
http_archive,
name = "glib_dev",
build_file_content = '''
load("@rules_cc//cc:defs.bzl", "cc_library")
cc_import(
name = "glib_dev",
hdrs = glob(["include/**"]),
shared_library = "@glib_runtime//:bin/libglib-2.0-0.dll",
visibility = ["//visibility:public"],
)
''',
sha256 = "bdf18506df304d38be98a4b3f18055b8b8cca81beabecad0eece6ce95319c369",
urls = [
"https://download.gnome.org/binaries/win64/glib/2.26/glib-dev_2.26.1-1_win64.zip",
],
)
maybe(
http_archive,
name = "glib_src",
build_file_content = '''
cc_import(
name = "msvc_hdr",
hdrs = ["msvc_recommended_pragmas.h"],
visibility = ["//visibility:public"],
)
''',
sha256 = "bc96f63112823b7d6c9f06572d2ad626ddac7eb452c04d762592197f6e07898e",
strip_prefix = "glib-2.26.1",
urls = [
"https://download.gnome.org/sources/glib/2.26/glib-2.26.1.tar.gz",
],
)
maybe(
http_archive,
name = "glib_runtime",
build_file_content = '''
exports_files(
[
"bin/libgio-2.0-0.dll",
"bin/libglib-2.0-0.dll",
"bin/libgmodule-2.0-0.dll",
"bin/libgobject-2.0-0.dll",
"bin/libgthread-2.0-0.dll",
],
visibility = ["//visibility:public"],
)
''',
sha256 = "88d857087e86f16a9be651ee7021880b3f7ba050d34a1ed9f06113b8799cb973",
urls = [
"https://download.gnome.org/binaries/win64/glib/2.26/glib_2.26.1-1_win64.zip",
],
)
maybe(
http_archive,
name = "gettext_runtime",
build_file_content = '''
cc_import(
name = "gettext_runtime",
shared_library = "bin/libintl-8.dll",
visibility = ["//visibility:public"],
)
''',
sha256 = "1f4269c0e021076d60a54e98da6f978a3195013f6de21674ba0edbc339c5b079",
urls = [
"https://download.gnome.org/binaries/win64/dependencies/gettext-runtime_0.18.1.1-2_win64.zip",
],
)
if version == "0.29.2":
maybe(
http_archive,
name = "pkgconfig_src",
build_file_content = _ALL_CONTENT,
sha256 = "6fc69c01688c9458a57eb9a1664c9aba372ccda420a02bf4429fe610e7e7d591",
strip_prefix = "pkg-config-0.29.2",
# The patch is required as bazel does not provide the VCINSTALLDIR or WINDOWSSDKDIR vars
patches = [
# This patch is required as bazel does not provide the VCINSTALLDIR or WINDOWSSDKDIR vars
Label("//toolchains:pkgconfig-detectenv.patch"),
# This patch is required as rules_foreign_cc runs in MSYS2 on Windows and MSYS2's "mkdir" is used
Label("//toolchains:pkgconfig-makefile-vc.patch"),
],
urls = [
"https://pkgconfig.freedesktop.org/releases/pkg-config-0.29.2.tar.gz",
],
)
return
fail("Unsupported pkgconfig version: " + str(version))