Beispiel #1
0
    def test_growing_current_inputs(self):
        cr = compile_rule.find_compile_rule('genfiles/computed_inputs/curr2')
        self._write_to('a1', '')
        self.assertEqual([], cr.input_files('genfiles/computed_inputs/curr2'))
        self.assertEqual(
            ['a1'], cr.input_trigger_files('genfiles/computed_inputs/curr2'))

        self._write_to('a1', 'b1,number3')
        filemod_db.clear_mtime_cache()

        with self.assertCalled(cr.input_patterns.input_patterns, 1):
            self.assertEqual(['b1', 'number3'],
                             cr.input_files('genfiles/computed_inputs/curr2'))
            self.assertEqual(
                ['a1', 'b1', 'number3'],
                cr.input_trigger_files('genfiles/computed_inputs/curr2'))

        # Let's keep going!
        self._write_to('b1', 'b2')
        filemod_db.clear_mtime_cache()
        # Since a1 and number3 didn't change, we should only judge based on b1.
        self.assertEqual(['b2'],
                         cr.input_files('genfiles/computed_inputs/curr2'))
        self.assertEqual(
            ['a1', 'b2'],
            cr.input_trigger_files('genfiles/computed_inputs/curr2'))
Beispiel #2
0
    def test_compute_crc_flag(self):
        self._add_to_db('o1', 'i1', compute_crc=True)
        self._change_mtime('i1')
        filemod_db.clear_mtime_cache()

        self._maybe_update('o1', ['i1'], compute_crc=True)
        with open(self._abspath('o1')) as f:
            self.assertEqual('o1o1o1o1o1', f.read())
Beispiel #3
0
    def test_recompute_inputs_if_changed(self):
        cr = compile_rule.find_compile_rule('genfiles/a.ii')
        self.assertEqual(['a.c', 'a.h', 'includes/b.h', 'includes/c.h', 'a1'],
                         cr.input_files('genfiles/a.ii'))

        self._write_to('a.h', '#include "includes/d.h"  /* new include */ \n')
        filemod_db.clear_mtime_cache()

        with self.assertCalled(cr.input_patterns.input_patterns, 1):
            self.assertEqual(['a.c', 'a.h', 'includes/d.h', 'a1'],
                             cr.input_files('genfiles/a.ii'))
Beispiel #4
0
    def test_trigger_changes_on_genfiles(self):
        cr = compile_rule.find_compile_rule('genfiles/computed_inputs/a2')
        with self.assertCalled(cr.input_patterns.input_patterns, 1):
            self.assertEqual(['a2'],
                             cr.input_files('genfiles/computed_inputs/a2'))

        self._write_to('number3', '')
        filemod_db.clear_mtime_cache()

        with self.assertCalled(cr.input_patterns.input_patterns, 1):
            self.assertEqual(['a2'],
                             cr.input_files('genfiles/computed_inputs/a2'))
Beispiel #5
0
    def test_recompute_inputs_even_if_mtime_doesnt_change(self):
        cr = compile_rule.find_compile_rule('genfiles/a.ii')
        self.assertEqual(['a.c', 'a.h', 'includes/b.h', 'includes/c.h', 'a1'],
                         cr.input_files('genfiles/a.ii'))

        # modify includes/a.h without modifying its mtime
        mtime = os.path.getmtime(self._abspath('a.h'))
        self._write_to('a.h', '#include "includes/d.h" // change the include')
        os.utime(self._abspath('a.h'), (mtime, mtime))
        filemod_db.clear_mtime_cache()

        self.assertEqual(['a.c', 'a.h', 'includes/d.h', 'a1'],
                         cr.input_files('genfiles/a.ii'))
Beispiel #6
0
    def test_computed_inputs_from_file(self):
        self._write_to('a1', 'a1,a2,genfiles/fnumber')
        cr = compile_rule.find_compile_rule('genfiles/computed_inputs/content')
        self.assertEqual(['a1', 'a2', 'genfiles/fnumber'],
                         cr.input_files('genfiles/computed_inputs/content'))

        self._write_to('a1', 'b1,genfiles/fletter')
        filemod_db.clear_mtime_cache()

        with self.assertCalled(cr.input_patterns.input_patterns, 1):
            self.assertEqual(
                ['b1', 'genfiles/fletter'],
                cr.input_files('genfiles/computed_inputs/content'))
Beispiel #7
0
    def test_trigger_changes(self):
        cr = compile_rule.find_compile_rule('genfiles/computed_inputs/static')
        with self.assertCalled(cr.input_patterns.input_patterns, 1):
            self.assertEqual(['a1', 'a2'],
                             cr.input_files('genfiles/computed_inputs/static'))

        # a1 is one of the trigger files for this rule.
        self._write_to('a1', '')
        filemod_db.clear_mtime_cache()

        with self.assertCalled(cr.input_patterns.input_patterns, 1):
            self.assertEqual(['a1', 'a2'],
                             cr.input_files('genfiles/computed_inputs/static'))
