Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Create xacro Bazel module #350

Open
wants to merge 29 commits into
base: ros2
Choose a base branch
from
Open
Show file tree
Hide file tree
Changes from 4 commits
Commits
Show all changes
29 commits
Select commit Hold shift + click to select a range
c4740c1
Initial try at bazelizing xacro
mjcarroll Dec 18, 2024
40ad447
Add bazel test support
mjcarroll Dec 19, 2024
2bc9bc2
Fix test
mjcarroll Dec 19, 2024
f6ee8d1
Add bazel CI workflow
mjcarroll Dec 19, 2024
3aea25b
Run on all PRs
mjcarroll Dec 19, 2024
0b95e2a
Cleanup
rhaschke Dec 20, 2024
71dbbaf
Move most bazel accessory files into bazel/
mjcarroll Dec 20, 2024
f150b54
Merge remote-tracking branch 'origin/mjcarroll/bazel' into mjcarroll/…
mjcarroll Dec 20, 2024
9388e1b
Update test location and drop CI specific bazelrc
mjcarroll Dec 20, 2024
d48c5c6
Remove root bazelrc
mjcarroll Dec 20, 2024
ad38049
Add bazel genrule test
mjcarroll Dec 20, 2024
d9188bc
Add copyright header
mjcarroll Dec 20, 2024
5d04b37
Undo substitution_args change, as these are skipped in bazel now
mjcarroll Dec 20, 2024
56426d1
Move test inputs to subdirectory
mjcarroll Dec 20, 2024
1457734
Buildifier Lint
mjcarroll Dec 20, 2024
6602ced
Trim trailing whitespace
mjcarroll Dec 20, 2024
2348098
Add filegroup rule
mjcarroll Dec 20, 2024
7531667
Address reviewer feedback:
mjcarroll Dec 20, 2024
b3af566
Make python dependency repo name unique.
mjcarroll Dec 20, 2024
a21a02e
Change build dependency to reflect repo rename
mjcarroll Dec 20, 2024
a6d30be
Add support for multiple python versions
mjcarroll Dec 20, 2024
c739c42
Remove concurrency constraint and add comment
mjcarroll Dec 20, 2024
d2e0934
Merge remote-tracking branch 'origin/ros2' into mjcarroll/bazel
mjcarroll Jan 8, 2025
747b833
Remove bazel specific find semantics
mjcarroll Jan 8, 2025
5ae92bb
Remove bazel-specific semantics
mjcarroll Jan 14, 2025
662dfdc
Correctly resolve root_dir
mjcarroll Jan 14, 2025
6495fd4
Update test paths
mjcarroll Jan 14, 2025
b4aa47d
Minimize diff
mjcarroll Jan 14, 2025
4399f2b
Add test for --root-dir argument
mjcarroll Jan 15, 2025
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
Empty file added .bazelrc
Empty file.
1 change: 1 addition & 0 deletions .bazelversion
Original file line number Diff line number Diff line change
@@ -0,0 +1 @@
7.4.1
2 changes: 2 additions & 0 deletions .gitignore
Original file line number Diff line number Diff line change
@@ -1,2 +1,4 @@
*.pyc
build
bazel-*
MODULE.bazel.lock
91 changes: 91 additions & 0 deletions BUILD.bazel
Original file line number Diff line number Diff line change
@@ -0,0 +1,91 @@
load("@rules_python//python:defs.bzl", "py_binary", "py_test", "py_library")
load("@rules_python//python:pip.bzl", "compile_pip_requirements")
load("@bazel_skylib//rules:write_file.bzl", "write_file")
load("@bazel_skylib//:bzl_library.bzl", "bzl_library")
load("@rules_license//rules:license.bzl", "license")

package(
default_applicable_licenses = [":license"],
)

licenses(["notice"])

license(
name = "license",
license_kinds = [
"@rules_license//licenses/spdx:BSD-3-Clause",
],
license_text = "LICENSE",
)

# This rule adds a convenient way to update the requirements file.
compile_pip_requirements(
name = "requirements",
src = "requirements.in",
requirements_txt = "requirements_lock.txt",
)

