Пример #1
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
Пример #2
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
Пример #3
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
Пример #4
0
    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
Пример #5
0
    def test__basic(self):
        linked_package = LocalPackage(
            rootdirectory=self.__linked_sourcedir,
            setups=[ExplicitDirectorySetup(),
                    ExplicitCSetup(),
                    CMakeSetup()])

        # read repo files along the cascade
        repo = AutomakeCascadedPackageRepository(
            prefix=self.__regular_installdir.abspath(),
            readonly_prefixes=[
                self.__two_readonly_installdir.abspath(),
                self.__one_readonly_installdir.abspath()
            ])

        linked_package.boil(external_nodes=repo.iter_nodes())
        linked_package.output()
        self.__fs.sync()

        commands.cmake(
            packageroot=self.__linked_sourcedir.abspath(),
            builddir=self.__linked_builddir.abspath(),
            args=[
                '-DCMAKE_INSTALL_PREFIX=' +
                '/'.join(self.__regular_installdir.abspath()),
                '-DREADONLY_PREFIXES=' +
                '/'.join(self.__one_readonly_installdir.abspath()) + ';' +
                '/'.join(self.__two_readonly_installdir.abspath())
            ])
        commands.make(builddir=self.__linked_builddir.abspath(), args=[])

        self.failUnless(
            os.path.isfile(
                os.sep.join(self.__linked_builddir.abspath() + ['exe'])))
        pass
Пример #6
0
    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
Пример #7
0
    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
Пример #8
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
Пример #9
0
    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
Пример #10
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
Пример #11
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
Пример #12
0
    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
Пример #13
0
    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
Пример #14
0
    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
Пример #15
0
    def test__workaround_library_and_custom_target(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_workaround_library_and_custom_target')",
                              "PACKAGE_VERSION('1.2.3')"]))
        source.add(
            name=const.CONFIX2_DIR,
            entry=File(lines=[
                'from libconfix.core.filesys.file import File, FileState',
                'from libconfix.plugins.cmake.out_cmake import find_cmake_output_builder',
                'cmake_output_builder = find_cmake_output_builder(CURRENT_BUILDER())',
                'cmake_output_builder.local_cmakelists().add_find_call(',
                '    find_call=["ADD_CUSTOM_COMMAND(",',
                '               "    OUTPUT generated.c file",',
                '               "    COMMAND sleep 1",',
                '               "    COMMAND echo custom command running",',
                '               "    COMMAND echo I was here >> generated",',
                '               "    COMMAND touch generated.c file",',
                '               ")",',
                '               ]),',
                'CURRENT_BUILDER().directory().add(name="generated.c", entry=File(lines=[], state=FileState.VIRTUAL))',
                'LIBRARY([C(filename="generated.c")])',
                'cmake_output_builder.local_cmakelists().add_custom_target(name="my-all-target", all=True, depends=["file"])',
                ]))

        package = LocalPackage(rootdirectory=source,
                               setups=[Boilerplate(),
                                       CMake(library_dependencies=False),
                                       C()])
        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'])
        pass
Пример #16
0
    def test__generated_headers_public_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_headers_public_install')",
                       "PACKAGE_VERSION('1.2.3')"
                   ]))
        source.add(
            name=const.CONFIX2_DIR,
            entry=File(lines=[
                "LIBRARY(members=[H(filename='generated.h'), C(filename='generated.c')])",
                "CMAKE_CMAKELISTS_ADD_CUSTOM_COMMAND__OUTPUT(",
                "    outputs=['generated.h', 'generated.c'],",
                "    commands=[('touch', ['generated.h']),",
                "              ('touch', ['generated.c'])],",
                "    depends=[],",
                ")",
            ]))
        source.add(name='generated.h',
                   entry=File(state=FileState.VIRTUAL, lines=[]))
        source.add(name='generated.c',
                   entry=File(state=FileState.VIRTUAL, lines=[]))

        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.failUnless(install.find(['include', 'generated.h']))

        pass
Пример #17
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())

        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=[
                "CMAKE_CMAKELISTS_ADD_CUSTOM_COMMAND__OUTPUT(",
                "    outputs=['main.c'],", "    commands=[('cp', ",
                "               ['${PROJECT_SOURCE_DIR}/main.c.template', '${PROJECT_BINARY_DIR}/main.c'])],",
                "    depends=['${PROJECT_SOURCE_DIR}/main.c.template'],", ")",
                "EXECUTABLE(", "    exename='exe',",
                "    center=C(filename='main.c')", ")"
            ]))
        source.add(name='main.c.template',
                   entry=File(lines=['int main(void) { return 0; }']))
        source.add(name='main.c',
                   entry=File(state=FileState.VIRTUAL, lines=[]))

        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=[])

        scan.rescan_dir(build)

        # I doubt that this will hold under Windows :-) if it becomes
        # an issue we will skip this check
        self.failUnless(build.find(['exe']))

        pass
