diff options
author | John Cater <jcater@google.com> | 2018-01-24 08:22:24 -0800 |
---|---|---|
committer | Copybara-Service <copybara-piper@google.com> | 2018-01-24 08:24:22 -0800 |
commit | a722342f6529db68bd962b768eb27ef2b5b73eb3 (patch) | |
tree | c24d9d631a98822254cbbc3f8e49b1b6e1055bb2 /tools | |
parent | 1b3569aec8c823cd88fb9eb03a6b6864951976fe (diff) |
Update make_rpm.py to check whether rpmbuild is present and report an error if not.
Fixes #4065.
Change-Id: I17a5d2ee4befc5e467b0a195311566db246eb167
PiperOrigin-RevId: 183087906
Diffstat (limited to 'tools')
-rw-r--r-- | tools/build_defs/pkg/make_rpm.py | 39 | ||||
-rw-r--r-- | tools/build_defs/pkg/make_rpm_test.py | 87 | ||||
-rw-r--r-- | tools/build_defs/pkg/rpm.bzl | 1 |
3 files changed, 100 insertions, 27 deletions
diff --git a/tools/build_defs/pkg/make_rpm.py b/tools/build_defs/pkg/make_rpm.py index 108bd9d972..d98ba88c36 100644 --- a/tools/build_defs/pkg/make_rpm.py +++ b/tools/build_defs/pkg/make_rpm.py @@ -26,6 +26,7 @@ import subprocess import sys from tempfile import mkdtemp +# pylint: disable=g-direct-third-party-import from third_party.py import gflags gflags.DEFINE_string('name', '', 'The name of the software being packaged.') @@ -126,6 +127,31 @@ def CopyAndRewrite(input_file, output_file, replacements=None): output.write(line) +def Which(program): + + def IsExe(fpath): + return os.path.isfile(fpath) and os.access(fpath, os.X_OK) + + for path in os.environ['PATH'].split(os.pathsep): + filename = os.path.join(path, program) + if IsExe(filename): + return filename + + return None + + +class NoRpmbuildFound(Exception): + pass + + +def FindRpmbuild(): + path = Which('rpmbuild') + if path: + return path + else: + raise NoRpmbuildFound() + + class RpmBuilder(object): """A helper class to manage building the RPM file.""" @@ -139,6 +165,7 @@ class RpmBuilder(object): self.version = GetFlagValue(version) self.arch = arch self.files = [] + self.rpmbuild_path = FindRpmbuild() self.rpm_path = None def AddFiles(self, files): @@ -171,7 +198,7 @@ class RpmBuilder(object): """Call rpmbuild with the correct arguments.""" args = [ - 'rpmbuild', + self.rpmbuild_path, '--define', '_topdir %s' % dirname, '--define', @@ -218,9 +245,13 @@ class RpmBuilder(object): def main(argv=()): - builder = RpmBuilder(FLAGS.name, FLAGS.version, FLAGS.arch) - builder.AddFiles(argv[1:]) - return builder.Build(FLAGS.spec_file, FLAGS.out_file) + try: + builder = RpmBuilder(FLAGS.name, FLAGS.version, FLAGS.arch) + builder.AddFiles(argv[1:]) + return builder.Build(FLAGS.spec_file, FLAGS.out_file) + except NoRpmbuildFound: + print('ERROR: rpmbuild is required but is not present in PATH') + return 1 if __name__ == '__main__': diff --git a/tools/build_defs/pkg/make_rpm_test.py b/tools/build_defs/pkg/make_rpm_test.py index 8c871725c0..c384735949 100644 --- a/tools/build_defs/pkg/make_rpm_test.py +++ b/tools/build_defs/pkg/make_rpm_test.py @@ -17,12 +17,29 @@ from __future__ import absolute_import from __future__ import division from __future__ import print_function +import contextlib import os import unittest from tools.build_defs.pkg import make_rpm +@contextlib.contextmanager +def PrependPath(dirs): + with ReplacePath(dirs + [os.environ['PATH']]): + yield + + +@contextlib.contextmanager +def ReplacePath(dirs): + original_path = os.environ['PATH'] + try: + os.environ['PATH'] = os.pathsep.join(dirs) + yield + finally: + os.environ['PATH'] = original_path + + def WriteFile(filename, *contents): with open(filename, 'w') as text_file: text_file.write('\n'.join(contents)) @@ -80,31 +97,55 @@ class MakeRpmTest(unittest.TestCase): self.assertCountEqual(['Some: data1a', 'Other: data2', 'More: data3a'], FileContents('out.txt')) + def testFindRpmbuild_present(self): + with make_rpm.Tempdir() as outer: + dummy = os.sep.join([outer, 'rpmbuild']) + WriteFile(dummy, 'dummy rpmbuild') + os.chmod(dummy, 0o777) + with PrependPath([outer]): + path = make_rpm.FindRpmbuild() + self.assertEqual(dummy, path) + + def testFindRpmbuild_missing(self): + with make_rpm.Tempdir() as outer: + with ReplacePath([outer]): + with self.assertRaises(make_rpm.NoRpmbuildFound) as context: + make_rpm.FindRpmbuild() + self.assertIsNotNone(context) + def testSetupWorkdir(self): - builder = make_rpm.RpmBuilder('test', '1.0', 'x86') with make_rpm.Tempdir() as outer: - # Create spec_file, test files. - WriteFile('test.spec', 'Name: test', 'Version: 0.1', 'Summary: test data') - WriteFile('file1.txt', 'Hello') - WriteFile('file2.txt', 'Goodbye') - builder.AddFiles(['file1.txt', 'file2.txt']) - - with make_rpm.Tempdir(): - # Call RpmBuilder. - builder.SetupWorkdir('test.spec', outer) - - # Make sure files exist. - self.assertTrue(DirExists('SOURCES')) - self.assertTrue(DirExists('BUILD')) - self.assertTrue(DirExists('TMP')) - self.assertTrue(FileExists('test.spec')) - self.assertCountEqual( - ['Name: test', 'Version: 1.0', 'Summary: test data'], - FileContents('test.spec')) - self.assertTrue(FileExists('BUILD/file1.txt')) - self.assertCountEqual(['Hello'], FileContents('BUILD/file1.txt')) - self.assertTrue(FileExists('BUILD/file2.txt')) - self.assertCountEqual(['Goodbye'], FileContents('BUILD/file2.txt')) + dummy = os.sep.join([outer, 'rpmbuild']) + WriteFile(dummy, 'dummy rpmbuild') + os.chmod(dummy, 0o777) + + with PrependPath([outer]): + # Create the builder and exercise it. + builder = make_rpm.RpmBuilder('test', '1.0', 'x86') + + # Create spec_file, test files. + WriteFile('test.spec', 'Name: test', 'Version: 0.1', + 'Summary: test data') + WriteFile('file1.txt', 'Hello') + WriteFile('file2.txt', 'Goodbye') + builder.AddFiles(['file1.txt', 'file2.txt']) + + with make_rpm.Tempdir(): + # Call RpmBuilder. + builder.SetupWorkdir('test.spec', outer) + + # Make sure files exist. + self.assertTrue(DirExists('SOURCES')) + self.assertTrue(DirExists('BUILD')) + self.assertTrue(DirExists('TMP')) + self.assertTrue(FileExists('test.spec')) + self.assertCountEqual( + ['Name: test', 'Version: 1.0', 'Summary: test data'], + FileContents('test.spec')) + self.assertTrue(FileExists('BUILD/file1.txt')) + self.assertCountEqual(['Hello'], FileContents('BUILD/file1.txt')) + self.assertTrue(FileExists('BUILD/file2.txt')) + self.assertCountEqual(['Goodbye'], FileContents('BUILD/file2.txt')) if __name__ == '__main__': diff --git a/tools/build_defs/pkg/rpm.bzl b/tools/build_defs/pkg/rpm.bzl index 2322dfae77..2db0e82648 100644 --- a/tools/build_defs/pkg/rpm.bzl +++ b/tools/build_defs/pkg/rpm.bzl @@ -54,6 +54,7 @@ def _pkg_rpm_impl(ctx): # TODO(katre): Generate a source RPM. ctx.action( executable = ctx.executable._make_rpm, + use_default_shell_env = True, arguments = args, inputs = files, outputs = [ctx.outputs.rpm], |