Skip to content

Commit aaedbc0

Browse files
authored
feat: configurable ldflags (#1226)
1 parent a8421af commit aaedbc0

File tree

5 files changed

+136
-27
lines changed

5 files changed

+136
-27
lines changed

foreign_cc/configure.bzl

Lines changed: 23 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -74,7 +74,6 @@ def _create_configure_script(configureParameters):
7474

7575
user_env = expand_locations_and_make_variables(ctx, ctx.attr.env, "env", data)
7676

77-
make_commands = []
7877
prefix = "{} ".format(expand_locations_and_make_variables(ctx, attrs.tool_prefix, "tool_prefix", data)) if attrs.tool_prefix else ""
7978
configure_prefix = "{} ".format(expand_locations_and_make_variables(ctx, ctx.attr.configure_prefix, "configure_prefix", data)) if ctx.attr.configure_prefix else ""
8079
configure_options = [expand_locations_and_make_variables(ctx, option, "configure_option", data) for option in ctx.attr.configure_options] if ctx.attr.configure_options else []
@@ -83,15 +82,6 @@ def _create_configure_script(configureParameters):
8382
if xcompile_options:
8483
configure_options.extend(xcompile_options)
8584

86-
for target in ctx.attr.targets:
87-
# Configure will have generated sources into `$BUILD_TMPDIR` so make sure we `cd` there
88-
make_commands.append("{prefix}{make} {target} {args}".format(
89-
prefix = prefix,
90-
make = attrs.make_path,
91-
args = args,
92-
target = target,
93-
))
94-
9585
configure = create_configure_script(
9686
workspace_name = ctx.workspace_name,
9787
tools = tools,
@@ -112,8 +102,12 @@ def _create_configure_script(configureParameters):
112102
autogen = ctx.attr.autogen,
113103
autogen_command = ctx.attr.autogen_command,
114104
autogen_options = ctx.attr.autogen_options,
115-
make_commands = make_commands,
105+
make_prefix = prefix,
116106
make_path = attrs.make_path,
107+
make_targets = ctx.attr.targets,
108+
make_args = args,
109+
executable_ldflags_vars = ctx.attr.executable_ldflags_vars,
110+
shared_ldflags_vars = ctx.attr.shared_ldflags_vars,
117111
)
118112
return define_install_prefix + configure
119113

@@ -198,6 +192,15 @@ def _attrs():
198192
),
199193
default = False,
200194
),
195+
"executable_ldflags_vars": attr.string_list(
196+
doc = (
197+
"A list of variable names use as LDFLAGS for executables. These variables " +
198+
"will be passed to the make command as make vars and overwrite what is defined in " +
199+
"the Makefile."
200+
),
201+
mandatory = False,
202+
default = [],
203+
),
201204
"install_prefix": attr.string(
202205
doc = (
203206
"Install prefix, i.e. relative path to where to install the result of the build. " +
@@ -212,6 +215,15 @@ def _attrs():
212215
mandatory = False,
213216
default = "--prefix=",
214217
),
218+
"shared_ldflags_vars": attr.string_list(
219+
doc = (
220+
"A list of variable names use as LDFLAGS for shared libraries. These variables " +
221+
"will be passed to the make command as make vars and overwrite what is defined in " +
222+
"the Makefile."
223+
),
224+
mandatory = False,
225+
default = [],
226+
),
215227
"targets": attr.string_list(
216228
doc = (
217229
"A list of targets within the foreign build system to produce. An empty string (`\"\"`) will result in " +

foreign_cc/make.bzl

Lines changed: 25 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -74,7 +74,13 @@ def _create_make_script(configureParameters):
7474
deps = ctx.attr.deps,
7575
inputs = inputs,
7676
env_vars = user_env,
77-
make_commands = make_commands,
77+
make_prefix = prefix,
78+
make_path = attrs.make_path,
79+
make_targets = ctx.attr.targets,
80+
make_args = args,
81+
make_install_prefix = ctx.attr.install_prefix,
82+
executable_ldflags_vars = ctx.attr.executable_ldflags_vars,
83+
shared_ldflags_vars = ctx.attr.shared_ldflags_vars,
7884
)
7985

8086
def _attrs():
@@ -83,6 +89,15 @@ def _attrs():
8389
"args": attr.string_list(
8490
doc = "A list of arguments to pass to the call to `make`",
8591
),
92+
"executable_ldflags_vars": attr.string_list(
93+
doc = (
94+
"A string list of variable names use as LDFLAGS for executables. These variables " +
95+
"will be passed to the make command as make vars and overwrite what is defined in " +
96+
"the Makefile."
97+
),
98+
mandatory = False,
99+
default = [],
100+
),
86101
"install_prefix": attr.string(
87102
doc = (
88103
"Install prefix, i.e. relative path to where to install the result of the build. " +
@@ -91,6 +106,15 @@ def _attrs():
91106
mandatory = False,
92107
default = "$$INSTALLDIR$$",
93108
),
109+
"shared_ldflags_vars": attr.string_list(
110+
doc = (
111+
"A string list of variable names use as LDFLAGS for shared libraries. These variables " +
112+
"will be passed to the make command as make vars and overwrite what is defined in " +
113+
"the Makefile."
114+
),
115+
mandatory = False,
116+
default = [],
117+
),
94118
"targets": attr.string_list(
95119
doc = (
96120
"A list of targets within the foreign build system to produce. An empty string (`\"\"`) will result in " +

foreign_cc/private/configure_script.bzl

Lines changed: 18 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,5 @@
11
# buildifier: disable=module-docstring
2-
load(":make_env_vars.bzl", "get_make_env_vars")
2+
load(":make_env_vars.bzl", "get_ldflags_make_vars", "get_make_env_vars")
33
load(":make_script.bzl", "pkgconfig_script")
44

55
# buildifier: disable=function-docstring
@@ -23,8 +23,12 @@ def create_configure_script(
2323
autogen,
2424
autogen_command,
2525
autogen_options,
26+
make_prefix,
2627
make_path,
27-
make_commands):
28+
make_targets,
29+
make_args,
30+
executable_ldflags_vars,
31+
shared_ldflags_vars):
2832
ext_build_dirs = inputs.ext_build_dirs
2933

3034
script = pkgconfig_script(ext_build_dirs)
@@ -77,6 +81,18 @@ def create_configure_script(
7781
user_options = " ".join(user_options),
7882
))
7983

84+
ldflags_make_vars = get_ldflags_make_vars(executable_ldflags_vars, shared_ldflags_vars, workspace_name, flags, env_vars, deps, inputs)
85+
86+
make_commands = []
87+
for target in make_targets:
88+
make_commands.append("{prefix}{make} {make_vars} {target} {args}".format(
89+
prefix = make_prefix,
90+
make = make_path,
91+
make_vars = ldflags_make_vars,
92+
args = make_args,
93+
target = target,
94+
))
95+
8096
script.extend(make_commands)
8197
script.append("##disable_tracing##")
8298

foreign_cc/private/make_env_vars.bzl

Lines changed: 47 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -34,6 +34,24 @@ def get_make_env_vars(
3434
return " ".join(["{}=\"{}\""
3535
.format(key, _join_flags_list(workspace_name, vars[key])) for key in vars])
3636

37+
# buildifier: disable=function-docstring
38+
def get_ldflags_make_vars(
39+
executable_ldflags_vars,
40+
shared_ldflags_vars,
41+
workspace_name,
42+
flags,
43+
user_vars,
44+
deps,
45+
inputs):
46+
vars = _get_ldflags_vars(executable_ldflags_vars, shared_ldflags_vars, flags, user_vars)
47+
48+
deps_flags = _define_deps_flags(deps, inputs)
49+
for key in vars.keys():
50+
vars[key] = vars[key] + deps_flags.libs
51+
52+
return " ".join(["{}=\"{}\""
53+
.format(key, _join_flags_list(workspace_name, vars[key])) for key in vars])
54+
3755
def _define_deps_flags(deps, inputs):
3856
# It is very important to keep the order for the linker => put them into list
3957
lib_dirs = []
@@ -99,17 +117,7 @@ _MAKE_TOOLS = {
99117
}
100118

101119
def _get_make_variables(workspace_name, tools, flags, user_env_vars, make_commands):
102-
vars = {}
103-
104-
for flag in _MAKE_FLAGS:
105-
toolchain_flags = getattr(flags, _MAKE_FLAGS[flag], [])
106-
user_flags = [
107-
user_flag
108-
for user_flag in user_env_vars.get(flag, "").split(" ")
109-
if user_flag
110-
]
111-
if toolchain_flags or user_flags:
112-
vars[flag] = toolchain_flags + user_flags
120+
vars = _merge_env_vars(flags, _MAKE_FLAGS, user_env_vars)
113121

114122
# Add user defined CPPFLAGS
115123
user_cpp_flags = [flag for flag in user_env_vars.get("CPPFLAGS", "").split(" ") if flag]
@@ -146,6 +154,34 @@ def _get_make_variables(workspace_name, tools, flags, user_env_vars, make_comman
146154

147155
return vars
148156

157+
def _get_ldflags_vars(
158+
executable_ldflags_vars,
159+
shared_ldflags_vars,
160+
flags,
161+
user_env_vars):
162+
executable_ldflags = {var: "cxx_linker_executable" for var in executable_ldflags_vars}
163+
shared_ldflags = {var: "cxx_linker_shared" for var in shared_ldflags_vars}
164+
165+
linker_make_flags = {}
166+
for ldflags in [executable_ldflags, shared_ldflags]:
167+
linker_make_flags.update(ldflags)
168+
169+
return _merge_env_vars(flags, linker_make_flags, user_env_vars)
170+
171+
def _merge_env_vars(flags, make_flags, user_env_vars):
172+
vars = {}
173+
174+
for flag in make_flags:
175+
toolchain_flags = getattr(flags, make_flags[flag], [])
176+
user_flags = [
177+
user_flag
178+
for user_flag in user_env_vars.get(flag, "").split(" ")
179+
if user_flag
180+
]
181+
if toolchain_flags or user_flags:
182+
vars[flag] = toolchain_flags + user_flags
183+
return vars
184+
149185
def _absolutize(workspace_name, text, force = False):
150186
return absolutize_path_in_str(workspace_name, "$$EXT_BUILD_ROOT$$/", text, force)
151187

foreign_cc/private/make_script.bzl

Lines changed: 23 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
"""A module for creating the build script for `make` builds"""
22

3-
load(":make_env_vars.bzl", "get_make_env_vars")
3+
load(":make_env_vars.bzl", "get_ldflags_make_vars", "get_make_env_vars")
44

55
# buildifier: disable=function-docstring
66
def create_make_script(
@@ -11,15 +11,36 @@ def create_make_script(
1111
env_vars,
1212
deps,
1313
inputs,
14-
make_commands):
14+
make_prefix,
15+
make_path,
16+
make_targets,
17+
make_args,
18+
make_install_prefix,
19+
executable_ldflags_vars,
20+
shared_ldflags_vars):
1521
ext_build_dirs = inputs.ext_build_dirs
1622

1723
script = pkgconfig_script(ext_build_dirs)
1824

1925
script.append("##symlink_contents_to_dir## $$EXT_BUILD_ROOT$$/{} $$BUILD_TMPDIR$$ False".format(root))
2026

2127
script.append("##enable_tracing##")
28+
29+
ldflags_make_vars = get_ldflags_make_vars(executable_ldflags_vars, shared_ldflags_vars, workspace_name, flags, env_vars, deps, inputs)
30+
31+
make_commands = []
32+
for target in make_targets:
33+
make_commands.append("{prefix}{make} {make_vars} {target} {args} PREFIX={install_prefix}".format(
34+
prefix = make_prefix,
35+
make = make_path,
36+
make_vars = ldflags_make_vars,
37+
args = make_args,
38+
target = target,
39+
install_prefix = make_install_prefix,
40+
))
41+
2242
configure_vars = get_make_env_vars(workspace_name, tools, flags, env_vars, deps, inputs, make_commands)
43+
2344
script.extend(["{env_vars} {command}".format(
2445
env_vars = configure_vars,
2546
command = command,

0 commit comments

Comments
 (0)