95 lines
3.5 KiB
Python
95 lines
3.5 KiB
Python
|
"""Package list handling"""
|
||
|
|
||
|
load(":private/set.bzl", "set")
|
||
|
|
||
|
def pkg_info_to_compile_flags(pkg_info, for_plugin = False):
|
||
|
"""Map package info to GHC command-line arguments.
|
||
|
|
||
|
Args:
|
||
|
pkg_info: Package info collected by `ghc_info()`.
|
||
|
for_plugin: Whether the package is a plugin dependency.
|
||
|
|
||
|
Returns:
|
||
|
The list of command-line arguments that should be passed to GHC.
|
||
|
"""
|
||
|
namespace = "plugin-" if for_plugin else ""
|
||
|
args = [
|
||
|
# In compile.bzl, we pass this just before all -package-id
|
||
|
# arguments. Not doing so leads to bizarre compile-time failures.
|
||
|
# It turns out that equally, not doing so leads to bizarre
|
||
|
# link-time failures. See
|
||
|
# https://github.com/tweag/rules_haskell/issues/395.
|
||
|
"-hide-all-{}packages".format(namespace),
|
||
|
]
|
||
|
|
||
|
if not pkg_info.has_version:
|
||
|
args.extend([
|
||
|
# Macro version are disabled for all packages by default
|
||
|
# and enabled for package with version
|
||
|
# see https://github.com/tweag/rules_haskell/issues/414
|
||
|
"-fno-version-macros",
|
||
|
])
|
||
|
|
||
|
for package in pkg_info.packages:
|
||
|
args.extend(["-{}package".format(namespace), package])
|
||
|
|
||
|
for package_id in pkg_info.package_ids:
|
||
|
args.extend(["-{}package-id".format(namespace), package_id])
|
||
|
|
||
|
for package_db in pkg_info.package_dbs:
|
||
|
args.extend(["-package-db", package_db])
|
||
|
|
||
|
return args
|
||
|
|
||
|
def expose_packages(hs_info, lib_info, use_direct, use_my_pkg_id, custom_package_databases, version):
|
||
|
"""
|
||
|
Returns the information that is needed by GHC in order to enable haskell
|
||
|
packages.
|
||
|
|
||
|
hs_info: is common to all builds
|
||
|
version: if the rule contains a version, we will export the CPP version macro
|
||
|
|
||
|
All the other arguments are not understood well:
|
||
|
|
||
|
lib_info: only used for repl and linter
|
||
|
use_direct: only used for repl and linter
|
||
|
use_my_pkg_id: only used for one specific task in compile.bzl
|
||
|
custom_package_databases: override the package_databases of hs_info, used only by the repl
|
||
|
"""
|
||
|
has_version = version != None and version != ""
|
||
|
|
||
|
# Expose all prebuilt dependencies
|
||
|
#
|
||
|
# We have to remember to specify all (transitive) wired-in
|
||
|
# dependencies or we can't find objects for linking
|
||
|
#
|
||
|
# Set use_direct if hs_info does not have a direct_prebuilt_deps field.
|
||
|
packages = []
|
||
|
for prebuilt_dep in set.to_list(hs_info.direct_prebuilt_deps if use_direct else hs_info.prebuilt_dependencies):
|
||
|
packages.append(prebuilt_dep.package)
|
||
|
|
||
|
# Expose all bazel dependencies
|
||
|
package_ids = []
|
||
|
for package in set.to_list(hs_info.package_ids):
|
||
|
# XXX: repl and lint uses this lib_info flags
|
||
|
# It is set to None in all other usage of this function
|
||
|
# TODO: find the meaning of this flag
|
||
|
if lib_info == None or package != lib_info.package_id:
|
||
|
# XXX: use_my_pkg_id is not None only in compile.bzl
|
||
|
if (use_my_pkg_id == None) or package != use_my_pkg_id:
|
||
|
package_ids.append(package)
|
||
|
|
||
|
# Only include package DBs for deps, prebuilt deps should be found
|
||
|
# auto-magically by GHC
|
||
|
package_dbs = []
|
||
|
for cache in set.to_list(hs_info.package_databases if not custom_package_databases else custom_package_databases):
|
||
|
package_dbs.append(cache.dirname)
|
||
|
|
||
|
ghc_info = struct(
|
||
|
has_version = has_version,
|
||
|
packages = packages,
|
||
|
package_ids = package_ids,
|
||
|
package_dbs = package_dbs,
|
||
|
)
|
||
|
return ghc_info
|