Exemple #1
0
    def test__sync_mem2sync(self):
        fs = FileSystem(path=self.rootpath())
        subdir = Directory(mode=0700)
        fs.rootdirectory().add(name='subdir', entry=subdir)
        file = File(mode=0755)
        subdir.add(name='file', entry=file)

        self.failUnlessEqual(fs.rootdirectory().state(),
                             DirectoryState.INMEMORY)
        self.failUnlessEqual(subdir.state(), DirectoryState.INMEMORY)
        self.failUnlessEqual(file.state(), FileState.NEW)

        fs.sync()

        self.failUnlessEqual(fs.rootdirectory().state(), DirectoryState.SYNC)
        self.failUnlessEqual(subdir.state(), DirectoryState.SYNC)
        self.failUnlessEqual(file.state(), FileState.SYNC_INMEM)

        self.failUnless(os.path.isdir(os.sep.join(self.rootpath())))
        self.failUnless(
            os.path.isdir(os.sep.join(self.rootpath() + ['subdir'])))
        self.failUnless(
            os.path.isfile(os.sep.join(self.rootpath() + ['subdir', 'file'])))

        self.failUnlessEqual(
            stat.S_IMODE(
                os.stat(os.sep.join(self.rootpath() + ['subdir'])).st_mode),
            0700)
        self.failUnlessEqual(
            stat.S_IMODE(
                os.stat(os.sep.join(self.rootpath() +
                                    ['subdir', 'file'])).st_mode), 0755)
        pass
Exemple #2
0
 def test__sync_file_clear_on_sync_false(self):
     fs = FileSystem(path=self.rootpath())
     file = File(lines=['line'])
     fs.rootdirectory().add(name='file', entry=file)
     fs.sync()
     self.failIf(file.raw_lines() is None)
     pass
Exemple #3
0
    def test__publicinstall_flat(self):
        fs = FileSystem(path=self.rootpath())
        source = fs.rootdirectory().add(name='source', entry=Directory())
        build = fs.rootdirectory().add(name='build', entry=Directory())
        install = fs.rootdirectory().add(name='install', entry=Directory())

        source.add(name=const.CONFIX2_PKG,
                   entry=File(lines=[
                       "PACKAGE_NAME('test_publicinstall_flat')",
                       "PACKAGE_VERSION('1.2.3')"
                   ]))
        source.add(name=const.CONFIX2_DIR, entry=File())
        source.add(name='file.idl', entry=File())

        package = LocalPackage(rootdirectory=source,
                               setups=[
                                   AutoBoilerplate(),
                                   CMake(library_dependencies=False),
                                   IDLSetup()
                               ])
        package.boil(external_nodes=[])
        package.output()
        fs.sync()

        commands.cmake(
            packageroot=source.abspath(),
            builddir=build.abspath(),
            args=['-DCMAKE_INSTALL_PREFIX=' + '/'.join(install.abspath())])
        commands.make(builddir=build.abspath(), args=['install'])

        scan.rescan_dir(install)

        self.failUnless(install.find(['include', 'file.idl']))

        pass
    def test(self):
        fs = FileSystem(path=[])
        fs.rootdirectory().add(
            name=const.CONFIX2_PKG,
            entry=File(lines=["PACKAGE_NAME('"+self.__class__.__name__+"')",
                              "PACKAGE_VERSION('1.2.3')"]))
        fs.rootdirectory().add(
            name=const.CONFIX2_DIR,
            entry=File(lines=["from libconfix.core.machinery.builder import Builder",
                              "class MyBuilder(Builder):",
                              "    def locally_unique_id(self): return 'my_builder_id'",
                              "ADD_BUILDER(builder=MyBuilder())"]))

        package = LocalPackage(rootdirectory=fs.rootdirectory(),
                               setups=[ExplicitSetup(use_libtool=True)])
        package.boil(external_nodes=[])

        for b in package.rootbuilder().iter_builders():
            if b.locally_unique_id() == 'my_builder_id':
                break
            pass
        else:
            self.fail()
            pass
        pass
Exemple #5
0
    def test__basic(self):
        fs = FileSystem(path=self.rootpath())
        source = fs.rootdirectory().add(name='source', entry=Directory())
        build = fs.rootdirectory().add(name='build', entry=Directory())
        install = fs.rootdirectory().add(name='install', entry=Directory())

        source.add(
            name=const.CONFIX2_PKG,
            entry=File(lines=[
                "from libconfix.setups.boilerplate import Boilerplate",
                "from libconfix.setups.cmake import CMake",
                "from libconfix.setups.script import Script",
                "PACKAGE_NAME('cmake-script-build')",
                "PACKAGE_VERSION('1.2.3')",
                "SETUP([Boilerplate(), CMake(library_dependencies=False), Script()])",
            ]))
        source.add(name=const.CONFIX2_DIR,
                   entry=File(lines=['ADD_SCRIPT(filename="script")']))
        source.add(name='script', entry=File())

        package = LocalPackage(rootdirectory=source, setups=None)
        package.boil(external_nodes=[])
        package.output()
        fs.sync()

        commands.cmake(
            packageroot=source.abspath(),
            builddir=build.abspath(),
            args=['-DCMAKE_INSTALL_PREFIX=' + '/'.join(install.abspath())])
        commands.make(builddir=build.abspath(), args=['install'])

        stat = os.stat(os.sep.join(install.abspath() + ['bin', 'script']))
        pass