Пример #18
0
    def test(self):
        fs = FileSystem(path=self.rootpath())
        
        source = fs.rootdirectory().add(
            name='source',
            entry=Directory())
        source.add(
            name=const.CONFIX2_PKG,
            entry=File(lines=['PACKAGE_NAME("Repo-Install")',
                              'PACKAGE_VERSION("1.2.3")']))
        source.add(
            name=const.CONFIX2_DIR,
            entry=File())

        build = fs.rootdirectory().add(
            name='build',
            entry=Directory())
        install = fs.rootdirectory().add(
            name='install',
            entry=Directory())

        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=['-DCMAKE_INSTALL_PREFIX='+os.sep.join(install.abspath())])
        commands.make(
            builddir=build.abspath(),
            args=['repo-install'])

        scan.rescan_dir(install)

        self.failUnless(install.find(AutomakePackageRepository.REPO_FULL_PATH+['Repo-Install.repo']))
        pass
Пример #19
0
    def test(self):
        fs = FileSystem(path=self.rootpath())

        source = fs.rootdirectory().add(name='source',
                                        entry=inter_package.make_source_tree())
        lo_source = source.find(['lo'])
        mid_source = source.find(['mid'])
        hi_source = source.find(['hi'])

        build = fs.rootdirectory().add(name='build', entry=Directory())
        lo_build = build.add(name='lo', entry=Directory())
        mid_build = build.add(name='mid', entry=Directory())
        hi_build = build.add(name='hi', entry=Directory())

        install = fs.rootdirectory().add(name='install', entry=Directory())

        # build and install lo
        if True:
            lo_package = LocalPackage(rootdirectory=lo_source,
                                      setups=[
                                          ExplicitDirectorySetup(),
                                          ExplicitCSetup(),
                                          CMakeSetup()
                                      ])
            lo_package.boil(external_nodes=[])
            lo_package.output()

            fs.sync()

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

        # build and install mid
        if True:
            repo = AutomakeCascadedPackageRepository(prefix=install.abspath(),
                                                     readonly_prefixes=[])

            mid_package = LocalPackage(rootdirectory=mid_source,
                                       setups=[
                                           ExplicitDirectorySetup(),
                                           ExplicitCSetup(),
                                           CMakeSetup()
                                       ])
            mid_package.boil(external_nodes=repo.iter_nodes())
            mid_package.output()

            fs.sync()

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

        # build and install hi
        if True:
            repo = AutomakeCascadedPackageRepository(prefix=install.abspath(),
                                                     readonly_prefixes=[])

            hi_package = LocalPackage(rootdirectory=hi_source,
                                      setups=[
                                          ExplicitDirectorySetup(),
                                          ExplicitCSetup(),
                                          CMakeSetup()
                                      ])
            hi_package.boil(external_nodes=repo.iter_nodes())
            hi_package.output()

            fs.sync()

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

        # call the program and see if everything's fine.
        pipe = subprocess.Popen(
            [os.sep.join(install.abspath() + ['bin', 'exe'])],
            stdout=subprocess.PIPE)
        self.failUnlessEqual(pipe.stdout.next(), 'main was here\n')

        pass
Пример #20
0
    def test_intra_package(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('LibraryDependencies-Intra-Package')",
                       "PACKAGE_VERSION('1.2.3')"
                   ]))
        source.add(
            name=const.CONFIX2_DIR,
            entry=File(lines=["DIRECTORY(['lib'])", "DIRECTORY(['exe'])"]))

        lib = source.add(name='lib', entry=Directory())
        lib.add(
            name=const.CONFIX2_DIR,
            entry=File(lines=[
                "LIBRARY(basename='lib', members=[H(filename='lib.h'), C(filename='lib.c')])"
            ]))
        lib.add(name='lib.h',
                entry=File(lines=[
                    '#ifndef lib_h', '#define lib_h', 'void lib();', '#endif'
                ]))
        lib.add(name='lib.c',
                entry=File(lines=['#include "lib.h"', 'void lib() {}']))

        exe = source.add(name='exe', entry=Directory())
        exe.add(name=const.CONFIX2_DIR,
                entry=File(lines=[
                    'EXECUTABLE(exename="exe", center=C(filename="main.c"))'
                ]))
        exe.add(name='main.c',
                entry=File(lines=[
                    '#include <lib.h>',
                    '// CONFIX:REQUIRE_H("lib.h", URGENCY_ERROR)',
                    'int main(void) {', '    lib(); ', '    return 0;', '}'
                ]))

        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=[])

        # wait a bit and then touch liblo.a. (is there a better way
        # than sleeping?)
        time.sleep(1)
        lib_library = os.sep.join(build.abspath() + ['lib', 'liblib.a'])
        os.utime(lib_library, None)
        lib_library_stat = os.stat(lib_library)

        # exe is rebuilt as it depends on liblib.a
        if True:
            commands.make(builddir=build.abspath(), args=[])
            self.failUnless(
                os.stat(os.sep.join(build.abspath() + ['exe', 'exe'])).st_mtime
                >= lib_library_stat.st_mtime)
            pass

        pass
