Skip to content

Commit

Permalink
Factor out uses of darwin_convert_to_dylibs
Browse files Browse the repository at this point in the history
Addressing PR review comments.

Reducing the risk of future refactorings introducing subtle bugs by
missing required steps in get_solibs_for_ghc_linker.
  • Loading branch information
aherrmann committed Jan 30, 2019
1 parent b9cafe1 commit bb1b9eb
Show file tree
Hide file tree
Showing 5 changed files with 42 additions and 48 deletions.
14 changes: 2 additions & 12 deletions haskell/doctest.bzl
Original file line number Diff line number Diff line change
Expand Up @@ -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",
Expand Down Expand Up @@ -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
Expand Down
14 changes: 2 additions & 12 deletions haskell/lint.bzl
Original file line number Diff line number Diff line change
Expand Up @@ -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):
Expand Down Expand Up @@ -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 = [
Expand Down
14 changes: 2 additions & 12 deletions haskell/private/actions/compile.bzl
Original file line number Diff line number Diff line change
Expand Up @@ -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):
Expand Down Expand Up @@ -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(
Expand Down
14 changes: 2 additions & 12 deletions haskell/private/actions/repl.bzl
Original file line number Diff line number Diff line change
Expand Up @@ -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",
Expand Down Expand Up @@ -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",
Expand Down
34 changes: 34 additions & 0 deletions haskell/private/providers.bzl
Original file line number Diff line number Diff line change
@@ -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 = {
Expand Down Expand Up @@ -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 = {
Expand Down

0 comments on commit bb1b9eb

Please sign in to comment.