Exemple #6
0
    def test__localinstall_not_absolutely_necessary(self):
        fs = FileSystem(path=self.rootpath())
        source = fs.rootdirectory().add(name='source', entry=Directory())
        build = fs.rootdirectory().add(name='build', entry=Directory())

        source.add(
            name=const.CONFIX2_PKG,
            entry=File(lines=[
                "PACKAGE_NAME('test_localinstall_not_absolutely_necessary')",
                "PACKAGE_VERSION('1.2.3')"
            ]))
        source.add(name=const.CONFIX2_DIR, entry=File())
        source.add(name='file.idl', entry=File())

        package = LocalPackage(rootdirectory=source,
                               setups=[
                                   AutoBoilerplate(),
                                   CMake(library_dependencies=False),
                                   IDLSetup()
                               ])
        package.boil(external_nodes=[])
        package.output()
        fs.sync()

        commands.cmake(packageroot=source.abspath(),
                       builddir=build.abspath(),
                       args=[])
        commands.make(builddir=build.abspath(), args=[])

        scan.rescan_dir(build)

        self.failUnless(build.find(['confix-include', 'file.idl']))

        pass
    def test__explicit_no_public_visibility(self):
        fs = FileSystem(path=self.rootpath())
        source = fs.rootdirectory().add(name='source', entry=Directory())
        build = fs.rootdirectory().add(name='build', entry=Directory())
        install = fs.rootdirectory().add(name='install', entry=Directory())

        source.add(
            name=const.CONFIX2_PKG,
            entry=File(
                lines=["PACKAGE_NAME('blah')", "PACKAGE_VERSION('1.2.3')"]))
        source.add(name=const.CONFIX2_DIR,
                   entry=File(lines=["H(filename='header.h', public=False)"]))
        source.add(name='header.h', entry=File())

        package = LocalPackage(
            rootdirectory=source,
            setups=[Boilerplate(),
                    C(), CMake(library_dependencies=False)])
        package.boil(external_nodes=[])
        package.output()

        fs.sync()

        commands.cmake(
            packageroot=source.abspath(),
            builddir=build.abspath(),
            args=['-DCMAKE_INSTALL_PREFIX=' + '/'.join(install.abspath())])
        commands.make(builddir=build.abspath(), args=['install'])

        scan.rescan_dir(install)

        self.failIf(install.find(['include', 'header.h']))

        pass
    def test(self):
        fs = FileSystem(path=self.rootpath())
        source = fs.rootdirectory().add(name='source',
                                        entry=intra_package.make_source_tree())
        build = fs.rootdirectory().add(name='build', entry=Directory())

        package = LocalPackage(
            rootdirectory=source,
            setups=[ExplicitDirectorySetup(),
                    ExplicitCSetup(),
                    CMakeSetup()])
        package.boil(external_nodes=[])
        package.output()

        fs.sync()

        commands.cmake(packageroot=source.abspath(),
                       builddir=build.abspath(),
                       args=[])
        commands.make(builddir=build.abspath(), args=[])

        scan.rescan_dir(build)

        # I doubt that this will hold on Windows :-) if it becomes an
        # issue we will skip this check
        self.failUnless(build.find(['lo', 'liblo.a']))
        self.failUnless(build.find(['hi', 'libhi.a']))
        self.failUnless(build.find(['exe', 'exe']))

        pass
Exemple #9
0
    def test__CMAKE_CMAKELISTS_ADD_INCLUDE_local_only(self):
        fs = FileSystem(path=[''])
        fs.rootdirectory().add(
            name=const.CONFIX2_PKG,
            entry=File(lines=[
                'PACKAGE_NAME("test_CMAKE_CMAKELISTS_ADD_INCLUDE_local_only")',
                'PACKAGE_VERSION("1.2.3")'
            ]))
        fs.rootdirectory().add(
            name=const.CONFIX2_DIR,
            entry=File(lines=[
                'CMAKE_CMAKELISTS_ADD_INCLUDE("include1", CMAKE_BUILDINFO_LOCAL)',
                'CMAKE_CMAKELISTS_ADD_INCLUDE("include2", CMAKE_BUILDINFO_LOCAL)'
            ]))

        package = LocalPackage(rootdirectory=fs.rootdirectory(),
                               setups=[ExplicitDirectorySetup(),
                                       CMakeSetup()])
        package.boil(external_nodes=[])
        package.output()

        self.failUnless('include1' in find_cmake_output_builder(
            package.rootbuilder()).top_cmakelists().get_includes())
        self.failUnless('include2' in find_cmake_output_builder(
            package.rootbuilder()).top_cmakelists().get_includes())

        for buildinfo in package.rootbuilder().iter_buildinfos():
            self.failIf(
                isinstance(buildinfo, BuildInfo_Toplevel_CMakeLists_Include))
            pass
        pass