Пример #21
0
    def test_inter_package(self):
        fs = FileSystem(path=self.rootpath())

        source = fs.rootdirectory().add(name='source',
                                        entry=inter_package.make_source_tree())
        lo_source = source.find(['lo'])
        mid_source = source.find(['mid'])
        hi_source = source.find(['hi'])

        build = fs.rootdirectory().add(name='build', entry=Directory())
        lo_build = build.add(name='lo', entry=Directory())
        mid_build = build.add(name='mid', entry=Directory())
        hi_build = build.add(name='hi', entry=Directory())

        install = fs.rootdirectory().add(name='install', entry=Directory())

        # build and install lo
        if True:
            lo_package = LocalPackage(rootdirectory=lo_source,
                                      setups=[
                                          ExplicitDirectorySetup(),
                                          ExplicitCSetup(),
                                          CMakeSetup()
                                      ])
            lo_package.boil(external_nodes=[])
            lo_package.output()

            fs.sync()

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

        # build and install mid
        if True:
            repo = AutomakeCascadedPackageRepository(prefix=install.abspath(),
                                                     readonly_prefixes=[])

            mid_package = LocalPackage(rootdirectory=mid_source,
                                       setups=[
                                           ExplicitDirectorySetup(),
                                           ExplicitCSetup(),
                                           CMakeSetup()
                                       ])
            mid_package.boil(external_nodes=repo.iter_nodes())
            mid_package.output()

            fs.sync()

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

        # build and install hi. declare that I want library
        # dependencies.
        if True:
            repo = AutomakeCascadedPackageRepository(prefix=install.abspath(),
                                                     readonly_prefixes=[])

            hi_package = LocalPackage(rootdirectory=hi_source,
                                      setups=[
                                          ExplicitDirectorySetup(),
                                          ExplicitCSetup(),
                                          CMakeSetup(),
                                          LibraryDependenciesSetup()
                                      ])
            hi_package.boil(external_nodes=repo.iter_nodes())
            hi_package.output()

            fs.sync()

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

        # wait a bit and then touch liblo.a. (is there a better way
        # than sleeping?)
        time.sleep(1)
        lo_lib = os.sep.join(install.abspath() + ['lib', 'liblo.a'])
        os.utime(lo_lib, None)
        lo_stat = os.stat(lo_lib)

        # libmid.a is not rebuilt.
        if True:
            commands.make(builddir=mid_build.abspath(), args=['install'])
            self.failIf(
                os.stat(os.sep.join(install.abspath() + ['lib', 'libmid.a'])).
                st_mtime >= lo_stat.st_mtime)
            pass

        # exe is rebuilt as it has liblo.a linked in.
        if True:
            commands.make(builddir=hi_build.abspath(), args=['install'])
            self.failUnless(
                os.stat(os.sep.join(install.abspath() + ['bin', 'exe'])).
                st_mtime >= lo_stat.st_mtime)
            pass

        pass
