From 093b24cc9b41aac2b28916dcf5f49248c89c1afa Mon Sep 17 00:00:00 2001 From: alokkumardalei-wq Date: Thu, 2 Apr 2026 03:04:51 +0530 Subject: [PATCH] chore: fix package boundary violation and buildifier warnings Signed-off-by: alokkumardalei-wq --- .../workflows/github-actions-macos-bazel.yml | 4 +- bazel/Dockerfile | 3 + bazel/man_pages.bzl | 80 +++++++++++++++++++ docs/BUILD.bazel | 71 ++++++++++++++++ docs/src/scripts/BUILD | 7 ++ src/OpenRoad.cc | 7 ++ src/ant/BUILD | 5 +- src/cts/BUILD | 5 +- src/dbSta/BUILD | 5 ++ src/dft/BUILD | 5 +- src/dft/test/BUILD | 2 +- src/dpl/BUILD | 5 +- src/drt/BUILD | 5 +- src/dst/BUILD | 5 ++ src/fin/BUILD | 5 +- src/gpl/BUILD | 5 +- src/grt/BUILD | 5 +- src/ifp/BUILD | 5 +- src/mpl/BUILD | 5 +- src/mpl/test/BUILD | 2 +- src/odb/BUILD | 5 +- src/pad/BUILD | 5 +- src/par/BUILD | 5 +- src/pdn/BUILD | 5 +- src/ppl/BUILD | 5 +- src/psm/BUILD | 5 +- src/rcx/BUILD | 5 +- src/rmp/BUILD | 5 +- src/rmp/test/BUILD | 2 +- src/rsz/BUILD | 5 +- src/stt/BUILD | 5 +- src/tap/BUILD | 5 +- src/upf/BUILD | 5 +- src/utl/BUILD | 5 +- 34 files changed, 275 insertions(+), 28 deletions(-) create mode 100644 bazel/man_pages.bzl create mode 100644 docs/BUILD.bazel diff --git a/.github/workflows/github-actions-macos-bazel.yml b/.github/workflows/github-actions-macos-bazel.yml index 926ab3a7c15..03eadc2bb4f 100644 --- a/.github/workflows/github-actions-macos-bazel.yml +++ b/.github/workflows/github-actions-macos-bazel.yml @@ -30,8 +30,8 @@ jobs: restore-keys: | ${{ runner.os }}-bazel- - - name: Install Bazelisk - run: brew install bazelisk + - name: Install Bazelisk and pandoc + run: brew install bazelisk pandoc - name: Build OpenROAD run: | diff --git a/bazel/Dockerfile b/bazel/Dockerfile index bbe40e2840c..996c3ced08e 100644 --- a/bazel/Dockerfile +++ b/bazel/Dockerfile @@ -19,13 +19,16 @@ RUN install -m 0755 -d /etc/apt/keyrings \ RUN apt-get -y update \ && apt-get -y install --no-install-recommends \ + bsdextrautils \ build-essential \ clang \ containerd.io \ docker-buildx-plugin \ docker-ce \ docker-ce-cli \ + groff \ openjdk-21-jre-headless \ + pandoc \ python3 \ python3-yaml \ time diff --git a/bazel/man_pages.bzl b/bazel/man_pages.bzl new file mode 100644 index 00000000000..b3e123ffb6d --- /dev/null +++ b/bazel/man_pages.bzl @@ -0,0 +1,80 @@ +# SPDX-License-Identifier: BSD-3-Clause +# Copyright (c) 2026, The OpenROAD Authors + +"""Bazel rule to generate man pages (cat/ and html/) from module READMEs. + +Runs the existing docs Makefile to produce cat/ and html/ outputs. +Requires pandoc, nroff, and python3 (>= 3.10) on the system. +""" + +def _man_pages_impl(ctx): + cat_dir = ctx.actions.declare_directory("cat") + html_dir = ctx.actions.declare_directory("html") + + command = """ +set -euo pipefail + +# Ensure homebrew tools (pandoc, python3 >= 3.10) are available on macOS +if [ -d /opt/homebrew/bin ]; then + export PATH="/opt/homebrew/bin:$PATH" +elif [ -d /usr/local/bin ]; then + export PATH="/usr/local/bin:$PATH" +fi + +cd docs + +# Symlink module READMEs into md/man2/ +bash src/scripts/link_readmes.sh 2>/dev/null || true + +# Run preprocessing +python3 src/scripts/md_roff_compat.py + +# Generate cat and html pages via Makefile +make -f Makefile cat web + +cd .. + +# Copy outputs to declared Bazel directories +cp -r docs/cat/* {cat_out}/ +cp -r docs/html/* {html_out}/ +""".format( + cat_out = cat_dir.path, + html_out = html_dir.path, + ) + + ctx.actions.run_shell( + outputs = [cat_dir, html_dir], + inputs = ctx.files.docs_srcs + ctx.files.scripts + ctx.files.readmes + ctx.files.messages, + command = command, + mnemonic = "ManPages", + progress_message = "Generating man pages (cat + html)", + use_default_shell_env = True, + execution_requirements = {"no-sandbox": "1"}, + ) + + return [DefaultInfo( + files = depset([cat_dir, html_dir]), + runfiles = ctx.runfiles(files = [cat_dir, html_dir]), + )] + +man_pages = rule( + implementation = _man_pages_impl, + attrs = { + "docs_srcs": attr.label_list( + doc = "All source files under docs/ needed by the Makefile.", + allow_files = True, + ), + "messages": attr.label_list( + doc = "Module messages.txt files needed for man3 page generation.", + allow_files = [".txt"], + ), + "readmes": attr.label_list( + doc = "Module README.md files (src/*/README.md).", + allow_files = [".md"], + ), + "scripts": attr.label_list( + doc = "Python/shell scripts for man page generation.", + allow_files = True, + ), + }, +) diff --git a/docs/BUILD.bazel b/docs/BUILD.bazel new file mode 100644 index 00000000000..cc909308600 --- /dev/null +++ b/docs/BUILD.bazel @@ -0,0 +1,71 @@ +# SPDX-License-Identifier: BSD-3-Clause +# Copyright (c) 2026, The OpenROAD Authors + +load("//bazel:man_pages.bzl", "man_pages") + +man_pages( + name = "man_pages", + docs_srcs = [ + "Makefile", + ] + glob(["md/**/*.md"]), + messages = [ + "//src/ant:messages_txt", + "//src/cts:messages_txt", + "//src/dbSta:messages_txt", + "//src/dft:messages_txt", + "//src/dpl:messages_txt", + "//src/drt:messages_txt", + "//src/dst:messages_txt", + "//src/fin:messages_txt", + "//src/gpl:messages_txt", + "//src/grt:messages_txt", + "//src/ifp:messages_txt", + "//src/mpl:messages_txt", + "//src/odb:messages_txt", + "//src/pad:messages_txt", + "//src/par:messages_txt", + "//src/pdn:messages_txt", + "//src/ppl:messages_txt", + "//src/psm:messages_txt", + "//src/rcx:messages_txt", + "//src/rmp:messages_txt", + "//src/rsz:messages_txt", + "//src/stt:messages_txt", + "//src/tap:messages_txt", + "//src/upf:messages_txt", + "//src/utl:messages_txt", + ], + readmes = [ + "//src/ant:README.md", + "//src/cts:README.md", + "//src/dft:README.md", + "//src/dpl:README.md", + "//src/drt:README.md", + "//src/fin:README.md", + "//src/gpl:README.md", + "//src/grt:README.md", + "//src/gui:README.md", + "//src/ifp:README.md", + "//src/mpl:README.md", + "//src/odb:README.md", + "//src/pad:README.md", + "//src/par:README.md", + "//src/pdn:README.md", + "//src/ppl:README.md", + "//src/psm:README.md", + "//src/rcx:README.md", + "//src/rmp:README.md", + "//src/rsz:README.md", + "//src/stt:README.md", + "//src/tap:README.md", + "//src/upf:README.md", + "//src/utl:README.md", + ], + scripts = [ + "//docs/src/scripts:link_readmes.sh", + "//docs/src/scripts:md_roff_compat.py", + "//docs/src/scripts:manpage.py", + "//docs/src/scripts:extract_utils.py", + ], + visibility = ["//visibility:public"], +) diff --git a/docs/src/scripts/BUILD b/docs/src/scripts/BUILD index f9d6fc9d9d4..872cca8816b 100644 --- a/docs/src/scripts/BUILD +++ b/docs/src/scripts/BUILD @@ -15,3 +15,10 @@ py_test( srcs = ["test_extract_utils.py"], deps = [":extract_utils"], ) + +exports_files([ + "md_roff_compat.py", + "manpage.py", + "link_readmes.sh", + "extract_utils.py", +]) diff --git a/src/OpenRoad.cc b/src/OpenRoad.cc index 5570f6843f5..ca36e9c432d 100644 --- a/src/OpenRoad.cc +++ b/src/OpenRoad.cc @@ -710,6 +710,13 @@ std::string OpenRoad::getDocsPath() const return ""; } + // Check Bazel runfiles layout first + const std::filesystem::path runfiles_docs + = std::filesystem::path(exe + ".runfiles") / "_main" / "docs"; + if (std::filesystem::exists(runfiles_docs)) { + return runfiles_docs; + } + std::filesystem::path path(exe); // remove binary name diff --git a/src/ant/BUILD b/src/ant/BUILD index ed3fb812068..d566b458510 100644 --- a/src/ant/BUILD +++ b/src/ant/BUILD @@ -115,5 +115,8 @@ filegroup( ) messages_txt( - visibility = ["//src/ant/test:__pkg__"], + visibility = [ + "//docs:__pkg__", + "//src/ant/test:__pkg__", + ], ) diff --git a/src/cts/BUILD b/src/cts/BUILD index 858b5de9688..5d53373e0e6 100644 --- a/src/cts/BUILD +++ b/src/cts/BUILD @@ -151,5 +151,8 @@ filegroup( ) messages_txt( - visibility = ["//src/cts/test:__pkg__"], + visibility = [ + "//docs:__pkg__", + "//src/cts/test:__pkg__", + ], ) diff --git a/src/dbSta/BUILD b/src/dbSta/BUILD index 2640af73817..59ae61a9c0d 100644 --- a/src/dbSta/BUILD +++ b/src/dbSta/BUILD @@ -4,6 +4,7 @@ load("@rules_cc//cc:cc_library.bzl", "cc_library") load("//bazel:tcl_encode_or.bzl", "tcl_encode") load("//bazel:tcl_wrap_cc.bzl", "tcl_wrap_cc") +load("//test:regression.bzl", "messages_txt") package( default_visibility = ["//:__subpackages__"], @@ -195,3 +196,7 @@ tcl_wrap_cc( "//src/odb:swig", ], ) + +messages_txt( + visibility = ["//docs:__pkg__"], +) diff --git a/src/dft/BUILD b/src/dft/BUILD index fa6afc6cdd0..0b074ccb548 100644 --- a/src/dft/BUILD +++ b/src/dft/BUILD @@ -105,5 +105,8 @@ filegroup( ) messages_txt( - visibility = ["//src/dft/test:__pkg__"], + visibility = [ + "//docs:__pkg__", + "//src/dft/test:__pkg__", + ], ) diff --git a/src/dft/test/BUILD b/src/dft/test/BUILD index 2bfc3c53ffb..af182d31483 100644 --- a/src/dft/test/BUILD +++ b/src/dft/test/BUILD @@ -1,4 +1,3 @@ -load("@rules_python//python:defs.bzl", "py_test") # SPDX-License-Identifier: BSD-3-Clause # Copyright (c) 2022-2025, The OpenROAD Authors @@ -6,6 +5,7 @@ load("@rules_python//python:defs.bzl", "py_test") # No tests are intentionally excluded. See .kiro/specs/bazel-cmake-test-parity/intentional_exclusions.md load("@rules_cc//cc:cc_test.bzl", "cc_test") +load("@rules_python//python:defs.bzl", "py_test") load("//test:regression.bzl", "doc_check_test", "regression_test") package(features = ["layering_check"]) diff --git a/src/dpl/BUILD b/src/dpl/BUILD index e04d85939fc..b2fc2180cb0 100644 --- a/src/dpl/BUILD +++ b/src/dpl/BUILD @@ -193,5 +193,8 @@ filegroup( ) messages_txt( - visibility = ["//src/dpl/test:__pkg__"], + visibility = [ + "//docs:__pkg__", + "//src/dpl/test:__pkg__", + ], ) diff --git a/src/drt/BUILD b/src/drt/BUILD index c915cfbac58..bb6c23e25a3 100644 --- a/src/drt/BUILD +++ b/src/drt/BUILD @@ -324,5 +324,8 @@ filegroup( ) messages_txt( - visibility = ["//src/drt/test:__pkg__"], + visibility = [ + "//docs:__pkg__", + "//src/drt/test:__pkg__", + ], ) diff --git a/src/dst/BUILD b/src/dst/BUILD index b0528442c38..fd8d2713c2e 100644 --- a/src/dst/BUILD +++ b/src/dst/BUILD @@ -4,6 +4,7 @@ load("@rules_cc//cc:cc_library.bzl", "cc_library") load("//bazel:tcl_encode_or.bzl", "tcl_encode") load("//bazel:tcl_wrap_cc.bzl", "tcl_wrap_cc") +load("//test:regression.bzl", "messages_txt") package( default_visibility = ["//:__subpackages__"], @@ -99,3 +100,7 @@ tcl_wrap_cc( "//src/odb:swig", ], ) + +messages_txt( + visibility = ["//docs:__pkg__"], +) diff --git a/src/fin/BUILD b/src/fin/BUILD index a0824cbbb32..fc3db602022 100644 --- a/src/fin/BUILD +++ b/src/fin/BUILD @@ -98,5 +98,8 @@ filegroup( ) messages_txt( - visibility = ["//src/fin/test:__pkg__"], + visibility = [ + "//docs:__pkg__", + "//src/fin/test:__pkg__", + ], ) diff --git a/src/gpl/BUILD b/src/gpl/BUILD index 9fb3854e9f9..f36dc904861 100644 --- a/src/gpl/BUILD +++ b/src/gpl/BUILD @@ -176,5 +176,8 @@ filegroup( ) messages_txt( - visibility = ["//src/gpl/test:__pkg__"], + visibility = [ + "//docs:__pkg__", + "//src/gpl/test:__pkg__", + ], ) diff --git a/src/grt/BUILD b/src/grt/BUILD index 48c776a861d..32a64294072 100644 --- a/src/grt/BUILD +++ b/src/grt/BUILD @@ -268,5 +268,8 @@ filegroup( ) messages_txt( - visibility = ["//src/grt/test:__pkg__"], + visibility = [ + "//docs:__pkg__", + "//src/grt/test:__pkg__", + ], ) diff --git a/src/ifp/BUILD b/src/ifp/BUILD index 466ac620064..7970b136cc5 100644 --- a/src/ifp/BUILD +++ b/src/ifp/BUILD @@ -114,5 +114,8 @@ filegroup( ) messages_txt( - visibility = ["//src/ifp/test:__pkg__"], + visibility = [ + "//docs:__pkg__", + "//src/ifp/test:__pkg__", + ], ) diff --git a/src/mpl/BUILD b/src/mpl/BUILD index cd461aeaa3e..6e939197f2d 100644 --- a/src/mpl/BUILD +++ b/src/mpl/BUILD @@ -134,5 +134,8 @@ filegroup( ) messages_txt( - visibility = ["//src/mpl/test:__pkg__"], + visibility = [ + "//docs:__pkg__", + "//src/mpl/test:__pkg__", + ], ) diff --git a/src/mpl/test/BUILD b/src/mpl/test/BUILD index a2767c53ed3..099a0a6c866 100644 --- a/src/mpl/test/BUILD +++ b/src/mpl/test/BUILD @@ -1,4 +1,3 @@ -load("@rules_python//python:defs.bzl", "py_test") # SPDX-License-Identifier: BSD-3-Clause # Copyright (c) 2022-2025, The OpenROAD Authors @@ -6,6 +5,7 @@ load("@rules_python//python:defs.bzl", "py_test") # No tests are intentionally excluded. See .kiro/specs/bazel-cmake-test-parity/intentional_exclusions.md load("@rules_cc//cc:cc_test.bzl", "cc_test") +load("@rules_python//python:defs.bzl", "py_test") load("//test:regression.bzl", "doc_check_test", "regression_test") package(features = ["layering_check"]) diff --git a/src/odb/BUILD b/src/odb/BUILD index 32a221eec2e..1b59dfb944e 100644 --- a/src/odb/BUILD +++ b/src/odb/BUILD @@ -166,5 +166,8 @@ messages_txt( src_patterns = [ "include/odb/*.h", ], - visibility = ["//src/odb/test:__pkg__"], + visibility = [ + "//docs:__pkg__", + "//src/odb/test:__pkg__", + ], ) diff --git a/src/pad/BUILD b/src/pad/BUILD index 7bd7ee3b6f8..a330b4d7720 100644 --- a/src/pad/BUILD +++ b/src/pad/BUILD @@ -86,5 +86,8 @@ filegroup( ) messages_txt( - visibility = ["//src/pad/test:__pkg__"], + visibility = [ + "//docs:__pkg__", + "//src/pad/test:__pkg__", + ], ) diff --git a/src/par/BUILD b/src/par/BUILD index f89cc22e70d..b1aa106eca7 100644 --- a/src/par/BUILD +++ b/src/par/BUILD @@ -162,5 +162,8 @@ filegroup( ) messages_txt( - visibility = ["//src/par/test:__pkg__"], + visibility = [ + "//docs:__pkg__", + "//src/par/test:__pkg__", + ], ) diff --git a/src/pdn/BUILD b/src/pdn/BUILD index 05990508a5e..10b6fa3ed70 100644 --- a/src/pdn/BUILD +++ b/src/pdn/BUILD @@ -121,5 +121,8 @@ filegroup( ) messages_txt( - visibility = ["//src/pdn/test:__pkg__"], + visibility = [ + "//docs:__pkg__", + "//src/pdn/test:__pkg__", + ], ) diff --git a/src/ppl/BUILD b/src/ppl/BUILD index 1a90c184351..d94ef90aa40 100644 --- a/src/ppl/BUILD +++ b/src/ppl/BUILD @@ -126,5 +126,8 @@ filegroup( ) messages_txt( - visibility = ["//src/ppl/test:__pkg__"], + visibility = [ + "//docs:__pkg__", + "//src/ppl/test:__pkg__", + ], ) diff --git a/src/psm/BUILD b/src/psm/BUILD index 8582ac770db..4cf57abb862 100644 --- a/src/psm/BUILD +++ b/src/psm/BUILD @@ -114,5 +114,8 @@ filegroup( ) messages_txt( - visibility = ["//src/psm/test:__pkg__"], + visibility = [ + "//docs:__pkg__", + "//src/psm/test:__pkg__", + ], ) diff --git a/src/rcx/BUILD b/src/rcx/BUILD index 97933d38d27..e47e1e1c927 100644 --- a/src/rcx/BUILD +++ b/src/rcx/BUILD @@ -175,5 +175,8 @@ filegroup( ) messages_txt( - visibility = ["//src/rcx/test:__pkg__"], + visibility = [ + "//docs:__pkg__", + "//src/rcx/test:__pkg__", + ], ) diff --git a/src/rmp/BUILD b/src/rmp/BUILD index 1b53303b82e..400402fd3cd 100644 --- a/src/rmp/BUILD +++ b/src/rmp/BUILD @@ -130,5 +130,8 @@ filegroup( ) messages_txt( - visibility = ["//src/rmp/test:__pkg__"], + visibility = [ + "//docs:__pkg__", + "//src/rmp/test:__pkg__", + ], ) diff --git a/src/rmp/test/BUILD b/src/rmp/test/BUILD index 3e1ae59fb35..09e3cce61c6 100644 --- a/src/rmp/test/BUILD +++ b/src/rmp/test/BUILD @@ -1,4 +1,3 @@ -load("@rules_python//python:defs.bzl", "py_test") # SPDX-License-Identifier: BSD-3-Clause # Copyright (c) 2022-2026, The OpenROAD Authors @@ -6,6 +5,7 @@ load("@rules_python//python:defs.bzl", "py_test") # No tests are intentionally excluded. See .kiro/specs/bazel-cmake-test-parity/intentional_exclusions.md load("@rules_cc//cc:cc_test.bzl", "cc_test") +load("@rules_python//python:defs.bzl", "py_test") load("//test:regression.bzl", "doc_check_test", "regression_test") package(features = ["layering_check"]) diff --git a/src/rsz/BUILD b/src/rsz/BUILD index b76701076cf..46b383cafda 100644 --- a/src/rsz/BUILD +++ b/src/rsz/BUILD @@ -176,5 +176,8 @@ filegroup( ) messages_txt( - visibility = ["//src/rsz/test:__pkg__"], + visibility = [ + "//docs:__pkg__", + "//src/rsz/test:__pkg__", + ], ) diff --git a/src/stt/BUILD b/src/stt/BUILD index 794825b47dd..a50b87fd7df 100644 --- a/src/stt/BUILD +++ b/src/stt/BUILD @@ -142,5 +142,8 @@ filegroup( ) messages_txt( - visibility = ["//src/stt/test:__pkg__"], + visibility = [ + "//docs:__pkg__", + "//src/stt/test:__pkg__", + ], ) diff --git a/src/tap/BUILD b/src/tap/BUILD index c3ebe055b50..bf6e039144f 100644 --- a/src/tap/BUILD +++ b/src/tap/BUILD @@ -108,5 +108,8 @@ filegroup( ) messages_txt( - visibility = ["//src/tap/test:__pkg__"], + visibility = [ + "//docs:__pkg__", + "//src/tap/test:__pkg__", + ], ) diff --git a/src/upf/BUILD b/src/upf/BUILD index 14bb9109492..262ec9e1977 100644 --- a/src/upf/BUILD +++ b/src/upf/BUILD @@ -91,5 +91,8 @@ filegroup( ) messages_txt( - visibility = ["//src/upf/test:__pkg__"], + visibility = [ + "//docs:__pkg__", + "//src/upf/test:__pkg__", + ], ) diff --git a/src/utl/BUILD b/src/utl/BUILD index 2c4e5028a95..ed5e7ac9c9c 100644 --- a/src/utl/BUILD +++ b/src/utl/BUILD @@ -210,5 +210,8 @@ filegroup( ) messages_txt( - visibility = ["//src/utl/test:__pkg__"], + visibility = [ + "//docs:__pkg__", + "//src/utl/test:__pkg__", + ], )