Exemple #10
0
    def test__CMAKE_CMDLINE_MACROS_local_only(self):
        fs = FileSystem(path=[])
        fs.rootdirectory().add(
            name=const.CONFIX2_PKG,
            entry=File(lines=[
                'PACKAGE_NAME("test_CMAKE_CMDLINE_MACROS_local_only")',
                'PACKAGE_VERSION("1.2.3")'
            ]))
        fs.rootdirectory().add(
            name=const.CONFIX2_DIR,
            entry=File(lines=[
                'CMAKE_CMDLINE_MACROS(macros={"macro1": "value1", "macro2": "value2"}, flags=CMAKE_BUILDINFO_LOCAL)'
            ]))

        package = LocalPackage(rootdirectory=fs.rootdirectory(),
                               setups=[ExplicitDirectorySetup(),
                                       CMakeSetup()])
        package.boil(external_nodes=[])
        package.output()

        self.failUnless("-Dmacro1=value1" in find_cmake_output_builder(
            package.rootbuilder()).local_cmakelists().get_definitions())
        self.failUnless("-Dmacro2=value2" in find_cmake_output_builder(
            package.rootbuilder()).local_cmakelists().get_definitions())

        for buildinfo in package.rootbuilder().iter_buildinfos():
            self.failIf(
                isinstance(buildinfo, BuildInfo_CommandlineMacros_CMake))
            pass
        pass
Exemple #11
0
    def test__CMAKE_CMAKELISTS_ADD_FIND_CALL_propagate_and_local(self):
        fs = FileSystem(path=[''])
        fs.rootdirectory().add(
            name=const.CONFIX2_PKG,
            entry=File(lines=[
                'PACKAGE_NAME("test_CMAKE_CMAKELISTS_ADD_FIND_CALL_propagate_and_local")',
                'PACKAGE_VERSION("1.2.3")'
            ]))
        fs.rootdirectory().add(
            name=const.CONFIX2_DIR,
            entry=File(lines=[
                'CMAKE_CMAKELISTS_ADD_FIND_CALL("call", (CMAKE_BUILDINFO_PROPAGATE, CMAKE_BUILDINFO_LOCAL))'
            ]))

        package = LocalPackage(rootdirectory=fs.rootdirectory(),
                               setups=[ExplicitDirectorySetup(),
                                       CMakeSetup()])
        package.boil(external_nodes=[])
        package.output()

        self.failUnless('call' in find_cmake_output_builder(
            package.rootbuilder()).top_cmakelists().get_find_calls())

        for buildinfo in package.rootbuilder().iter_buildinfos():
            if isinstance(buildinfo, BuildInfo_Toplevel_CMakeLists_FindCall):
                break
            pass
        else:
            self.fail()
            pass
        pass
Exemple #12
0
    def test__long_mangled_name(self):
        fs = FileSystem(path=[])
        fs.rootdirectory().add(name=const.CONFIX2_PKG,
                               entry=File(lines=[
                                   "PACKAGE_NAME('LibraryInMemoryTest')",
                                   "PACKAGE_VERSION('1.2.3')"
                               ]))
        fs.rootdirectory().add(name=const.CONFIX2_DIR,
                               entry=File(lines=["LIBRARY(members=[])"]))

        package = LocalPackage(
            rootdirectory=fs.rootdirectory(),
            setups=[ExplicitDirectorySetup(),
                    ExplicitCSetup()])
        package.boil(external_nodes=[])

        found_lib_builder = None
        for b in package.rootbuilder().iter_builders():
            if type(b) is LibraryBuilder:
                self.failUnless(found_lib_builder is None)
                found_lib_builder = b
                continue
            pass
        self.failIf(found_lib_builder is None)
        self.failUnless(found_lib_builder.basename() == 'LibraryInMemoryTest')
        pass
    def test__basic(self):
        fs = FileSystem(path=self.rootpath())
        source = fs.rootdirectory().add(name='source', entry=make_package())
        build = fs.rootdirectory().add(name='build', entry=Directory())
        install = fs.rootdirectory().add(name='install', entry=Directory())

        package = LocalPackage(rootdirectory=source,
                               setups=[
                                   Boilerplate(),
                                   Plainfile(),
                                   CMake(library_dependencies=False)
                               ])
        package.boil(external_nodes=[])
        package.output()
        fs.sync()

        commands.cmake(
            packageroot=source.abspath(),
            builddir=build.abspath(),
            args=['-DCMAKE_INSTALL_PREFIX=' + '/'.join(install.abspath())])
        commands.make(builddir=build.abspath(), args=['install'])

        self.failUnless(
            os.path.isfile(
                os.sep.join(
                    self.rootpath() +
                    ['install', 'share', 'subdir', 'data', 'plainfile_data'])))
        self.failUnless(
            os.path.isfile(
                os.sep.join(
                    self.rootpath() +
                    ['install', 'subdir', 'prefix', 'plainfile_prefix'])))

        pass
