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

Does not prebuilt_cxx_library.static_lib support $(location //:target)? #592

Open
yaoddao opened this issue Mar 7, 2024 · 3 comments
Open

Comments

@yaoddao
Copy link

yaoddao commented Mar 7, 2024

When using prebuilt_cxx_libary, it is OK if the member static_lib is set to a relative path.
However, when I use $(location //:target) buck2 reports the following error
I asked if prebuilt_cxx_libary.static_lib supports $(location //:target), just like prebuilt_cxx_libary.exported_linker_flags supports it. Thanks!

prebuilt_cxx_libary(
   exported_linker_flags = [
      "-L$(location //:ext-link)/local/lib",
   ],
   static_lib = '$(location //:ext-link)/opt/b28/s-5.8.003/linux_x86_64_rhel7/lib/liblef.a',
 )
Caused by:
    0: Error looking up configured node root//app/gps:seascape_main (prelude//platforms:default#524f8da68ea2a374)
    1: Error looking up configured node root//:pre_ext_headers (prelude//platforms:default#524f8da68ea2a374)
    2: looking up unconfigured target node `root//:pre_ext_headers`
    3: Error loading targets in package `root//` for target `root//:pre_ext_headers`
    4: Error evaluating build file: `root//:BUCK`
    5: Traceback (most recent call last):
         * BUCK:16, in <module>
             prebuilt_cxx_library(
         * prelude/native.bzl:234, in _prebuilt_cxx_library_macro_stub
             __rules__["prebuilt_cxx_library"](
       error: Error coercing attribute `static_lib` of `root//:pre_ext_headers`
          --> prelude/native.bzl:234:5
           |
       234 |       __rules__["prebuilt_cxx_library"](
           |  _____^
       235 | |         exported_preprocessor_flags = _concat(
       236 | |             exported_preprocessor_flags,
       237 | |             _versioned_param_to_select(versioned_exported_preprocessor_flags),
       238 | |         ),
       239 | |         exported_lang_preprocessor_flags = _concat(
       240 | |             exported_lang_preprocessor_flags,
       241 | |             _versioned_param_to_select(versioned_exported_lang_preprocessor_flags),
       242 | |         ),
       243 | |         exported_platform_preprocessor_flags = _concat(
       244 | |             exported_platform_preprocessor_flags,
       245 | |             _versioned_param_to_select(versioned_exported_platform_preprocessor_flags),
       246 | |         ),
       247 | |         exported_lang_platform_preprocessor_flags = _concat(
       248 | |             exported_lang_platform_preprocessor_flags,
       249 | |             _versioned_param_to_select(versioned_exported_lang_platform_preprocessor_flags),
       250 | |         ),
       251 | |         static_lib = _at_most_one(static_lib, _versioned_param_to_select(versioned_static_lib)),
       252 | |         static_pic_lib = _at_most_one(static_pic_lib, _versioned_param_to_select(versioned_static_pic_lib)),
       253 | |         shared_lib = _at_most_one(shared_lib, _versioned_param_to_select(versioned_shared_lib)),
       254 | |         header_dirs = _at_most_one(header_dirs, _versioned_param_to_select(versioned_header_dirs)),
       255 | |         **kwargs
       256 | |     )
           | |_____^
           |

    6: Error coercing attribute `static_lib` of type `attrs.option(attrs.source(), default=None)`
    7: Error coercing "(//:ext-link)/opt/b28/s-5.8.003/linux_x86_64_rhel7/lib/liblef.a"
    8: Couldn't coerce `(//:ext-link)/opt/b28/s-5.8.003/linux_x86_64_rhel7/lib/liblef.a` as a source.
         Error when treated as a target: Invalid absolute target pattern `(//:ext-link)/opt/b28/s-5.8.003/linux_x86_64_rhel7/lib/liblef.a` is not allowed: Invalid target name `ext-link)/opt/b28/s-5.8.003/linux_x86_64_rhel7/lib/liblef.a`. Target names are non-empty strings and can only contain alpha numeric characters, and symbols `,`, `.`, `=`, `-`, `/`, `~`, `@`, `!`, `+`, `$`, and `_`. No other characters are allowed.: Invalid target name `ext-link)/opt/b28/s-5.8.003/linux_x86_64_rhel7/lib/liblef.a`. Target names are non-empty strings and can only contain alpha numeric characters, and symbols `,`, `.`, `=`, `-`, `/`, `~`, `@`, `!`, `+`, `$`, and `_`. No other characters are allowed.
         Error when treated as a path: expected a normalized path but got an un-normalized path instead: `(//:ext-link)/opt/b28/s-5.8.003/linux_x86_64_rhel7/lib/liblef.a`
@zjturner
Copy link
Contributor

You probably need to make a rule that can export a subpath, then you can use tge static_lib=“:foo” syntax

@cjhopman
Copy link
Contributor

Yep, you need it to be the default output of a target or subtarget. What kind of rule is //:ext-link? If it's a genrule, that already has support for adding subtargets for paths in its output. If it's an http_file/archive, i'm not sure it has that support but it seems like it'd be a nice thing to add. That'd be something like:

http_archive(
  name = "ext-link",
  named_outs = { "liblef.a": "/opt/b28/s-5.8.003/linux_x86_64_rhel7/lib/liblef.a"}
  ...
)

prebuilt_cxx_libary(
   static_lib = '//:ext-link[liblef.a]',
   ...
 )

@zjturner
Copy link
Contributor

zjturner commented Mar 30, 2024

As a temporary workaround though (until http_archive supports it natively), you can also just write a rule that takes a target (such as an http_archive) as a dep, and re-export it.

def _inner_path_impl(ctx):
    original_default_output = ctx.attrs.target[DefaultInfo].default_outputs[0]

    return [
        DefaultInfo(default_outputs = [original_default_output.project(ctx.attrs.subpath)])
    ]

inner_path = rule(
    impl = _inner_path_impl,
    attrs = {
        "target": attrs.dep(providers = [DefaultInfo]),
        "subpath": attrs.string()
    }
)

Then you use it like this:

http_archive(
  name = "_ext-link",
  named_outs = { "liblef.a": "/opt/b28/s-5.8.003/linux_x86_64_rhel7/lib/liblef.a"}
  ...
)

inner_path(
    name = "ext-link",
    target = ":_ext-link",
    subpath = "opt/b28/s-5.8.003/linux_x86_64_rhel7/lib/liblef.a"
)

prebuilt_cxx_libary(
   static_lib = '//:ext-link',
   ...
 )

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
None yet
Projects
None yet
Development

No branches or pull requests

3 participants