Пример #22
0
    def setUp(self):
        super(ReadonlyPrefixesBuildTest, self).setUp()

        # one-readonly, installed in prefix one-readonly
        # two-readonly, installed in prefix two-readonly
        # three-regular, installed on regular prefix
        # linked, using all three

        self.__fs = FileSystem(path=self.rootpath())

        sourcedir = self.__fs.rootdirectory().add(name='source',
                                                  entry=Directory())
        builddir = self.__fs.rootdirectory().add(name='build',
                                                 entry=Directory())
        installdir = self.__fs.rootdirectory().add(name='install',
                                                   entry=Directory())
        self.__regular_installdir = self.__fs.rootdirectory().add(
            name='regular', entry=Directory())

        self.__one_readonly_sourcedir = sourcedir.add(name='one-readonly',
                                                      entry=Directory())
        self.__one_readonly_builddir = builddir.add(name='one-readonly',
                                                    entry=Directory())
        self.__one_readonly_installdir = installdir.add(name='one-readonly',
                                                        entry=Directory())

        self.__two_readonly_sourcedir = sourcedir.add(name='two-readonly',
                                                      entry=Directory())
        self.__two_readonly_builddir = builddir.add(name='two-readonly',
                                                    entry=Directory())
        self.__two_readonly_installdir = installdir.add(name='two-readonly',
                                                        entry=Directory())

        self.__three_regular_sourcedir = sourcedir.add(name='three-regular',
                                                       entry=Directory())
        self.__three_regular_builddir = builddir.add(name='three-regular',
                                                     entry=Directory())

        self.__linked_sourcedir = sourcedir.add(name='linked',
                                                entry=Directory())
        self.__linked_builddir = builddir.add(name='linked', entry=Directory())

        # one_readonly source
        if True:
            self.__one_readonly_sourcedir.add(
                name=const.CONFIX2_PKG,
                entry=File(lines=[
                    'PACKAGE_NAME("one-readonly")', 'PACKAGE_VERSION("1.2.3")'
                ]))
            self.__one_readonly_sourcedir.add(
                name=const.CONFIX2_DIR,
                entry=File(lines=[
                    'LIBRARY(basename="one", members=[H(filename="one_readonly.h"), C(filename="one_readonly.c")])'
                ]))
            self.__one_readonly_sourcedir.add(name='one_readonly.h',
                                              entry=File(lines=[
                                                  '#ifndef one_readonly_h',
                                                  '#define one_readonly_h',
                                                  'void one_readonly();',
                                                  '#endif',
                                              ]))
            self.__one_readonly_sourcedir.add(
                name='one_readonly.c',
                entry=File(lines=[
                    '#include "one_readonly.h"', 'void one_readonly() {}'
                ]))

            pass

        # two_readonly source
        if True:
            self.__two_readonly_sourcedir.add(
                name=const.CONFIX2_PKG,
                entry=File(lines=[
                    'PACKAGE_NAME("two-readonly")', 'PACKAGE_VERSION("1.2.3")'
                ]))
            self.__two_readonly_sourcedir.add(
                name=const.CONFIX2_DIR,
                entry=File(lines=[
                    'LIBRARY(basename="two", members=[H(filename="two_readonly.h"), C(filename="two_readonly.c")])'
                ]))
            self.__two_readonly_sourcedir.add(name='two_readonly.h',
                                              entry=File(lines=[
                                                  '#ifndef two_readonly_h',
                                                  '#define two_readonly_h',
                                                  'void two_readonly();',
                                                  '#endif',
                                              ]))
            self.__two_readonly_sourcedir.add(
                name='two_readonly.c',
                entry=File(lines=[
                    '#include "two_readonly.h"', 'void two_readonly() {}'
                ]))
            pass

        # three_regular source
        if True:
            self.__three_regular_sourcedir.add(
                name=const.CONFIX2_PKG,
                entry=File(lines=[
                    'PACKAGE_NAME("three-regular")', 'PACKAGE_VERSION("1.2.3")'
                ]))
            self.__three_regular_sourcedir.add(
                name=const.CONFIX2_DIR,
                entry=File(lines=[
                    'LIBRARY(basename="three", members=[H(filename="three_regular.h"), C(filename="three_regular.c")])'
                ]))
            self.__three_regular_sourcedir.add(name='three_regular.h',
                                               entry=File(lines=[
                                                   '#ifndef three_regular_h',
                                                   '#define three_regular_h',
                                                   'void three_regular();',
                                                   '#endif',
                                               ]))
            self.__three_regular_sourcedir.add(
                name='three_regular.c',
                entry=File(lines=[
                    '#include "three_regular.h"', 'void three_regular() {}'
                ]))
            pass

        # linked source
        if True:
            self.__linked_sourcedir.add(
                name=const.CONFIX2_PKG,
                entry=File(lines=[
                    'PACKAGE_NAME("linked")', 'PACKAGE_VERSION("1.2.3")'
                ]))
            self.__linked_sourcedir.add(
                name=const.CONFIX2_DIR,
                entry=File(lines=[
                    'EXECUTABLE(exename="exe", center=C(filename="main.c"))'
                ]))
            self.__linked_sourcedir.add(
                name='main.c',
                entry=File(lines=[
                    '#include <one_readonly.h>', '#include <two_readonly.h>',
                    '#include <three_regular.h>',
                    '// CONFIX:REQUIRE_H("one_readonly.h", URGENCY_ERROR)',
                    '// CONFIX:REQUIRE_H("two_readonly.h", URGENCY_ERROR)',
                    '// CONFIX:REQUIRE_H("three_regular.h", URGENCY_ERROR)',
                    'int main(void) {', '    one_readonly();',
                    '    two_readonly();', '    three_regular();', '}'
                ]))

            pass

        # build the three installed packages
        if True:
            one_readonly_package = LocalPackage(
                rootdirectory=self.__one_readonly_sourcedir,
                setups=[
                    ExplicitDirectorySetup(),
                    ExplicitCSetup(),
                    CMakeSetup()
                ])
            one_readonly_package.boil(external_nodes=[])
            one_readonly_package.output()
            self.__fs.sync()

            commands.cmake(
                packageroot=self.__one_readonly_sourcedir.abspath(),
                builddir=self.__one_readonly_builddir.abspath(),
                args=[
                    '-DCMAKE_INSTALL_PREFIX=' +
                    '/'.join(self.__one_readonly_installdir.abspath())
                ])
            commands.make(builddir=self.__one_readonly_builddir.abspath(),
                          args=['install'])

            # paranoia
            self.failUnless(
                os.path.isdir(
                    os.sep.join(self.__one_readonly_installdir.abspath() +
                                ['lib'])))
            self.failUnless(
                os.path.isfile(
                    os.sep.join(self.__one_readonly_installdir.abspath() +
                                ['include', 'one_readonly.h'])))
            pass

        if True:
            two_readonly_package = LocalPackage(
                rootdirectory=self.__two_readonly_sourcedir,
                setups=[
                    ExplicitDirectorySetup(),
                    ExplicitCSetup(),
                    CMakeSetup()
                ])
            two_readonly_package.boil(external_nodes=[])
            two_readonly_package.output()
            self.__fs.sync()

            commands.cmake(
                packageroot=self.__two_readonly_sourcedir.abspath(),
                builddir=self.__two_readonly_builddir.abspath(),
                args=[
                    '-DCMAKE_INSTALL_PREFIX=' +
                    '/'.join(self.__two_readonly_installdir.abspath())
                ])
            commands.make(builddir=self.__two_readonly_builddir.abspath(),
                          args=['install'])

            # paranoia
            self.failUnless(
                os.path.isdir(
                    os.sep.join(self.__two_readonly_installdir.abspath() +
                                ['lib'])))
            self.failUnless(
                os.path.isfile(
                    os.sep.join(self.__two_readonly_installdir.abspath() +
                                ['include', 'two_readonly.h'])))
            pass

        if True:
            three_regular_package = LocalPackage(
                rootdirectory=self.__three_regular_sourcedir,
                setups=[
                    ExplicitDirectorySetup(),
                    ExplicitCSetup(),
                    CMakeSetup()
                ])
            three_regular_package.boil(external_nodes=[])
            three_regular_package.output()
            self.__fs.sync()

            commands.cmake(
                packageroot=self.__three_regular_sourcedir.abspath(),
                builddir=self.__three_regular_builddir.abspath(),
                args=[
                    '-DCMAKE_INSTALL_PREFIX=' +
                    '/'.join(self.__regular_installdir.abspath())
                ])
            commands.make(builddir=self.__three_regular_builddir.abspath(),
                          args=['install'])

            # paranoia
            self.failUnless(
                os.path.isdir(
                    os.sep.join(self.__regular_installdir.abspath() +
                                ['lib'])))
            self.failUnless(
                os.path.isfile(
                    os.sep.join(self.__regular_installdir.abspath() +
                                ['include', 'three_regular.h'])))
            pass

        pass