Exemple #14
0
 def test__sync_file_clear_on_sync_true(self):
     fs = FileSystem(path=self.rootpath(),
                     flags=set([FileSystem.CLEAR_ON_SYNC]))
     file = File(lines=['line'])
     fs.rootdirectory().add(name='file', entry=file)
     fs.sync()
     self.failUnless(file.raw_lines() is None)
     pass
Exemple #15
0
    def test__generated_plainfile_install(self):
        fs = FileSystem(path=self.rootpath())
        source = fs.rootdirectory().add(name='source', entry=Directory())
        build = fs.rootdirectory().add(name='build', entry=Directory())
        install = fs.rootdirectory().add(name='install', entry=Directory())

        source.add(name=const.CONFIX2_PKG,
                   entry=File(lines=[
                       "PACKAGE_NAME('generated_plainfile_install')",
                       "PACKAGE_VERSION('1.2.3')"
                   ]))
        source.add(
            name=const.CONFIX2_DIR,
            entry=File(lines=[
                "ADD_PLAINFILE(filename='prefixfile', prefixdir='prefixdir')",
                "ADD_PLAINFILE(filename='datafile', datadir='datadir')",
                "CMAKE_CMAKELISTS_ADD_CUSTOM_COMMAND__OUTPUT(",
                "    outputs=['prefixfile', 'datafile'],",
                "    commands=[('touch', ['prefixfile']),",
                "              ('touch', ['datafile'])],",
                "    depends=[],",
                ")",
                # without doing anything, nothing will be built. hook
                # it to the 'all' target.
                "CMAKE_CMAKELISTS_ADD_CUSTOM_TARGET(",
                "    name='generate_those_bloody_files_when_I_say_make',",
                "    all=True,",
                "    depends=['prefixfile', 'datafile'],",
                ")",
            ]))
        source.add(name='prefixfile',
                   entry=File(state=FileState.VIRTUAL, lines=[]))
        source.add(name='datafile',
                   entry=File(state=FileState.VIRTUAL, lines=[]))

        package = LocalPackage(rootdirectory=source,
                               setups=[
                                   Boilerplate(),
                                   Plainfile(),
                                   CMake(library_dependencies=False)
                               ])
        package.boil(external_nodes=[])
        package.output()

        fs.sync()

        commands.cmake(
            packageroot=source.abspath(),
            builddir=build.abspath(),
            args=['-DCMAKE_INSTALL_PREFIX=' + '/'.join(install.abspath())])
        commands.make(builddir=build.abspath(), args=['install'])

        scan.rescan_dir(install)

        self.failUnless(install.find(['prefixdir', 'prefixfile']))
        self.failUnless(install.find(['share', 'datadir', 'datafile']))

        pass
Exemple #16
0
    def test__relative_path(self):
        fs = FileSystem(path=['a', 'b'])
        subdir = fs.rootdirectory().add(name='subdir', entry=Directory())
        subsubdir = subdir.add(name='subsubdir', entry=Directory())
        file = subsubdir.add(name='file', entry=File())

        self.failUnless(
            subsubdir.relpath(fs.rootdirectory()) == ['subdir', 'subsubdir'])
        self.failUnless(file.relpath(subdir) == ['subsubdir', 'file'])
        pass
