fix: missing flags and envs while building wheels
Signed-off-by: Thulio Ferraz Assis <3149049+f0rmiga@users.noreply.github.com>
diff --git a/python/pip_install/pip_repository.bzl b/python/pip_install/pip_repository.bzl
index d5d93f3..3f46345 100644
--- a/python/pip_install/pip_repository.bzl
+++ b/python/pip_install/pip_repository.bzl
@@ -20,6 +20,7 @@
load("//python/pip_install/private:srcs.bzl", "PIP_INSTALL_PY_SRCS")
CPPFLAGS = "CPPFLAGS"
+LDFLAGS = "LDFLAGS"
COMMAND_LINE_TOOLS_PATH_SLUG = "commandlinetools"
@@ -110,7 +111,7 @@
"-isysroot {}/SDKs/MacOSX.sdk".format(xcode_root),
]
-def _get_toolchain_unix_cflags(rctx):
+def _get_toolchain_unix_cflags(rctx, c_compiler):
"""Gather cflags from a standalone toolchain for unix systems.
Pip won't be able to compile c extensions from sdists with the pre built python distributions from indygreg
@@ -125,6 +126,25 @@
if not is_standalone_interpreter(rctx, rctx.attr.python_interpreter_target):
return []
+ include_paths = []
+
+ is_clang = False
+ if c_compiler:
+ err = rctx.execute([c_compiler, "-v"])
+ out = err.stderr.strip()
+ is_clang = "clang" in out.split("\n")[0]
+
+ if is_clang:
+ args = ["-E", "-Wp,-v", "-xc", "-"]
+ else:
+ args = ["-E", "-Wp,-v", "-xc++", "-"]
+ err = rctx.execute([c_compiler] + args)
+ out = err.stderr.strip()
+ parsed = [line.strip() for line in out.split("\n") if line.startswith(" ")]
+ if is_clang:
+ include_paths.append(parsed[0] + "/../../../../include/c++/v1")
+ include_paths += parsed
+
er = rctx.execute([
rctx.path(rctx.attr.python_interpreter_target).realpath,
"-c",
@@ -132,13 +152,39 @@
])
if er.return_code != 0:
fail("could not get python version from interpreter (status {}): {}".format(er.return_code, er.stderr))
- _python_version = er.stdout
- include_path = "{}/include/python{}".format(
+ _python_version = er.stdout.strip()
+ include_paths.append("{}/include/python{}".format(
get_interpreter_dirname(rctx, rctx.attr.python_interpreter_target),
_python_version,
- )
+ ))
- return ["-isystem {}".format(include_path)]
+ include_flags = ["-isystem {}".format(include_path) for include_path in include_paths]
+
+ extra_flags = []
+ if is_clang:
+ extra_flags.append("-stdlib=libc++")
+
+ return include_flags + extra_flags
+
+def _get_toolchain_unix_ldflags(rctx):
+ """Gather ldflags from a standalone toolchain for unix systems.
+ """
+
+ # Only run on Unix systems
+ if not rctx.os.name.lower().startswith(("mac os", "linux")):
+ return []
+
+ library_paths = []
+
+ ld = rctx.which("ld")
+ if ld:
+ err = rctx.execute([ld, "--verbose"])
+ out = err.stdout.strip()
+ for line in out.split("\n"):
+ if "SEARCH_DIR" in line:
+ library_paths.extend([line.replace("SEARCH_DIR(\"=", "").replace("\");", "") for line in line.strip().split(" ")])
+
+ return ["-L{}".format(library_path) for library_path in library_paths]
def use_isolated(ctx, attr):
"""Determine whether or not to pass the pip `--isolated` flag to the pip invocation.
@@ -214,16 +260,27 @@
Dictionary of environment variable suitable to pass to rctx.execute.
"""
+ c_compiler = rctx.which(rctx.os.environ.get("CC", "cc"))
+ cxx_compiler = rctx.which(rctx.os.environ.get("CXX", "c++"))
+
# Gather any available CPPFLAGS values
cppflags = []
cppflags.extend(_get_xcode_location_cflags(rctx))
- cppflags.extend(_get_toolchain_unix_cflags(rctx))
+ cppflags.extend(_get_toolchain_unix_cflags(rctx, c_compiler))
+
+ ldflags = _get_toolchain_unix_ldflags(rctx)
env = {
"PYTHONPATH": _construct_pypath(rctx),
CPPFLAGS: " ".join(cppflags),
+ LDFLAGS: " ".join(ldflags),
}
+ if c_compiler:
+ env["CC"] = str(c_compiler)
+ if cxx_compiler:
+ env["CXX"] = str(cxx_compiler)
+
return env
_BUILD_FILE_CONTENTS = """\