Beispiel #8
0
    def test_current_inputs(self):
        cr = compile_rule.find_compile_rule('genfiles/computed_inputs/curr')
        self.assertEqual(['a1', 'a2'],
                         cr.input_files('genfiles/computed_inputs/curr'))
        self.assertEqual(
            ['a1', 'a2'],
            cr.input_trigger_files('genfiles/computed_inputs/curr'))

        self._write_to('a1', '')
        filemod_db.clear_mtime_cache()

        with self.assertCalled(cr.input_patterns.input_patterns, 1):
            self.assertEqual(['a1', 'a2'],
                             cr.input_files('genfiles/computed_inputs/curr'))
Beispiel #9
0
    def test_include_cache(self):
        cr = compile_rule.find_compile_rule('genfiles/a.ii')
        self.assertEqual(['a.c', 'a.h', 'includes/b.h', 'includes/c.h', 'a1'],
                         cr.input_files('genfiles/a.ii'))

        self._write_to('includes/b.h', '#include "d.h"  /* new include */ \n')
        filemod_db.clear_mtime_cache()

        with mock.patch('kake.log.v3') as logger:
            actual = cr.input_files('genfiles/a.ii')
            self.assertEqual([
                mock.call('extracting includes from %s', 'includes/b.h'),
                mock.call('extracting includes from %s', 'includes/d.h')
            ], logger.call_args_list)
        self.assertEqual(['a.c', 'a.h', 'includes/b.h', 'includes/d.h', 'a1'],
                         actual)
Beispiel #10
0
    def test_compute_crc(self):
        self._write_to('a1', 'a1,a2,genfiles/fnumber')
        cr = compile_rule.find_compile_rule('genfiles/computed_inputs/content')
        self.assertEqual(['a1', 'a2', 'genfiles/fnumber'],
                         cr.input_files('genfiles/computed_inputs/content'))

        # Adjust the mtime of this file to sometime in the distant past.
        os.utime(os.path.join(self.tmpdir, 'a1'), (1, 1))
        filemod_db.clear_mtime_cache()

        # This should not cause a recompute even though the mtime has
        # changed, because we used compute_crc.
        cr = compile_rule.find_compile_rule('genfiles/computed_inputs/content')
        with self.assertCalled(cr.input_patterns.input_patterns, 0):
            self.assertEqual(
                ['a1', 'a2', 'genfiles/fnumber'],
                cr.input_files('genfiles/computed_inputs/content'))
Beispiel #11
0
    def test_trigger_depends_on_output(self):
        cr = compile_rule.find_compile_rule('genfiles/computed_inputs/b2')
        with self.assertCalled(cr.input_patterns.input_patterns, 1):
            self.assertEqual(['a2'],
                             cr.input_files('genfiles/computed_inputs/b2'))

        self._write_to('b2', '')
        filemod_db.clear_mtime_cache()
        with self.assertCalled(cr.input_patterns.input_patterns, 1):
            self.assertEqual(['a2'],
                             cr.input_files('genfiles/computed_inputs/b2'))

        # But if we touch b1, it doesn't cause a new call
        self._write_to('b1', '')
        filemod_db.clear_mtime_cache()
        with self.assertCalled(cr.input_patterns.input_patterns, 0):
            self.assertEqual(['a2'],
                             cr.input_files('genfiles/computed_inputs/b2'))
Beispiel #12
0
    def test_recompute_inputs_when_a_bad_include_is_fixed(self):
        # Have a.c have a bad include.
        self._write_to(
            'a.c', '#include <stdio.h>\n'
            '#include "includes/non_existent_file.h"\n'
            'int main() { return 0; }\n')

        cr = compile_rule.find_compile_rule('genfiles/a.ii')
        with self.assertRaises(IOError):  # 'file not found'
            cr.input_files('genfiles/a.ii')

        # Now fix up a.c.
        self._write_to(
            'a.c', '#include <stdio.h>\n'
            '#include "a.h"\n'
            'int main() { return 0; }\n')
        filemod_db.clear_mtime_cache()

        # We should be able to calculate the new trigger files, even
        # though the last, failed request cached a non-existent file.
        self.assertEqual(['a.c', 'a.h', 'includes/b.h', 'includes/c.h'],
                         list(cr.input_trigger_files('genfiles/a.ii')))
Beispiel #13
0
def _build_many(outfile_names_and_contexts, num_processes=1, force=False,
                checkpoint_interval=None):
    filemod_db.clear_mtime_cache()
    return build.build_with_optional_checkpoints(
        outfile_names_and_contexts, num_processes, force, checkpoint_interval)