Skip to content

Commit e8c4f54

Browse files
authored
fix: prepend Pybind11Extension flags rather than appending them. (#2808)
This allows users to set e.g. `extra_compile_args=["-g"]` (temporarily, for debugging purposes) and not have that get overridden by Pybind11Extension's default `-g0`. In order to minimize "order inversion" (not that it really matters, though) I chose to collect all flags and add them at once (hence the dropping of `*args`). I also dropped flag deduplication, which seems unneeded.
1 parent 4853408 commit e8c4f54

File tree

1 file changed

+25
-18
lines changed

1 file changed

+25
-18
lines changed

pybind11/setup_helpers.py

Lines changed: 25 additions & 18 deletions
Original file line numberDiff line numberDiff line change
@@ -99,15 +99,14 @@ class Pybind11Extension(_Extension):
9999
this is an ugly old-style class due to Distutils.
100100
"""
101101

102-
def _add_cflags(self, *flags):
103-
for flag in flags:
104-
if flag not in self.extra_compile_args:
105-
self.extra_compile_args.append(flag)
102+
# flags are prepended, so that they can be further overridden, e.g. by
103+
# ``extra_compile_args=["-g"]``.
106104

107-
def _add_lflags(self, *flags):
108-
for flag in flags:
109-
if flag not in self.extra_link_args:
110-
self.extra_link_args.append(flag)
105+
def _add_cflags(self, flags):
106+
self.extra_compile_args[:0] = flags
107+
108+
def _add_ldflags(self, flags):
109+
self.extra_link_args[:0] = flags
111110

112111
def __init__(self, *args, **kwargs):
113112

@@ -139,13 +138,17 @@ def __init__(self, *args, **kwargs):
139138
# Have to use the accessor manually to support Python 2 distutils
140139
Pybind11Extension.cxx_std.__set__(self, cxx_std)
141140

141+
cflags = []
142+
ldflags = []
142143
if WIN:
143-
self._add_cflags("/EHsc", "/bigobj")
144+
cflags += ["/EHsc", "/bigobj"]
144145
else:
145-
self._add_cflags("-fvisibility=hidden", "-g0")
146+
cflags += ["-fvisibility=hidden", "-g0"]
146147
if MACOS:
147-
self._add_cflags("-stdlib=libc++")
148-
self._add_lflags("-stdlib=libc++")
148+
cflags += ["-stdlib=libc++"]
149+
ldflags += ["-stdlib=libc++"]
150+
self._add_cflags(cflags)
151+
self._add_ldflags(ldflags)
149152

150153
@property
151154
def cxx_std(self):
@@ -174,7 +177,8 @@ def cxx_std(self, level):
174177
if not level:
175178
return
176179

177-
self.extra_compile_args.append(STD_TMPL.format(level))
180+
cflags = [STD_TMPL.format(level)]
181+
ldflags = []
178182

179183
if MACOS and "MACOSX_DEPLOYMENT_TARGET" not in os.environ:
180184
# C++17 requires a higher min version of macOS. An earlier version
@@ -186,18 +190,21 @@ def cxx_std(self, level):
186190
desired_macos = (10, 9) if level < 17 else (10, 14)
187191
macos_string = ".".join(str(x) for x in min(current_macos, desired_macos))
188192
macosx_min = "-mmacosx-version-min=" + macos_string
189-
self.extra_compile_args.append(macosx_min)
190-
self.extra_link_args.append(macosx_min)
193+
cflags += [macosx_min]
194+
ldflags += [macosx_min]
191195

192196
if PY2:
193197
if WIN:
194198
# Will be ignored on MSVC 2015, where C++17 is not supported so
195199
# this flag is not valid.
196-
self.extra_compile_args.append("/wd5033")
200+
cflags += ["/wd5033"]
197201
elif level >= 17:
198-
self.extra_compile_args.append("-Wno-register")
202+
cflags += ["-Wno-register"]
199203
elif level >= 14:
200-
self.extra_compile_args.append("-Wno-deprecated-register")
204+
cflags += ["-Wno-deprecated-register"]
205+
206+
self._add_cflags(cflags)
207+
self._add_ldflags(ldflags)
201208

202209

203210
# Just in case someone clever tries to multithread

0 commit comments

Comments
 (0)