Exemple #17
0
    def test__two_directories_with_generator_same_outputfilename(self):
        """
        The artificial custom target that we generate for every custom
        command has a name that is derived from the command's
        output(s). This leads to clashes when two directories have
        commands that generate outputs with the same name.
        """

        fs = FileSystem(path=self.rootpath())
        source = fs.rootdirectory().add(name='source', entry=Directory())
        build = fs.rootdirectory().add(name='build', entry=Directory())

        source.add(
            name=const.CONFIX2_PKG,
            entry=File(lines=[
                "PACKAGE_NAME('two_directories_with_generator_same_outputfilename')",
                "PACKAGE_VERSION('1.2.3')"
            ]))
        source.add(
            name=const.CONFIX2_DIR,
            entry=File(lines=['DIRECTORY(["dira"])', 'DIRECTORY(["dirb"])']))

        dira = source.add(name='dira', entry=Directory())
        dira.add(name=const.CONFIX2_DIR,
                 entry=File(lines=[
                     'CMAKE_CMAKELISTS_ADD_CUSTOM_COMMAND__OUTPUT(',
                     '    outputs=["output"],',
                     '    commands=[("touch", ["output"])],', '    depends=[])'
                 ]))

        dirb = source.add(name='dirb', entry=Directory())
        dirb.add(name=const.CONFIX2_DIR,
                 entry=File(lines=[
                     'CMAKE_CMAKELISTS_ADD_CUSTOM_COMMAND__OUTPUT(',
                     '    outputs=["output"],',
                     '    commands=[("touch", ["output"])],', '    depends=[])'
                 ]))

        package = LocalPackage(rootdirectory=source,
                               setups=[
                                   Boilerplate(),
                                   Plainfile(),
                                   CMake(library_dependencies=False)
                               ])
        package.boil(external_nodes=[])
        package.output()

        fs.sync()

        commands.cmake(packageroot=source.abspath(),
                       builddir=build.abspath(),
                       args=[])
        commands.make(builddir=build.abspath(), args=[])

        pass
    def test__no_timestamp_clobber(self):
        fs = FileSystem(path=self.rootpath())
        source = fs.rootdirectory().add(name='source', entry=Directory())
        build = fs.rootdirectory().add(name='build', entry=Directory())

        source.add(name=const.CONFIX2_PKG,
                   entry=File(lines=[
                       "PACKAGE_NAME('test_no_timestamp_clobber')",
                       "PACKAGE_VERSION('1.2.3')"
                   ]))
        source.add(name=const.CONFIX2_DIR,
                   entry=File(lines=[
                       "for f in xrange(200):",
                       "    H(filename='%s.h' % str(f), install=['subdir'])",
                   ]))
        for f in xrange(200):
            source.add(name='%s.h' % str(f), entry=File())
            pass

        package = LocalPackage(
            rootdirectory=source,
            setups=[ExplicitDirectorySetup(),
                    ExplicitCSetup(),
                    CMakeSetup()])
        package.boil(external_nodes=[])
        package.output()

        fs.sync()

        commands.cmake(packageroot=source.abspath(),
                       builddir=build.abspath(),
                       args=[])

        commands.make(builddir=build.abspath(), args=[])
        mtimes = {}
        for f in xrange(200):
            mtime = os.stat(
                os.sep.join(build.abspath() +
                            ['confix-include', 'subdir',
                             '%s.h' % str(f)])).st_mtime
            mtimes[f] = mtime
            pass

        # wait a bit and then call 'make' again
        time.sleep(1)

        commands.make(builddir=build.abspath(), args=[])
        for f in xrange(200):
            mtime = os.stat(
                os.sep.join(build.abspath() +
                            ['confix-include', 'subdir',
                             '%s.h' % str(f)])).st_mtime
            self.failIf(mtime != mtimes[f], f)
            pass
        pass
Exemple #19
0
    def test__library_depends_on_generated_header__from_a_header_only_directory(
            self):
        fs = FileSystem(path=self.rootpath())
        source = fs.rootdirectory().add(name='source', entry=Directory())
        build = fs.rootdirectory().add(name='build', entry=Directory())

        source.add(
            name=const.CONFIX2_PKG,
            entry=File(lines=[
                "PACKAGE_NAME('library_depends_on_generated_header__from_a_header_only_directory')",
                "PACKAGE_VERSION('1.2.3')"
            ]))
        generated_header = source.add(name='generated-header',
                                      entry=Directory())

        source.add(name=const.CONFIX2_DIR,
                   entry=File(lines=[
                       "DIRECTORY(['generated-header'])",
                       "DIRECTORY(['library1'])",
                       "DIRECTORY(['library2'])",
                   ]))

        library1 = source.add(name='library1', entry=Directory())
        library1.add(
            name=const.CONFIX2_DIR,
            entry=File(lines=[
                "LIBRARY(members=[C(filename='using-generated-header.c')])"
            ]))
        library1.add(name='using-generated-header.c',
                     entry=File(lines=['#include <generated-header.h>']))

        library2 = source.add(name='library2', entry=Directory())
        library2.add(
            name=const.CONFIX2_DIR,
            entry=File(lines=[
                "LIBRARY(members=[C(filename='using-generated-header.c')])"
            ]))
        library2.add(name='using-generated-header.c',
                     entry=File(lines=['#include <generated-header.h>']))

        package = LocalPackage(rootdirectory=source,
                               setups=[
                                   Boilerplate(),
                                   C(),
                                   CMake(library_dependencies=False),
                                   GeneratedHeaderSetup()
                               ])
        package.boil(external_nodes=[])
        package.output()

        fs.sync()

        commands.cmake(packageroot=source.abspath(), builddir=build.abspath())
        commands.make(builddir=build.abspath(), args=['-j', 'VERBOSE=1'])
        pass