Пример #23
0
    def test__copy_include_files_to_local_package(self):
        fs = FileSystem(path=self.rootpath())

        if True:
            # readonly_prefix1 has a file flatfile.h, flat in
            # prefix/include.
            readonly_prefix1_source = fs.rootdirectory().add(
                name='readonly_prefix1_source', entry=Directory())
            readonly_prefix1_source.add(name=const.CONFIX2_PKG,
                                        entry=File(lines=[
                                            "PACKAGE_NAME('readonly_prefix1')",
                                            "PACKAGE_VERSION('1.2.3')"
                                        ]))
            readonly_prefix1_source.add(
                name=const.CONFIX2_DIR,
                entry=File(lines=["H(filename='flatfile.h')"]))
            readonly_prefix1_source.add(name='flatfile.h', entry=File())
            readonly_prefix1_build = fs.rootdirectory().add(
                name='readonly_prefix1_build', entry=Directory())
            readonly_prefix1_install = fs.rootdirectory().add(
                name='readonly_prefix1_install', entry=Directory())

            readonly_prefix1_package = LocalPackage(
                rootdirectory=readonly_prefix1_source,
                setups=[Boilerplate(),
                        C(),
                        CMake(library_dependencies=False)])
            readonly_prefix1_package.boil(external_nodes=[])
            readonly_prefix1_package.output()
            fs.sync()

            commands.cmake(packageroot=readonly_prefix1_source.abspath(),
                           builddir=readonly_prefix1_build.abspath(),
                           prefix=readonly_prefix1_install.abspath())
            commands.make(builddir=readonly_prefix1_build.abspath(),
                          args=['install'])

            # readonly_prefix2 has a file subdirfile.h, in a subdir,
            # prefix/include/subdir.
            readonly_prefix2_source = fs.rootdirectory().add(
                name='readonly_prefix2_source', entry=Directory())
            readonly_prefix2_source.add(name=const.CONFIX2_PKG,
                                        entry=File(lines=[
                                            "PACKAGE_NAME('readonly_prefix2')",
                                            "PACKAGE_VERSION('1.2.3')"
                                        ]))
            readonly_prefix2_source.add(
                name=const.CONFIX2_DIR,
                entry=File(
                    lines=["H(filename='subdirfile.h', install=['subdir'])"]))
            readonly_prefix2_source.add(name='subdirfile.h', entry=File())
            readonly_prefix2_build = fs.rootdirectory().add(
                name='readonly_prefix2_build', entry=Directory())
            readonly_prefix2_install = fs.rootdirectory().add(
                name='readonly_prefix2_install', entry=Directory())

            readonly_prefix2_package = LocalPackage(
                rootdirectory=readonly_prefix2_source,
                setups=[Boilerplate(),
                        C(),
                        CMake(library_dependencies=False)])
            readonly_prefix2_package.boil(
                external_nodes=readonly_prefix1_package.install().nodes())
            readonly_prefix2_package.output()
            fs.sync()

            commands.cmake(packageroot=readonly_prefix2_source.abspath(),
                           builddir=readonly_prefix2_build.abspath(),
                           prefix=readonly_prefix2_install.abspath())
            commands.make(builddir=readonly_prefix2_build.abspath(),
                          args=['install'])

            # prefix has
            # prefix/include/prefixsubdir/prefixsubdirfile.h
            prefix_source = fs.rootdirectory().add(name='prefix_source',
                                                   entry=Directory())
            prefix_source.add(
                name=const.CONFIX2_PKG,
                entry=File(lines=[
                    "PACKAGE_NAME('prefix')", "PACKAGE_VERSION('1.2.3')"
                ]))
            prefix_source.add(
                name=const.CONFIX2_DIR,
                entry=File(lines=[
                    "H(filename='prefixsubdirfile.h', install=['prefixsubdir'])"
                ]))
            prefix_source.add(name='prefixsubdirfile.h', entry=File())
            prefix_build = fs.rootdirectory().add(name='prefix_build',
                                                  entry=Directory())
            prefix_install = fs.rootdirectory().add(name='prefix_install',
                                                    entry=Directory())

            prefix_package = LocalPackage(
                rootdirectory=prefix_source,
                setups=[Boilerplate(),
                        C(),
                        CMake(library_dependencies=False)])
            prefix_package.boil(
                external_nodes=readonly_prefix1_package.install().nodes() +
                readonly_prefix2_package.install().nodes())
            prefix_package.output()
            fs.sync()

            commands.cmake(packageroot=prefix_source.abspath(),
                           builddir=prefix_build.abspath(),
                           prefix=prefix_install.abspath())
            commands.make(builddir=prefix_build.abspath(), args=['install'])
            pass

        test_source = fs.rootdirectory().add(name='test_source',
                                             entry=Directory())
        test_source.add(
            name=const.CONFIX2_PKG,
            entry=File(lines=[
                "PACKAGE_NAME('test_source')", "PACKAGE_VERSION('1.2.3')"
            ]))
        test_source.add(
            name=const.CONFIX2_DIR,
            entry=File(lines=[
                'CMAKE_CMAKELISTS_ADD_FIND_CALL([',
                '    "ConfixFindNativeInstalledFile(flatfile_dir flatfile.h include)",',
                '    "ConfixFindNativeInstalledFile(subdirfile_dir subdirfile.h include/subdir)",',
                '    "ConfixFindNativeInstalledFile(prefixsubdirfile_dir prefixsubdirfile.h include/prefixsubdir)",',
                '    "MESSAGE(STATUS flatfile: ${flatfile_dir})",',
                '    "MESSAGE(STATUS subdirfile: ${subdirfile_dir})",',
                '    "MESSAGE(STATUS prefixsubdirfile: ${prefixsubdirfile_dir})",',
                '    ],',
                '    flags=CMAKE_BUILDINFO_LOCAL,',
                ')',
                'CMAKE_CMAKELISTS_ADD_CUSTOM_COMMAND__OUTPUT(',
                '    outputs=["flatfile-copy.h"],',
                '    commands=[("cp ${flatfile_dir}/flatfile.h flatfile-copy.h", [])],',
                '    depends=["${flatfile_dir}/flatfile.h"],',
                ')',
                'CMAKE_CMAKELISTS_ADD_CUSTOM_COMMAND__OUTPUT(',
                '    outputs=["subdirfile-copy.h"],',
                '    commands=[("cp ${subdirfile_dir}/subdirfile.h subdirfile-copy.h", [])],',
                '    depends=["${subdirfile_dir}/subdirfile.h"],',
                ')',
                'CMAKE_CMAKELISTS_ADD_CUSTOM_COMMAND__OUTPUT(',
                '    outputs=["prefixsubdirfile-copy.h"],',
                '    commands=[("cp ${prefixsubdirfile_dir}/prefixsubdirfile.h prefixsubdirfile-copy.h", [])],',
                '    depends=["${prefixsubdirfile_dir}/prefixsubdirfile.h"],',
                ')',
                'CMAKE_CMAKELISTS_ADD_CUSTOM_TARGET(',
                '    name="we-make-them-with-all-target",',
                '    all=True,',
                '    depends=["flatfile-copy.h", "subdirfile-copy.h", "prefixsubdirfile-copy.h"])',
            ]))
        test_build = fs.rootdirectory().add(name='test_build',
                                            entry=Directory())

        test_package = LocalPackage(
            rootdirectory=test_source,
            setups=[Boilerplate(),
                    C(), CMake(library_dependencies=False)])
        test_package.boil(external_nodes=readonly_prefix1_package.install().nodes() + \
                          readonly_prefix2_package.install().nodes() + \
                          prefix_package.install().nodes())
        test_package.output()
        fs.sync()

        commands.cmake(
            packageroot=test_source.abspath(),
            builddir=test_build.abspath(),
            args=['-DREADONLY_PREFIXES='+\
                  '/'.join(prefix_install.abspath())+';'+ \
                  '/'.join(readonly_prefix2_install.abspath())+';'+ \
                  '/'.join(readonly_prefix1_install.abspath())])
        commands.make(builddir=test_build.abspath())

        scan.rescan_dir(test_build)
        self.failUnless(test_build.get('flatfile-copy.h'))
        self.failUnless(test_build.get('subdirfile-copy.h'))
        self.failUnless(test_build.get('prefixsubdirfile-copy.h'))

        pass
