From bb1b9eba5bd1166a05ba58a827087d85ac7c3dd1 Mon Sep 17 00:00:00 2001 From: Andreas Herrmann Date: Wed, 30 Jan 2019 18:05:00 +0100 Subject: [PATCH] Factor out uses of darwin_convert_to_dylibs Addressing PR review comments. Reducing the risk of future refactorings introducing subtle bugs by missing required steps in get_solibs_for_ghc_linker. --- haskell/doctest.bzl | 14 ++---------- haskell/lint.bzl | 14 ++---------- haskell/private/actions/compile.bzl | 14 ++---------- haskell/private/actions/repl.bzl | 14 ++---------- haskell/private/providers.bzl | 34 +++++++++++++++++++++++++++++ 5 files changed, 42 insertions(+), 48 deletions(-) diff --git a/haskell/doctest.bzl b/haskell/doctest.bzl index 0d056da30f..8b16817675 100644 --- a/haskell/doctest.bzl +++ b/haskell/doctest.bzl @@ -5,11 +5,10 @@ load("@bazel_skylib//lib:paths.bzl", "paths") load(":private/context.bzl", "haskell_context") load( ":private/path_utils.bzl", - "darwin_convert_to_dylibs", "get_lib_name", "make_path", ) -load(":private/providers.bzl", "get_mangled_libs") +load(":private/providers.bzl", "get_mangled_libs", "get_solibs_for_ghc_linker") load(":private/set.bzl", "set") load( "@io_tweag_rules_haskell//haskell:private/providers.bzl", @@ -132,16 +131,7 @@ def _haskell_doctest_single(target, ctx): ]) # Transitive library dependencies for runtime. - trans_link_ctx = build_info.transitive_cc_dependencies.dynamic_linking - trans_libs = get_mangled_libs(trans_link_ctx.libraries_to_link.to_list()) - trans_import_libs = set.to_list(build_info.transitive_import_dependencies) - - _library_deps = trans_libs + trans_import_libs - if hs.toolchain.is_darwin: - # GHC's builtin linker requires .dylib files on MacOS. - library_deps = darwin_convert_to_dylibs(hs, _library_deps) - else: - library_deps = _library_deps + library_deps = get_solibs_for_ghc_linker(hs, build_info) ld_library_path = make_path(library_deps) header_files = lib_info.header_files if lib_info != None else bin_info.header_files diff --git a/haskell/lint.bzl b/haskell/lint.bzl index 52ea01c20a..f2fc2acc2f 100644 --- a/haskell/lint.bzl +++ b/haskell/lint.bzl @@ -11,10 +11,9 @@ load(":private/context.bzl", "haskell_context") load(":private/packages.bzl", "expose_packages") load( ":private/path_utils.bzl", - "darwin_convert_to_dylibs", "target_unique_name", ) -load(":private/providers.bzl", "get_mangled_libs") +load(":private/providers.bzl", "get_solibs_for_ghc_linker") load(":private/set.bzl", "set") def _collect_lint_logs(deps): @@ -75,16 +74,7 @@ def _haskell_lint_aspect_impl(target, ctx): ) # Transitive library dependencies for runtime. - trans_link_ctx = build_info.transitive_cc_dependencies.dynamic_linking - trans_libs = get_mangled_libs(trans_link_ctx.libraries_to_link.to_list()) - trans_import_libs = set.to_list(build_info.transitive_import_dependencies) - - _library_deps = trans_libs + trans_import_libs - if hs.toolchain.is_darwin: - # GHC's builtin linker requires .dylib files on MacOS. - library_deps = darwin_convert_to_dylibs(hs, _library_deps) - else: - library_deps = _library_deps + library_deps = get_solibs_for_ghc_linker(hs, build_info) ctx.actions.run_shell( inputs = depset(transitive = [ diff --git a/haskell/private/actions/compile.bzl b/haskell/private/actions/compile.bzl index fe6c6c4002..578b14b4b2 100644 --- a/haskell/private/actions/compile.bzl +++ b/haskell/private/actions/compile.bzl @@ -9,13 +9,12 @@ load( ) load( ":private/path_utils.bzl", - "darwin_convert_to_dylibs", "declare_compiled", "make_path", "target_unique_name", ) load(":private/pkg_id.bzl", "pkg_id") -load(":private/providers.bzl", "get_mangled_libs") +load(":private/providers.bzl", "get_solibs_for_ghc_linker") load(":private/set.bzl", "set") def _process_hsc_file(hs, cc, hsc_flags, hsc_file): @@ -238,16 +237,7 @@ def _compilation_defaults(hs, cc, java, dep_info, srcs, import_dir_map, extra_sr args.add(f) # Transitive library dependencies for runtime. - trans_link_ctx = dep_info.transitive_cc_dependencies.dynamic_linking - trans_libs = get_mangled_libs(trans_link_ctx.libraries_to_link.to_list()) - trans_import_libs = set.to_list(dep_info.transitive_import_dependencies) - - _library_deps = trans_libs + trans_import_libs - if hs.toolchain.is_darwin: - # GHC's builtin linker requires .dylib files on MacOS. - library_deps = darwin_convert_to_dylibs(hs, _library_deps) - else: - library_deps = _library_deps + library_deps = get_solibs_for_ghc_linker(hs, dep_info) ld_library_path = make_path(library_deps) return DefaultCompileInfo( diff --git a/haskell/private/actions/repl.bzl b/haskell/private/actions/repl.bzl index f7068fb6dd..b8f4d16e77 100644 --- a/haskell/private/actions/repl.bzl +++ b/haskell/private/actions/repl.bzl @@ -3,14 +3,13 @@ load(":private/packages.bzl", "expose_packages") load( ":private/path_utils.bzl", - "darwin_convert_to_dylibs", "get_lib_name", "is_shared_library", "ln", "make_path", "target_unique_name", ) -load(":private/providers.bzl", "get_mangled_libs") +load(":private/providers.bzl", "get_solibs_for_ghc_linker") load( ":private/set.bzl", "set", @@ -76,16 +75,7 @@ def build_haskell_repl( args += ["-l{0}".format(lib_name)] # Transitive library dependencies to have in runfiles. - trans_link_ctx = build_info.transitive_cc_dependencies.dynamic_linking - trans_libs = get_mangled_libs(trans_link_ctx.libraries_to_link.to_list()) - trans_import_libs = set.to_list(build_info.transitive_import_dependencies) - - _library_deps = trans_libs + trans_import_libs - if hs.toolchain.is_darwin: - # GHC's builtin linker requires .dylib files on MacOS. - library_deps = darwin_convert_to_dylibs(hs, _library_deps) - else: - library_deps = _library_deps + library_deps = get_solibs_for_ghc_linker(hs, build_info) ld_library_path = make_path( library_deps, prefix = "$RULES_HASKELL_EXEC_ROOT", diff --git a/haskell/private/providers.bzl b/haskell/private/providers.bzl index 48320c4522..426405fa29 100644 --- a/haskell/private/providers.bzl +++ b/haskell/private/providers.bzl @@ -1,3 +1,6 @@ +load(":private/path_utils.bzl", "darwin_convert_to_dylibs") +load(":private/set.bzl", "set") + DefaultCompileInfo = provider( doc = "Default compilation files and configuration.", fields = { @@ -109,6 +112,37 @@ def get_mangled_libs(ext_libs): """Just a dumb helper because skylark doesn’t do lambdas.""" return [ext_lib.mangled_lib for ext_lib in ext_libs] +def get_solibs_for_ghc_linker(hs, build_info): + """Return all C library dependencies for GHC's linker. + + GHC has it's own builtin linker. It is used for Template Haskell, for GHCi, + during doctests, etc. GHC's linker differs from the system's dynamic linker + in some ways. E.g. it strictly assumes that dynamic libraries end on .dylib + on MacOS. + + This function returns a list of all transitive C library dependencies + (static or dynamic), taking the requirements of GHC's linker into account. + + Args: + hs: Haskell context. + build_info: HaskellBinaryInfo provider. + + Returns: + List of library files suitable for GHC's builtin linker. + """ + trans_link_ctx = build_info.transitive_cc_dependencies.dynamic_linking + trans_libs = get_mangled_libs(trans_link_ctx.libraries_to_link.to_list()) + trans_import_libs = set.to_list(build_info.transitive_import_dependencies) + + _library_deps = trans_libs + trans_import_libs + if hs.toolchain.is_darwin: + # GHC's builtin linker requires .dylib files on MacOS. + library_deps = darwin_convert_to_dylibs(hs, _library_deps) + else: + library_deps = _library_deps + + return library_deps + HaskellLibraryInfo = provider( doc = "Library-specific information.", fields = {