Exemple #20
0
    def test__creator(self):
        fs = FileSystem(path=['a'])
        fs.rootdirectory().add(
            name=const.CONFIX2_PKG,
            entry=File(lines=[
                "PACKAGE_NAME('ignore-entries-c')", "PACKAGE_VERSION('6.6.6')"
            ]))
        fs.rootdirectory().add(name=const.CONFIX2_DIR,
                               entry=File(lines=[
                                   'IGNORE_ENTRIES(["ignored1.idl"])',
                                   'IGNORE_FILE("ignored2.idl")'
                               ]))
        fs.rootdirectory().add(name='ignored1.idl', entry=File())
        fs.rootdirectory().add(name='ignored2.idl', entry=File())
        fs.rootdirectory().add(name='not-ignored.idl', entry=File())

        package = LocalPackage(rootdirectory=fs.rootdirectory(),
                               setups=[ConfixSetup(use_libtool=False)])
        package.boil(external_nodes=[])

        self.failIf(
            package.rootbuilder().find_entry_builder(path=['ignored1.idl']))
        self.failIf(
            package.rootbuilder().find_entry_builder(path=['ignored2.idl']))
        self.failUnless(
            package.rootbuilder().find_entry_builder(path=['not-ignored.idl']))
        pass
Exemple #21
0
    def test__creator_with_params(self):
        fs = FileSystem(path=['don\'t', 'care'])
        fs.rootdirectory().add(
            name=const.CONFIX2_PKG,
            entry=File(lines=[
                "from libconfix.plugins.plainfile.setup import PlainFileCreatorSetup",
                "PACKAGE_NAME('PlainFileCreatorTest')",
                "PACKAGE_VERSION('1.2.3')", "SETUP([PlainFileCreatorSetup(",
                "           regex=r'\.data$',",
                "           datadir=['the', 'data', 'dir']),",
                "       PlainFileCreatorSetup(",
                "           regex=r'\.prefix$',",
                "           prefixdir=['the', 'prefix', 'dir'])])"
            ]))
        fs.rootdirectory().add(name=const.CONFIX2_DIR, entry=File())
        fs.rootdirectory().add(name='file.data', entry=File())
        fs.rootdirectory().add(name='file.prefix', entry=File())

        package = LocalPackage(rootdirectory=fs.rootdirectory(), setups=None)
        package.boil(external_nodes=[])

        databuilder = package.rootbuilder().find_entry_builder(['file.data'])
        prefixbuilder = package.rootbuilder().find_entry_builder(
            ['file.prefix'])
        self.failIf(databuilder is None)
        self.failIf(prefixbuilder is None)

        self.failUnless(databuilder.datadir() == ['the', 'data', 'dir'])
        self.failUnless(databuilder.prefixdir() is None)
        self.failUnless(prefixbuilder.prefixdir() == ['the', 'prefix', 'dir'])
        self.failUnless(prefixbuilder.datadir() is None)
        pass
    def test__parallel_build(self):
        num_dirs = 50

        fs = FileSystem(path=self.rootpath())
        source = fs.rootdirectory().add(name='source', entry=Directory())
        build = fs.rootdirectory().add(name='build', entry=Directory())

        source.add(name=const.CONFIX2_PKG,
                   entry=File(lines=[
                       "PACKAGE_NAME('test_basic')", "PACKAGE_VERSION('1.2.3')"
                   ]))
        source.add(name=const.CONFIX2_DIR,
                   entry=File(lines=[
                       'DIRECTORY(["dir_' + str(i) + '"])' for i in xrange(50)
                   ] + ['DIRECTORY(["user"])']))

        for i in xrange(num_dirs):
            dir_i = source.add(name='dir_' + str(i), entry=Directory())
            dir_i.add(
                name=const.CONFIX2_DIR,
                entry=File(lines=[
                    "LIBRARY(members=[H(filename='file_" + str(i) +
                    ".h', ", "                   install=['prefix', 'subdir_" +
                    str(i) + "']), ", "                 C(filename='file_" +
                    str(i) + ".c')])"
                ]))
            dir_i.add(name='file_' + str(i) + '.h', entry=File())
            dir_i.add(name='file_' + str(i) + '.c', entry=File())
            pass

        user = source.add(name='user', entry=Directory())
        user.add(name=const.CONFIX2_DIR,
                 entry=File(lines=["LIBRARY(members=[C(filename='user.c')])"]))
        user.add(name='user.c',
                 entry=File(lines=[
                     '#include <prefix/subdir_' + str(i) + '/file_' + str(i) +
                     '.h>' for i in xrange(num_dirs)
                 ]))

        package = LocalPackage(
            rootdirectory=source,
            setups=[Boilerplate(),
                    C(), CMake(library_dependencies=False)])
        package.boil(external_nodes=[])
        package.output()

        fs.sync()

        commands.cmake(packageroot=source.abspath(),
                       builddir=build.abspath(),
                       args=[])
        commands.make(builddir=build.abspath(), args=['-j'])

        pass