Пример #24
0
    def test__library_dependencies_with_readonly_prefixes(self):
        # boil package with library dependencies enabled.
        linked_package = LocalPackage(rootdirectory=self.__linked_sourcedir,
                                      setups=[
                                          LibraryDependenciesSetup(),
                                          ExplicitDirectorySetup(),
                                          ExplicitCSetup(),
                                          CMakeSetup()
                                      ])

        # read repo files along the cascade
        repo = AutomakeCascadedPackageRepository(
            prefix=self.__regular_installdir.abspath(),
            readonly_prefixes=[
                self.__two_readonly_installdir.abspath(),
                self.__one_readonly_installdir.abspath()
            ])

        linked_package.boil(external_nodes=repo.iter_nodes())
        linked_package.output()
        self.__fs.sync()

        commands.cmake(
            packageroot=self.__linked_sourcedir.abspath(),
            builddir=self.__linked_builddir.abspath(),
            args=[
                '-DCMAKE_INSTALL_PREFIX=' +
                '/'.join(self.__regular_installdir.abspath()),
                '-DREADONLY_PREFIXES=' +
                '/'.join(self.__one_readonly_installdir.abspath()) + ';' +
                '/'.join(self.__two_readonly_installdir.abspath())
            ])
        commands.make(builddir=self.__linked_builddir.abspath(), args=[])

        # wait a bit and then touch libone.a.
        if True:
            time.sleep(1)
            libone = os.sep.join(self.__one_readonly_installdir.abspath() +
                                 ['lib', 'libone.a'])
            os.utime(libone, None)
            libone_stat = os.stat(libone)

            # exe is rebuilt as it depends on libone.a
            if True:
                commands.make(builddir=self.__linked_builddir.abspath(),
                              args=[])
                self.failUnless(
                    os.stat(
                        os.sep.join(self.__linked_builddir.abspath() +
                                    ['exe'])).st_mtime >= libone_stat.st_mtime)
                pass
            pass

        # wait a bit and then touch libtwo.a.
        if True:
            time.sleep(1)
            libtwo = os.sep.join(self.__two_readonly_installdir.abspath() +
                                 ['lib', 'libtwo.a'])
            os.utime(libtwo, None)
            libtwo_stat = os.stat(libtwo)

            # exe is rebuilt as it depends on libtwo.a
            if True:
                commands.make(builddir=self.__linked_builddir.abspath(),
                              args=[])
                self.failUnless(
                    os.stat(
                        os.sep.join(self.__linked_builddir.abspath() +
                                    ['exe'])).st_mtime >= libtwo_stat.st_mtime)
                pass
            pass

        # wait a bit and then touch libone.a.
        if True:
            time.sleep(1)
            libthree = os.sep.join(self.__regular_installdir.abspath() +
                                   ['lib', 'libthree.a'])
            os.utime(libthree, None)
            libthree_stat = os.stat(libthree)

            # exe is rebuilt as it depends on libthree.a
            if True:
                commands.make(builddir=self.__linked_builddir.abspath(),
                              args=[])
                self.failUnless(
                    os.stat(
                        os.sep.join(self.__linked_builddir.abspath() + ['exe'])
                    ).st_mtime >= libthree_stat.st_mtime)
                pass
            pass

        pass
