1+ load ("@aspect_bazel_lib//lib:copy_file.bzl" , "copy_file" )
2+ load ("@aspect_bazel_lib//lib:copy_to_directory.bzl" , "copy_to_directory" )
3+ load ("@aspect_bazel_lib//lib:directory_path.bzl" , "directory_path" )
14load ("@rules_pkg//pkg:mappings.bzl" , "pkg_attributes" , "pkg_filegroup" , "pkg_files" , "pkg_mklink" , "strip_prefix" )
25load ("@rules_pkg//pkg:tar.bzl" , "pkg_tar" )
3- load ("//bazel/rules:exclude_from_filegroup .bzl" , "exclude_from_filegroup " )
4- load ("//bazel/rules:make_deployable .bzl" , "make_deployable_dir " , "string_replace " )
6+ load ("//bazel/rules:make_deployable .bzl" , "string_replace " )
7+ load ("//bazel/rules:patchelf .bzl" , "set_runpath " , "set_runpath_tree " )
58load ("//omd/packages/Python:version.bzl" , "PYTHON_MAJOR_DOT_MINOR" , "PYTHON_VERSION_MAJOR" )
69
710exports_files ([
@@ -78,40 +81,71 @@ share_symlinks = [
7881
7982symlinks = bin_symlinks + lib_symlinks + pkgconfig_symlinks + share_symlinks
8083
81- # Deployable means binaries are prepared to be packaged.
82- genrule (
83- name = "python_bin_deployable" ,
84- srcs = ["@python//:gen_dir" ],
85- outs = bin_paths ,
86- cmd = """
87- BIN=$$(find $(location @python//:gen_dir) -name bin)
88- rsync -r -L --chmod='u+w' $$BIN $$(realpath $(RULEDIR))
84+ filegroup (
85+ name = "python_gen_dir" ,
86+ srcs = ["@python" ],
87+ output_group = "gen_dir" ,
88+ tags = ["manual" ],
89+ )
90+
91+ [directory_path (
92+ name = "python_bin_path_%s" % f .replace ("/" , "_" ).replace ("." , "_" ),
93+ directory = ":python_gen_dir" ,
94+ path = f ,
95+ tags = ["manual" ],
96+ ) for f in bin_paths ]
97+
98+ [copy_file (
99+ name = "python_bin_copy_%s" % f .replace ("/" , "_" ).replace ("." , "_" ),
100+ src = ":python_bin_path_%s" % f .replace ("/" , "_" ).replace ("." , "_" ),
101+ out = f .split ("/" )[- 1 ],
102+ tags = ["manual" ],
103+ ) for f in bin_paths ]
104+
105+ elf_bin_paths = [
106+ "bin/python%s" % PYTHON_MAJOR_DOT_MINOR ,
107+ ]
89108
90- # set RPATH for all ELF binaries we find
91- file -L $(OUTS) \\
92- | grep ELF | cut -d ':' -f1 \\
93- | xargs patchelf --force-rpath --set-rpath "\\ $$ORIGIN/../lib"
94- """ ,
109+ script_bin_paths = [f for f in bin_paths if f not in elf_bin_paths ]
110+
111+ set_runpath (
112+ name = "python_bin_deployable" ,
113+ srcs = [":python_bin_copy_%s" % f .replace ("/" , "_" ).replace ("." , "_" ) for f in elf_bin_paths ],
114+ rpaths = ["$ORIGIN/../lib" ],
95115 tags = ["manual" ],
96116)
97117
98118pkg_files (
99119 name = "python_bin_pkg" ,
100120 srcs = [
101121 ":python_bin_deployable" ,
102- ],
122+ ] + [ ":python_bin_copy_%s" % f . replace ( "/" , "_" ). replace ( "." , "_" ) for f in script_bin_paths ] ,
103123 attributes = pkg_attributes (
104124 mode = "0755" ,
105125 ),
106126 prefix = "bin" ,
107127 tags = ["manual" ],
108128)
109129
110- make_deployable_dir (
130+ directory_path (
131+ name = "python_lib_dynload_path" ,
132+ directory = ":python_gen_dir" ,
133+ path = "lib/python%s/lib-dynload" % PYTHON_MAJOR_DOT_MINOR ,
134+ tags = ["manual" ],
135+ )
136+
137+ copy_to_directory (
138+ name = "python_lib_dynload_copy" ,
139+ srcs = [":python_lib_dynload_path" ],
140+ include_external_repositories = ["**" ],
141+ root_paths = ["**/lib-dynload" ],
142+ tags = ["manual" ],
143+ )
144+
145+ set_runpath_tree (
111146 name = "python_lib_dynload_deployable" ,
112- src = "@python//:gen_dir" ,
113- input_dir = "lib/python%s/lib-dynload" % PYTHON_MAJOR_DOT_MINOR ,
114- rpath = "\\ $ORIGIN/../.." ,
147+ src = ":python_lib_dynload_copy" ,
148+ rpath = "$ORIGIN/../.." ,
115149 tags = ["manual" ],
116150)
117151
@@ -121,7 +155,8 @@ pkg_files(
121155 attributes = pkg_attributes (
122156 mode = "0755" ,
123157 ),
124- prefix = "lib/python%s/" % PYTHON_MAJOR_DOT_MINOR ,
158+ prefix = "lib/python%s/lib-dynload" % PYTHON_MAJOR_DOT_MINOR ,
159+ strip_prefix = "python_lib_dynload_deployable" ,
125160 tags = ["manual" ],
126161)
127162
@@ -136,7 +171,7 @@ pkg_filegroup(
136171 name = "python_bin_symlinks_pkg" ,
137172 srcs = [
138173 ":%s" % link_name
139- for link_name , target in bin_symlinks
174+ for link_name , _ in bin_symlinks
140175 ],
141176 prefix = "bin" ,
142177 tags = ["manual" ],
@@ -146,7 +181,7 @@ pkg_filegroup(
146181 name = "python_lib_symlinks_pkg" ,
147182 srcs = [
148183 ":%s" % link_name
149- for link_name , target in lib_symlinks
184+ for link_name , _ in lib_symlinks
150185 ],
151186 prefix = "lib" ,
152187 tags = ["manual" ],
@@ -156,7 +191,7 @@ pkg_filegroup(
156191 name = "python_pkgconfig_symlinks_pkg" ,
157192 srcs = [
158193 ":%s" % link_name
159- for link_name , target in pkgconfig_symlinks
194+ for link_name , _ in pkgconfig_symlinks
160195 ],
161196 prefix = "lib/pkgconfig" ,
162197 tags = ["manual" ],
@@ -166,7 +201,7 @@ pkg_filegroup(
166201 name = "python_share_symlinks_pkg" ,
167202 srcs = [
168203 ":%s" % link_name
169- for link_name , target in share_symlinks
204+ for link_name , _ in share_symlinks
170205 ],
171206 prefix = "share/man/man1" ,
172207 tags = ["manual" ],
@@ -179,15 +214,21 @@ pkg_filegroup(
179214# the RPATH needs patching, symlinking.
180215# This target should contain all files that are not referenced
181216# explicitly somewhere else.
182- exclude_from_filegroup (
217+ copy_to_directory (
183218 name = "python_rest" ,
184- src = "@python//:gen_dir" ,
185- excludes = ["lib/python%s/lib-dynload" % PYTHON_MAJOR_DOT_MINOR ] +
186- bin_paths +
187- ["bin/%s" % i [0 ] for i in bin_symlinks ] +
188- ["lib/%s" % i [0 ] for i in lib_symlinks ] +
189- ["lib/pkgconfig/%s" % i [0 ] for i in pkgconfig_symlinks ] +
190- ["share/man/man1/%s" % i [0 ] for i in share_symlinks ],
219+ srcs = ["@python" ],
220+ exclude_srcs_patterns =
221+ ["lib/python%s/lib-dynload/**" % PYTHON_MAJOR_DOT_MINOR ] +
222+ ["lib/%s" % i [0 ] for i in lib_symlinks ] +
223+ ["lib/pkgconfig/%s" % i [0 ] for i in pkgconfig_symlinks ] +
224+ ["share/man/man1/%s" % i [0 ] for i in share_symlinks ],
225+ include_external_repositories = ["**" ],
226+ include_srcs_patterns = [
227+ "include/**" ,
228+ "lib/**" ,
229+ "share/**" ,
230+ ],
231+ root_paths = ["python" ],
191232 tags = ["manual" ],
192233)
193234
0 commit comments