Exemple #23
0
    def test(self):
        fs = FileSystem(path=self.rootpath())
        source = fs.rootdirectory().add(
            name='source',
            entry=Directory())
        build = fs.rootdirectory().add(
            name='build',
            entry=Directory())
        install=fs.rootdirectory().add(
            name='install',
            entry=Directory())

        source.add(
            name=const.CONFIX2_PKG,
            entry=File(lines=['PACKAGE_NAME("'+self.__class__.__name__+'")',
                              'PACKAGE_VERSION("1.2.3")']))
        source.add(
            name=const.CONFIX2_DIR,
            entry=File())
        source.add(
            name='main.cc',
            entry=File(lines=['// CONFIX:EXENAME("explicit-name")',
                              'int main() { return 0; }']))

        package = LocalPackage(rootdirectory=source,
                               setups=[ConfixSetup(use_libtool=False)])
        package.boil(external_nodes=[])
        package.output()

        fs.sync()

        bootstrap.bootstrap(
            packageroot=source.abspath(),
            path=None,
            use_kde_hack=False,
            argv0=sys.argv[0])
        configure.configure(
            packageroot=source.abspath(),
            builddir=build.abspath(),
            prefix=install.abspath(),
            readonly_prefixes=None)
        make.make(
            builddir=build.abspath(),
            args=['install'])

        # we have written the fs to disk, but unfortunately we cannot
        # see what the build contributed to it (we don't implement
        # re-reading the fs that has changed under the hood)

        exe_path = install.abspath() + ['bin', 'explicit-name']
        self.failUnless(os.path.isfile(os.sep.join(exe_path)))
        
        pass
Exemple #24
0
 def test(self):
     fs_orig = FileSystem(path=[])
     fs_overlay = FileSystem(path=[])
     fs_overlay.rootdirectory().add(name='dir', entry=Directory())
     fs = OverlayFileSystem(original=fs_orig, overlay=fs_overlay)
     dir = fs.rootdirectory().get('dir')
     try:
         dir.add(name='file', entry=File())
         self.fail()
     except OverlayDirectory.OverlayAddError:
         pass
     pass
Exemple #25
0
    def test__new_directory(self):
        fs_orig = FileSystem(self.rootpath())
        fs_orig.sync()

        fs_dup = scan.scan_filesystem(self.rootpath())

        fs_orig.rootdirectory().add(name='dir', entry=Directory())
        fs_orig.sync()

        scan.rescan_dir(fs_dup.rootdirectory())
        self.failUnless(fs_dup.rootdirectory().get('dir'))
        pass
    def test__reproduce_two_custom_targets(self):
        fs = FileSystem(path=self.rootpath())
        source = fs.rootdirectory().add(
            name='source',
            entry=Directory())
        build = fs.rootdirectory().add(
            name='build',
            entry=Directory())

        source.add(
            name=const.CONFIX2_PKG,
            entry=File(lines=["PACKAGE_NAME('test_reproduce_two_custom_targets')",
                              "PACKAGE_VERSION('1.2.3')"]))
        source.add(
            name=const.CONFIX2_DIR,
            entry=File(lines=[
                'CMAKE_CMAKELISTS_ADD_FIND_CALL(',
                '    find_call=["ADD_CUSTOM_COMMAND(",',
                '               "    OUTPUT generated",',
                '               "    COMMAND sleep 1",',
                '               "    COMMAND echo custom command running",',
                '               "    COMMAND echo I was here >> generated",',
                '               "    COMMAND touch generated",',
                '               ")",',
                '               "ADD_CUSTOM_TARGET(",',
                '               "    my-all-1",',
                '               "    ALL",',
                '               "    DEPENDS generated",',
                '               ")",',
                '               "ADD_CUSTOM_TARGET(",',
                '               "    my-all-2",',
                '               "    ALL",',
                '               "    DEPENDS generated",',
                '               ")",',
                '               ],',
                '    flags=CMAKE_BUILDINFO_LOCAL)',
                ]))

        package = LocalPackage(rootdirectory=source,
                               setups=[Boilerplate(), CMake(library_dependencies=False)])
        package.boil(external_nodes=[])
        package.output()

        fs.sync()

        commands.cmake(packageroot=source.abspath(), builddir=build.abspath(), args=[])
        commands.make(builddir=build.abspath(), args=['-j2'])

        scan.rescan_dir(build)

        self.failUnlessEqual(build.get('generated').lines(), ['I was here', 'I was here'])
        
        pass
Exemple #27
0
    def test__removed_file(self):
        # use a filesystem instance to conveniently create the initial
        # directory.
        fs = FileSystem(self.rootpath())
        fs.rootdirectory().add(name='file', entry=File())
        fs.sync()

        os.unlink(os.sep.join(self.rootpath() + ['file']))

        # rescan the fs's rootdirectory. the file must have gone.
        scan.rescan_dir(fs.rootdirectory())
        self.failIf(fs.rootdirectory().get('file'))
        pass