Пример #25
0
    def test__basic(self):
        source = Directory()
        source.add(
            name=const.CONFIX2_PKG,
            entry=File(lines=[
                'PACKAGE_NAME("Local-Install")', 'PACKAGE_VERSION("1.2.3")'
            ]))
        source.add(
            name=const.CONFIX2_DIR,
            entry=File(lines=[
                'DIRECTORY(["headers-only"])',
                'DIRECTORY(["headers-with-library"])', 'DIRECTORY(["exe"])'
            ]))

        headers_only = source.add(name='headers-only', entry=Directory())
        headers_with_library = source.add(name='headers-with-library',
                                          entry=Directory())
        exe = source.add(name='exe', entry=Directory())

        headers_only.add(
            name=const.CONFIX2_DIR,
            entry=File(lines=[
                'H(filename="header-1.h", install=["headers-only-install"])',
                'H(filename="header-2.h", install=["headers-only-install"])'
            ]))
        headers_only.add(name='header-1.h', entry=File())
        headers_only.add(name='header-2.h', entry=File())

        headers_with_library.add(
            name=const.CONFIX2_DIR,
            entry=File(lines=[
                'LIBRARY(members=[H(filename="library-1.h", install=["headers-with-library-install"]),'
                '                 H(filename="library-2.h", install=["headers-with-library-install"]),'
                '                 C(filename="library-1.c"),'
                '                 C(filename="library-2.c")',
                '                ]', '       )'
            ]))
        headers_with_library.add(name='library-1.h',
                                 entry=File(lines=['void library1(void);']))
        headers_with_library.add(name='library-2.h',
                                 entry=File(lines=['void library2(void);']))
        headers_with_library.add(
            name='library-1.c',
            entry=File(lines=[
                '#include <headers-only-install/header-1.h>',
                'void library1(void) {}'
            ]))
        headers_with_library.add(
            name='library-2.c',
            entry=File(lines=[
                '#include <headers-only-install/header-2.h>',
                'void library2(void) {}'
            ]))

        exe.add(name=const.CONFIX2_DIR,
                entry=File(lines=[
                    'EXECUTABLE(exename="exe",',
                    '           center=C(filename="main.c"))',
                ]))
        exe.add(
            name='main.c',
            entry=File(lines=[
                '#include <headers-only-install/header-1.h>',
                '#include <headers-only-install/header-2.h>',
                '#include <headers-with-library-install/library-1.h>',
                '#include <headers-with-library-install/library-2.h>',
                'int main(void) {', '    library1();', '    library2();', '}'
            ]))

        fs = FileSystem(path=self.rootpath())
        source = fs.rootdirectory().add(name='source', entry=source)
        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 under Windows :-) if it becomes
        # an issue we will skip this check
        self.failUnless(build.find(['exe', 'exe']))

        pass