write_file(
name = "write_xacro_main",
# This is the same as scripts/xacro from upstream, except that we lose the
# unused shebang line and we use a filename that is not subject to import
# path conflicts.
content = ["import xacro; xacro.main()"],
out = "xacro_main.py"
)

py_library(
name = "xacro_lib",
srcs = glob([
"xacro/**/*.py"
], allow_empty = False),
imports = ["."],
visibility = ["//visibility:public"],
deps = [
"@pypi//pyyaml:pkg",
]
)

py_binary(
name = "xacro_main",
srcs = ["xacro_main.py"],
main = "xacro_main.py",
deps = [":xacro_lib"],
)

alias(
name = "xacro",
actual = ":xacro_main",
visibility = ["//visibility:public"],
)

TEST_RESOURCES = glob([
"test/*.xacro",
"test/*.xml",
"test/*.yaml",
"test/subdir/**",
"test/robots/**",
])

filegroup(
name = "test_data",
srcs = TEST_RESOURCES,
data = TEST_RESOURCES,
)

py_test(
name = "test_xacro",
srcs = ["test/test_xacro.py"],
main = "test/test_xacro.py",
data = [":test_data"],
deps = [
":xacro_main",
"@rules_python//python/runfiles",
]
)

bzl_library(
name = "build_defs_bzl",
srcs = ["build_defs.bzl"],
visibility = ["//visibility:public"],
)
21 changes: 21 additions & 0 deletions MODULE.bazel
Original file line number Diff line number Diff line change
@@ -0,0 +1,21 @@
module(
name = "xacro",
version = "2.0.11",
)

bazel_dep(name = "rules_license", version = "1.0.0")
bazel_dep(name = "bazel_skylib", version = "1.7.1")
bazel_dep(name = "rules_python", version = "0.40.0")

python = use_extension("@rules_python//python/extensions:python.bzl", "python")
python.toolchain(
python_version = "3.11",
)

