Skip to content

Commit a0eb046

Browse files
amitabnmariz
authored andcommitted
BUG20736339: Expect multiple include directories from mysql_config
Patch is provided by the bug reporter. Tests added for regression.
1 parent 8eeb3ae commit a0eb046

File tree

2 files changed

+59
-22
lines changed

2 files changed

+59
-22
lines changed

lib/cpy_distutils.py

Lines changed: 30 additions & 22 deletions
Original file line numberDiff line numberDiff line change
@@ -152,21 +152,7 @@ def unix_lib_is64bit(lib_file):
152152
return False
153153

154154

155-
def get_mysql_config_info(mysql_config):
156-
"""Get MySQL information using mysql_config tool
157-
158-
Returns a dict.
159-
"""
160-
options = ['cflags', 'include', 'libs', 'libs_r', 'plugindir', 'version']
161-
162-
cmd = [mysql_config] + [ "--{0}".format(opt) for opt in options ]
163-
164-
try:
165-
proc = Popen(cmd, stdout=PIPE, universal_newlines=True)
166-
stdout, _ = proc.communicate()
167-
except OSError as exc:
168-
raise DistutilsExecError("Failed executing mysql_config: {0}".format(
169-
str(exc)))
155+
def parse_mysql_config_info(options, stdout):
170156
log.debug("# stdout: {0}".format(stdout))
171157
info = {}
172158
for option, line in zip(options, stdout.split('\n')):
@@ -192,7 +178,28 @@ def get_mysql_config_info(mysql_config):
192178
info['lib_r_dir'] = libs[0].replace('-L', '')
193179
info['libs_r'] = [ lib.replace('-l', '') for lib in libs[1:] ]
194180

195-
info['include'] = info['include'].replace('-I', '')
181+
info['include'] = [x.strip() for x in info['include'].split('-I')[1:]]
182+
183+
return info
184+
185+
186+
def get_mysql_config_info(mysql_config):
187+
"""Get MySQL information using mysql_config tool
188+
189+
Returns a dict.
190+
"""
191+
options = ['cflags', 'include', 'libs', 'libs_r', 'plugindir', 'version']
192+
193+
cmd = [mysql_config] + [ "--{0}".format(opt) for opt in options ]
194+
195+
try:
196+
proc = Popen(cmd, stdout=PIPE, universal_newlines=True)
197+
stdout, _ = proc.communicate()
198+
except OSError as exc:
199+
raise DistutilsExecError("Failed executing mysql_config: {0}".format(
200+
str(exc)))
201+
202+
info = parse_mysql_config_info(options, stdout)
196203

197204
# Try to figure out the architecture
198205
info['arch'] = None
@@ -355,7 +362,7 @@ def _finalize_connector_c(self, connc_loc):
355362
else:
356363
raise OSError("Unsupported platform: %s" % os.name)
357364

358-
include_dir = os.path.join(connc_loc, 'include')
365+
include_dirs = [os.path.join(connc_loc, 'include')]
359366
if os.name == 'nt':
360367
libraries = ['libmysql']
361368
else:
@@ -380,19 +387,20 @@ def _finalize_connector_c(self, connc_loc):
380387
log.error(err_version)
381388
sys.exit(1)
382389

383-
include_dir = myc_info['include']
390+
include_dirs = myc_info['include']
384391
libraries = myc_info['libs']
385392
library_dirs = myc_info['lib_dir']
386393
self._mysql_config_info = myc_info
387394
self.arch = self._mysql_config_info['arch']
388395
connc_64bit = self.arch == 'x86_64'
389396

390-
if not os.path.exists(include_dir):
391-
log.error(err_invalid_loc, connc_loc)
392-
sys.exit(1)
397+
for include_dir in include_dirs:
398+
if not os.path.exists(include_dir):
399+
log.error(err_invalid_loc, connc_loc)
400+
sys.exit(1)
393401

394402
# Set up the build_ext class
395-
self.include_dirs.append(include_dir)
403+
self.include_dirs.extend(include_dirs)
396404
self.libraries.extend(libraries)
397405
self.library_dirs.append(library_dirs)
398406

tests/test_bugs.py

Lines changed: 29 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -53,6 +53,7 @@
5353
errors, constants, pooling)
5454
from mysql.connector.optionfiles import read_option_files
5555
import mysql.connector
56+
import cpy_distutils
5657

5758
try:
5859
from mysql.connector.connection_cext import CMySQLConnection
@@ -4404,3 +4405,31 @@ def test_pure_cnx(self):
44044405
del config["connection_timeout"]
44054406
cursor_class = mysql.connector.cursor.MySQLCursorBufferedRaw
44064407
self._long_query(config, cursor_class)
4408+
4409+
4410+
class BugOra20736339(tests.MySQLConnectorTests):
4411+
"""BUG#20736339: C EXTENSION FAILS TO COMPILE IF MYSQL_CONFIG RETURN MORE
4412+
THAN ONE INCLUDE DIR
4413+
"""
4414+
def test_parse_mysql_config(self):
4415+
options = ['cflags', 'include', 'libs', 'libs_r', 'plugindir', 'version']
4416+
includes = ["/mysql/include", "/mysql/another_include"]
4417+
config = """
4418+
-I/mysql/include -fabi-version=2 -fno-omit-frame-pointer
4419+
-I{0}
4420+
-L/mysql/lib -lmysqlclient -lpthread -lm -lrt -lssl -lcrypto -ldl
4421+
-L/mysql/lib -lmysqlclient -lpthread -lm -lrt -lssl -lcrypto -ldl
4422+
/mysql/lib/plugin
4423+
5.7.17
4424+
"""
4425+
4426+
info = cpy_distutils.parse_mysql_config_info(options,
4427+
config.strip().format(includes[0]))
4428+
self.assertEqual(1, len(info["include"]))
4429+
self.assertEqual(includes[0], info["include"][0])
4430+
4431+
info = cpy_distutils.parse_mysql_config_info(options,
4432+
config.strip().format(" -I".join(includes)))
4433+
self.assertEqual(2, len(info["include"]))
4434+
self.assertEqual(includes[0], info["include"][0])
4435+
self.assertEqual(includes[1], info["include"][1])

0 commit comments

Comments
 (0)