Exemple #28
0
class CheckProgramBase(PersistentTestCase):
    def __init__(self, methodName):
        PersistentTestCase.__init__(self, methodName)
        self.fs_ = None
        pass

    def use_libtool(self):
        assert 0

    def setUp(self):
        PersistentTestCase.setUp(self)
        self.fs_ = FileSystem(path=self.rootpath())

        self.build_ = self.fs_.rootdirectory().add(name='build',
                                                   entry=Directory())

        self.source_ = self.fs_.rootdirectory().add(name='source',
                                                    entry=Directory())
        self.source_.add(
            name=const.CONFIX2_PKG,
            entry=File(lines=[
                'PACKAGE_NAME("CheckProgramTest")', 'PACKAGE_VERSION("1.2.3")'
            ]))
        self.source_.add(name=const.CONFIX2_DIR,
                         entry=File(lines=[
                             "TESTS_ENVIRONMENT('name', 'value')",
                             "EXECUTABLE(center=C(filename='main.c'),",
                             "           exename='the-test-program',",
                             "           what=EXECUTABLE_CHECK)"
                         ]))
        self.source_.add(
            name='main.c',
            entry=File(lines=[
                '#include <sys/types.h>', '#include <sys/stat.h>',
                '#include <fcntl.h>', '#include <stdlib.h>',
                '#include <string.h>', 'int main(void) {',
                '    const char* name = getenv("name");', '    if (!name)',
                '        return 1;', '    if (strcmp(name, "value"))',
                '        return 1;', '    return open("' +
                os.sep.join(self.build_.abspath() + ['my-check-was-here']) +
                '",', '                O_CREAT|O_RDWR, 0644) >=0?0:1;', '}'
            ]))

        self.package_ = LocalPackage(
            rootdirectory=self.source_,
            setups=[ExplicitSetup(use_libtool=self.use_libtool())])
        self.package_.boil(external_nodes=[])
        self.package_.output()
        pass

    pass
    def test(self):
        fs = FileSystem(path=self.rootpath())
        source = fs.rootdirectory().add(name='source', entry=Directory())
        build = fs.rootdirectory().add(name='build', entry=Directory())

        source.add(name=const.CONFIX2_PKG,
                   entry=File(lines=[
                       'PACKAGE_NAME("' + self.__class__.__name__ +
                       '")', 'PACKAGE_VERSION("1.2.3")'
                   ]))
        source.add(name=const.CONFIX2_DIR,
                   entry=File(lines=['CALL_MAKE_AND_RESCAN()']))
        source.add(
            name='Makefile',
            entry=File(lines=[
                'all:',
                '\tif test -e main.c; then echo "make being called twice"; exit 1; fi',
                '\techo "// CONFIX:EXENAME(\'the_executable_generated_by_a_call_to_make\')" > main.cc',
                '\techo "int main(void) {return 0;}" >> main.cc'
            ]))

        # during enlarge() we will call 'make' which expects the
        # Makefile being physically available in the physically
        # available directory, so flush it once ...
        fs.sync()

        package = LocalPackage(rootdirectory=source,
                               setups=[ConfixSetup(use_libtool=False)])
        package.boil(external_nodes=[])
        package.output()

        # ... and, for the rest of it, we need the automake input
        # files as well.
        fs.sync()

        bootstrap.bootstrap(packageroot=source.abspath(),
                            path=None,
                            use_kde_hack=False,
                            argv0=sys.argv[0])
        configure.configure(packageroot=source.abspath(),
                            builddir=build.abspath(),
                            prefix=None,
                            readonly_prefixes=None)
        make.make(builddir=build.abspath(), args=None)

        self.failUnless(
            os.path.isfile(
                os.sep.join(build.abspath() +
                            ['the_executable_generated_by_a_call_to_make'])))

        pass
    def test__sourcefile_dependency(self):
        fs = FileSystem(path=self.rootpath())
        source = fs.rootdirectory().add(name='source', entry=Directory())
        build = fs.rootdirectory().add(name='build', entry=Directory())

        source.add(name=const.CONFIX2_PKG,
                   entry=File(lines=[
                       "PACKAGE_NAME('test_sourcefile_dependency')",
                       "PACKAGE_VERSION('1.2.3')"
                   ]))
        source.add(name=const.CONFIX2_DIR,
                   entry=File(lines=[
                       "H(filename='h.h', install=['subdir'])",
                   ]))
        h = source.add(name='h.h', entry=File())

        package = LocalPackage(
            rootdirectory=source,
            setups=[ExplicitDirectorySetup(),
                    ExplicitCSetup(),
                    CMakeSetup()])
        package.boil(external_nodes=[])
        package.output()

        fs.sync()

        commands.cmake(packageroot=source.abspath(),
                       builddir=build.abspath(),
                       args=[])

        commands.make(builddir=build.abspath(), args=[])
        before_mtime = os.stat(
            os.sep.join(build.abspath() +
                        ['confix-include', 'subdir', 'h.h'])).st_mtime

        # wait a bit. then touch the source file, call make again, and
        # check that the file was locally installed again.
        time.sleep(1)

        h.add_lines(['x'])
        fs.sync()

        commands.make(builddir=build.abspath(), args=[])

        self.failUnless(
            os.stat(
                os.sep.join(build.abspath() +
                            ['confix-include', 'subdir', 'h.h'])).st_mtime >
            before_mtime)

        pass