pip = use_extension("@rules_python//python/extensions:pip.bzl", "pip")
pip.parse(
hub_name = "pypi",
python_version = "3.11",
requirements_lock = "//:requirements_lock.txt"
)
use_repo(pip, "pypi")
Empty file added build_defs.bzl
Empty file.
1 change: 1 addition & 0 deletions requirements.in
Original file line number Diff line number Diff line change
@@ -0,0 +1 @@
pyyaml
61 changes: 61 additions & 0 deletions requirements_lock.txt
Original file line number Diff line number Diff line change
@@ -0,0 +1,61 @@
#
# This file is autogenerated by pip-compile with Python 3.11
# by the following command:
#
# bazel run //:requirements.update
#
pyyaml==6.0.2 \
--hash=sha256:01179a4a8559ab5de078078f37e5c1a30d76bb88519906844fd7bdea1b7729ff \
--hash=sha256:0833f8694549e586547b576dcfaba4a6b55b9e96098b36cdc7ebefe667dfed48 \
--hash=sha256:0a9a2848a5b7feac301353437eb7d5957887edbf81d56e903999a75a3d743086 \
--hash=sha256:0b69e4ce7a131fe56b7e4d770c67429700908fc0752af059838b1cfb41960e4e \
--hash=sha256:0ffe8360bab4910ef1b9e87fb812d8bc0a308b0d0eef8c8f44e0254ab3b07133 \
--hash=sha256:11d8f3dd2b9c1207dcaf2ee0bbbfd5991f571186ec9cc78427ba5bd32afae4b5 \
--hash=sha256:17e311b6c678207928d649faa7cb0d7b4c26a0ba73d41e99c4fff6b6c3276484 \
--hash=sha256:1e2120ef853f59c7419231f3bf4e7021f1b936f6ebd222406c3b60212205d2ee \
--hash=sha256:1f71ea527786de97d1a0cc0eacd1defc0985dcf6b3f17bb77dcfc8c34bec4dc5 \
--hash=sha256:23502f431948090f597378482b4812b0caae32c22213aecf3b55325e049a6c68 \
--hash=sha256:24471b829b3bf607e04e88d79542a9d48bb037c2267d7927a874e6c205ca7e9a \
--hash=sha256:29717114e51c84ddfba879543fb232a6ed60086602313ca38cce623c1d62cfbf \
--hash=sha256:2e99c6826ffa974fe6e27cdb5ed0021786b03fc98e5ee3c5bfe1fd5015f42b99 \
--hash=sha256:39693e1f8320ae4f43943590b49779ffb98acb81f788220ea932a6b6c51004d8 \
--hash=sha256:3ad2a3decf9aaba3d29c8f537ac4b243e36bef957511b4766cb0057d32b0be85 \
--hash=sha256:3b1fdb9dc17f5a7677423d508ab4f243a726dea51fa5e70992e59a7411c89d19 \
--hash=sha256:41e4e3953a79407c794916fa277a82531dd93aad34e29c2a514c2c0c5fe971cc \
--hash=sha256:43fa96a3ca0d6b1812e01ced1044a003533c47f6ee8aca31724f78e93ccc089a \
--hash=sha256:50187695423ffe49e2deacb8cd10510bc361faac997de9efef88badc3bb9e2d1 \
--hash=sha256:5ac9328ec4831237bec75defaf839f7d4564be1e6b25ac710bd1a96321cc8317 \
--hash=sha256:5d225db5a45f21e78dd9358e58a98702a0302f2659a3c6cd320564b75b86f47c \
--hash=sha256:6395c297d42274772abc367baaa79683958044e5d3835486c16da75d2a694631 \
--hash=sha256:688ba32a1cffef67fd2e9398a2efebaea461578b0923624778664cc1c914db5d \
--hash=sha256:68ccc6023a3400877818152ad9a1033e3db8625d899c72eacb5a668902e4d652 \
--hash=sha256:70b189594dbe54f75ab3a1acec5f1e3faa7e8cf2f1e08d9b561cb41b845f69d5 \
--hash=sha256:797b4f722ffa07cc8d62053e4cff1486fa6dc094105d13fea7b1de7d8bf71c9e \
--hash=sha256:7c36280e6fb8385e520936c3cb3b8042851904eba0e58d277dca80a5cfed590b \
--hash=sha256:7e7401d0de89a9a855c839bc697c079a4af81cf878373abd7dc625847d25cbd8 \
--hash=sha256:80bab7bfc629882493af4aa31a4cfa43a4c57c83813253626916b8c7ada83476 \
--hash=sha256:82d09873e40955485746739bcb8b4586983670466c23382c19cffecbf1fd8706 \
--hash=sha256:8388ee1976c416731879ac16da0aff3f63b286ffdd57cdeb95f3f2e085687563 \
--hash=sha256:8824b5a04a04a047e72eea5cec3bc266db09e35de6bdfe34c9436ac5ee27d237 \
--hash=sha256:8b9c7197f7cb2738065c481a0461e50ad02f18c78cd75775628afb4d7137fb3b \
--hash=sha256:9056c1ecd25795207ad294bcf39f2db3d845767be0ea6e6a34d856f006006083 \
--hash=sha256:936d68689298c36b53b29f23c6dbb74de12b4ac12ca6cfe0e047bedceea56180 \
--hash=sha256:9b22676e8097e9e22e36d6b7bda33190d0d400f345f23d4065d48f4ca7ae0425 \
--hash=sha256:a4d3091415f010369ae4ed1fc6b79def9416358877534caf6a0fdd2146c87a3e \
--hash=sha256:a8786accb172bd8afb8be14490a16625cbc387036876ab6ba70912730faf8e1f \
--hash=sha256:a9f8c2e67970f13b16084e04f134610fd1d374bf477b17ec1599185cf611d725 \
--hash=sha256:bc2fa7c6b47d6bc618dd7fb02ef6fdedb1090ec036abab80d4681424b84c1183 \
--hash=sha256:c70c95198c015b85feafc136515252a261a84561b7b1d51e3384e0655ddf25ab \
--hash=sha256:cc1c1159b3d456576af7a3e4d1ba7e6924cb39de8f67111c735f6fc832082774 \
--hash=sha256:ce826d6ef20b1bc864f0a68340c8b3287705cae2f8b4b1d932177dcc76721725 \
--hash=sha256:d584d9ec91ad65861cc08d42e834324ef890a082e591037abe114850ff7bbc3e \
--hash=sha256:d7fded462629cfa4b685c5416b949ebad6cec74af5e2d42905d41e257e0869f5 \
--hash=sha256:d84a1718ee396f54f3a086ea0a66d8e552b2ab2017ef8b420e92edbc841c352d \
--hash=sha256:d8e03406cac8513435335dbab54c0d385e4a49e4945d2909a581c83647ca0290 \
--hash=sha256:e10ce637b18caea04431ce14fabcf5c64a1c61ec9c56b071a4b7ca131ca52d44 \
--hash=sha256:ec031d5d2feb36d1d1a24380e4db6d43695f3748343d99434e6f5f9156aaa2ed \
--hash=sha256:ef6107725bd54b262d6dedcc2af448a266975032bc85ef0172c5f059da6325b4 \
--hash=sha256:efdca5630322a10774e8e98e1af481aad470dd62c3170801852d752aa7a783ba \
--hash=sha256:f753120cb8181e736c57ef7636e83f31b9c0d1722c516f7e86cf15b7aa57ff12 \
--hash=sha256:ff3824dc5261f50c9b0dfb3be22b4567a6f938ccce4587b38952d85fd9e9afe4
# via -r requirements.in
18 changes: 17 additions & 1 deletion test/test_xacro.py
Original file line number Diff line number Diff line change
Expand Up @@ -57,6 +57,20 @@
def subTest(msg):
yield None

