{"record":{"id":"2a3cb900ecd78334","repo":"oracle/graal","slug":"the-relative-extracted-lib-path-of-name-is-alrea","errorCode":null,"errorMessage":"the relative extracted lib path of {name} is already set to {self.relative_extracted_lib_paths[name]} and cannot also be set to {path} for {self.destination}","messagePattern":"the relative extracted lib path of (.+?) is already set to (.+?) and cannot also be set to (.+?) for (.+?)","errorType":"validation","errorClass":"ValueError","httpStatus":null,"severity":"error","filePath":"sdk/mx.sdk/mx_sdk_vm.py","lineNumber":145,"sourceCode":"        return sorted(add_exports)\n\n    def get_add_exports(self, missing_jars):\n        if self.use_modules is None:\n            return ''\n        distributions = self.jar_distributions\n        distributions_transitive = mx.classpath_entries(distributions)\n        distributions_transitive_clean = [entry for entry in distributions_transitive if str(entry) not in missing_jars]\n        required_exports = mx_javamodules.requiredExports(distributions_transitive_clean, base_jdk())\n        return AbstractNativeImageConfig.get_add_exports_list(required_exports)\n\n    def add_relative_home_path(self, language, path):\n        if language in self.relative_home_paths and self.relative_home_paths[language] != path:\n            raise ValueError(f'the relative home path of {language} is already set to {self.relative_home_paths[language]} and cannot also be set to {path} for {self.destination}')\n        self.relative_home_paths[language] = path\n\n    def add_relative_extracted_lib_path(self, name, path):\n        if name in self.relative_extracted_lib_paths and self.relative_extracted_lib_paths[name] != path:\n            raise ValueError(f'the relative extracted lib path of {name} is already set to {self.relative_extracted_lib_paths[name]} and cannot also be set to {path} for {self.destination}')\n        self.relative_extracted_lib_paths[name] = path\n\nclass LauncherConfig(AbstractNativeImageConfig):\n    def __init__(self, destination, jar_distributions, main_class, build_args, is_main_launcher=True,\n                 default_symlinks=True, is_sdk_launcher=False, custom_launcher_script=None, extra_jvm_args=None,\n                 use_modules=None, main_module=None, link_at_build_time=True, option_vars=None, home_finder=True, **kwargs):\n        \"\"\"\n        :param str main_class\n        :param bool is_main_launcher\n        :param bool default_symlinks\n        :param bool is_sdk_launcher: Whether it uses org.graalvm.launcher.Launcher\n        :param str custom_launcher_script: Custom launcher script, to be used when not compiled as a native image\n        :param list[str] | None extra_jvm_args\n        :param str main_module: Specifies the main module. Mandatory if use_modules is not None\n        :param bool link_at_build_time\n        :param list[str] | None option_vars\n        \"\"\"\n        super().__init__(destination, jar_distributions, build_args, use_modules=use_modules, home_finder=home_finder, **kwargs)","sourceCodeStart":127,"sourceCodeEnd":163,"githubUrl":"https://github.com/oracle/graal/blob/a66e9ccd1d7bf2552883939aa0788dfd0e294aab/sdk/mx.sdk/mx_sdk_vm.py#L127-L163","documentation":"Same uniqueness rule as error 813 but for extracted native libraries: add_relative_extracted_lib_path() maps a library name to its extraction path per destination, and a second registration with a different path raises ValueError, indicating two components disagree about where an extracted lib is placed.","triggerScenarios":"Two suite.py components registering the same extracted library name with different relative paths for the same image destination.","commonSituations":"Renaming a lib directory in one component but not the other; merging components that both bundle a library with the same name.","solutions":["Use the two paths in the message to locate the conflicting registrations in suite.py and unify them to one path.","If the libraries are actually different artifacts, rename one so the keys differ.","Verify with a grep for add_relative_extracted_lib_path('<name>' across suites."],"exampleFix":"# before (suite.py)\ncomponent A: add_relative_extracted_lib_path('libffi', 'lib/ffi')\ncomponent B: add_relative_extracted_lib_path('libffi', 'lib/libffi')   # conflict\n\n# after\ncomponent B: add_relative_extracted_lib_path('libffi', 'lib/ffi')","handlingStrategy":"validation","validationCode":"def add_extracted_lib_checked(cfg, name, path):\n    existing = cfg.relative_extracted_lib_paths.get(name)\n    if existing is not None and existing != path:\n        raise ValueError(f\"lib {name} already at {existing}; refusing {path}\")\n    cfg.relative_extracted_lib_paths[name] = path","typeGuard":null,"tryCatchPattern":null,"preventionTips":["One owner per extracted library name per destination.","Rename directories everywhere at once; grep add_relative_extracted_lib_path before renames.","Validate path-map consistency in a lint pass over suite.py components."],"tags":["graalvm","build","layout","configuration","mx"],"backgroundTag":null,"analyzedSha":"a66e9ccd1d7bf2552883939aa0788dfd0e294aab","analyzedAt":"2026-08-14T13:58:47.161Z","schemaVersion":2},"datasetVersion":"2026-08-15T17:31:12.345Z"}