Пример #26
0
    def test__quoting(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_quoting')", "PACKAGE_VERSION('1.2.3')"
            ]))
        source.add(
            name=const.CONFIX2_DIR,
            entry=File(lines=[
                "CMAKE_CMAKELISTS_ADD_CUSTOM_COMMAND__OUTPUT(",
                "    outputs=['greater_file'],",
                "    commands=[('touch greater_file > greater_sideeffect', [])],",
                "    depends=[],",
                ")",
                "CMAKE_CMAKELISTS_ADD_CUSTOM_COMMAND__OUTPUT(",
                "    outputs=['less_file'],",
                "    commands=[('echo xxx > tmp_file', []),",
                "              ('cat < tmp_file > less_file', [])],",
                "    depends=[],",
                ")",
                "",
                "CMAKE_CMAKELISTS_ADD_CUSTOM_TARGET(",
                "    name='beitl',",
                "    all=True,",
                "    depends=['greater_file',",
                "             'less_file',",
                "            ]",
                ")",
                "",
            ]))

        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=[])

        scan.rescan_dir(build)

        self.failUnless(build.find(['greater_file']))
        self.failUnless(build.find(['greater_sideeffect']))
        self.failIf(build.find(['>']))

        less_file = build.find(['less_file'])
        self.failUnless(less_file)
        self.failUnlessEqual(len(less_file.lines()), 1)
        self.failUnlessEqual(less_file.lines()[0], 'xxx')

        pass
Пример #27
0
    def test(self):
        source = Directory()
        source.add(
            name=const.CONFIX2_PKG,
            entry=File(lines=[
                'PACKAGE_NAME("Public-Install")', 'PACKAGE_VERSION("1.2.3")'
            ]))
        source.add(name=const.CONFIX2_DIR,
                   entry=File(lines=[
                       'DIRECTORY(["headers"])', 'DIRECTORY(["library"])',
                       'DIRECTORY(["exe"])', 'DIRECTORY(["test"])'
                   ]))

        headers = source.add(name='headers', entry=Directory())
        library = source.add(name='library', entry=Directory())
        exe = source.add(name='exe', entry=Directory())
        test = source.add(name='test', entry=Directory())

        headers.add(name=const.CONFIX2_DIR,
                    entry=File(lines=[
                        'H(filename="flat-header.h")',
                        'H(filename="subdir-header.h", install=["subdir"])',
                    ]))
        headers.add(name='flat-header.h', entry=File())
        headers.add(name='subdir-header.h', entry=File())

        library.add(
            name=const.CONFIX2_DIR,
            entry=File(lines=[
                'LIBRARY(basename="rary", members=[C(filename="library.c")])'
            ]))
        library.add(name='library.c', entry=File())

        exe.add(name=const.CONFIX2_DIR,
                entry=File(lines=[
                    'EXECUTABLE(exename="exe",',
                    '           center=C(filename="main.c"))',
                ]))
        exe.add(name='main.c',
                entry=File(lines=['int main(void) { return 0; }']))

        test.add(name=const.CONFIX2_DIR,
                 entry=File(lines=[
                     'EXECUTABLE(exename="test",',
                     '           center=C(filename="main.c"),',
                     '           what=EXECUTABLE_CHECK)',
                 ]))
        test.add(name='main.c',
                 entry=File(lines=['int main(void) { return 0; }']))

        fs = FileSystem(path=self.rootpath())
        source = fs.rootdirectory().add(name='source', entry=source)
        build = fs.rootdirectory().add(name='build', entry=Directory())
        install = fs.rootdirectory().add(name='install', 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=['-DCMAKE_INSTALL_PREFIX=' + os.sep.join(install.abspath())])
        commands.make(builddir=build.abspath(), args=['install'])

        scan.rescan_dir(install)

        self.failUnless(install.find(['include', 'flat-header.h']))
        self.failUnless(install.find(['include', 'subdir', 'subdir-header.h']))

        # if this fails, then you probably are running on Windows.
        self.failUnless(install.find(['lib', 'library.a']))
        self.failUnless(install.find(['bin', 'exe']))
        self.failIf(install.find(['bin', 'test']))

        self.failUnless(
            install.find([
                'share',
                'confix-%s' % const.REPO_VERSION, 'repo',
                package.repofilename()
            ]))

        pass