try:
# Determine if we are running the test under bazel and switch to runfiles directory
from python.runfiles import runfiles

data_path = runfiles.Create().Rlocation("_main/test")
os.chdir(data_path)

# Set the executable path
XACRO_EXECUTABLE = runfiles.Create().Rlocation("_main/xacro_main")
BAZEL_TEST = True
except ImportError:
XACRO_EXECUTABLE = 'xacro'
BAZEL_TEST = False

# regex to match whitespace
whitespace = re.compile(r'\s+')

Expand Down Expand Up @@ -383,7 +397,7 @@ def quick_xacro(self, xml, cli=None, **kwargs):

def run_xacro(self, input_path, *args):
args = list(args)
subprocess.call(['xacro', input_path] + args)
subprocess.call([XACRO_EXECUTABLE, input_path] + args)


# class to match XML docs while ignoring any comments
Expand All @@ -392,6 +406,7 @@ def __init__(self, *args, **kwargs):
super(TestXacroCommentsIgnored, self).__init__(*args, **kwargs)
self.ignore_nodes = [xml.dom.Node.COMMENT_NODE]

@unittest.skipIf(BAZEL_TEST, "Bazel build does not support $(find pkg)")
def test_pr2(self):
# run xacro on the pr2 tree snapshot
test_dir = os.path.abspath(os.path.dirname(__file__))
Expand Down Expand Up @@ -551,6 +566,7 @@ def test_math_ignores_spaces(self):
src = '''<a><f v="${0.9 / 2 - 0.2}" /></a>'''
self.assert_matches(self.quick_xacro(src), '''<a><f v="0.25" /></a>''')

@unittest.skipIf(BAZEL_TEST, "Bazel build does not support $(find pkg)")
def test_substitution_args_find(self):
resolved = self.quick_xacro('''<a>$(find xacro)/test/test_xacro.py</a>''').firstChild.firstChild.data
self.assertEqual(os.path.realpath(resolved), os.path.realpath(__file__))
Expand Down
8 changes: 7 additions & 1 deletion xacro/substitution_args.py
Original file line number Diff line number Diff line change
Expand Up @@ -137,7 +137,13 @@ def _dirname(resolved, a, args, context):


def _eval_find(pkg):
from ament_index_python.packages import get_package_share_directory
try:
from ament_index_python.packages import get_package_share_directory
except ModuleNotFoundError:
raise SubstitutionException(
'$(find pkg) requires ament_index_python, but it was not found'
)

return get_package_share_directory(pkg)


Expand Down
Loading