diff -r a30cdf366c02 Lib/distutils/command/install_lib.py --- a/Lib/distutils/command/install_lib.py Tue Jan 10 11:30:44 2017 +0800 +++ b/Lib/distutils/command/install_lib.py Tue Jan 10 16:41:30 2017 +0100 @@ -140,18 +140,31 @@ # -- Utility methods ----------------------------------------------- - def _mutate_outputs(self, has_any, build_cmd, cmd_option, output_dir): - if not has_any: + def _pure_outputs(self): + if not self.distribution.has_pure_modules(): return [] - build_cmd = self.get_finalized_command(build_cmd) + build_cmd = self.get_finalized_command('build_py') build_files = build_cmd.get_outputs() - build_dir = getattr(build_cmd, cmd_option) + build_dir = getattr(build_cmd, 'build_lib') prefix_len = len(build_dir) + len(os.sep) outputs = [] for file in build_files: - outputs.append(os.path.join(output_dir, file[prefix_len:])) + outputs.append(os.path.join(self.install_dir, file[prefix_len:])) + + return outputs + + def _ext_outputs(self): + if not self.distribution.has_ext_modules(): + return [] + + build_cmd = self.get_finalized_command('build_ext') + + outputs = [] + for ext in build_cmd.extensions: + filename = build_cmd.get_ext_filename(ext.name) + outputs.append(os.path.join(self.install_dir, filename)) return outputs @@ -182,19 +195,14 @@ were actually run. Not affected by the "dry-run" flag or whether modules have actually been built yet. """ - pure_outputs = \ - self._mutate_outputs(self.distribution.has_pure_modules(), - 'build_py', 'build_lib', - self.install_dir) + pure_outputs = self._pure_outputs() + if self.compile: bytecode_outputs = self._bytecode_filenames(pure_outputs) else: bytecode_outputs = [] - ext_outputs = \ - self._mutate_outputs(self.distribution.has_ext_modules(), - 'build_ext', 'build_lib', - self.install_dir) + ext_outputs = self._ext_outputs() return pure_outputs + bytecode_outputs + ext_outputs diff -r a30cdf366c02 Lib/distutils/tests/test_install_lib.py --- a/Lib/distutils/tests/test_install_lib.py Tue Jan 10 11:30:44 2017 +0800 +++ b/Lib/distutils/tests/test_install_lib.py Tue Jan 10 16:41:30 2017 +0100 @@ -6,6 +6,7 @@ from distutils.command.install_lib import install_lib from distutils.extension import Extension +from distutils.sysconfig import get_config_var from distutils.tests import support from distutils.errors import DistutilsOptionError from test.support import run_unittest @@ -70,6 +71,25 @@ outputs = cmd.get_outputs() self.assertEqual(len(outputs), 4, outputs) + def test_get_outputs_inplace_ext(self): + # ensure get_outputs() is correct with extensions built inplace + project_dir, dist = self.create_dist() + build_ext_cmd = dist.get_command_obj('build_ext') + build_ext_cmd.inplace = 1 + os.chdir(project_dir) + cmd = install_lib(dist) + + # setting up a dist environment + cmd.install_dir = self.mkdtemp() + cmd.distribution.ext_modules = [Extension('foo', ['xxx'])] + cmd.distribution.script_name = 'setup.py' + + # get_outputs should return foo.import-tag-abiflags.so + actual = cmd.get_outputs() + expected = [os.path.join(cmd.install_dir, + 'foo' + get_config_var('EXT_SUFFIX'))] + self.assertEqual(expected, actual) + def test_get_inputs(self): project_dir, dist = self.create_dist() os.chdir(project_dir) diff -r a30cdf366c02 Misc/ACKS --- a/Misc/ACKS Tue Jan 10 11:30:44 2017 +0800 +++ b/Misc/ACKS Tue Jan 10 16:41:30 2017 +0100 @@ -1453,6 +1453,7 @@ Quentin Stafford-Fraser Frank Stajano Joel Stanley +Elvis Stansvik Anthony Starks Oliver Steele Greg Stein diff -r a30cdf366c02 Misc/NEWS --- a/Misc/NEWS Tue Jan 10 11:30:44 2017 +0800 +++ b/Misc/NEWS Tue Jan 10 16:41:30 2017 +0100 @@ -547,6 +547,9 @@ - Issue #24142: Reading a corrupt config file left configparser in an invalid state. Original patch by Florian Höch. +- Issue #29225: distutils.command.install_lib.get_outputs() wrong with + extensions built inplace. + Windows -------