Example #1
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
Example #2
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
    def setUp(self):
        fs = FileSystem(path=[], rootdirectory=intra_package.make_source_tree())
        
        self.__package = LocalPackage(rootdirectory=fs.rootdirectory(),
                                      setups=[ExplicitDirectorySetup(), ExplicitCSetup(), CMakeSetup()])
        self.__package.boil(external_nodes=[])
        self.__package.output()

        self.__lo_output_builder = find_cmake_output_builder(self.__package.rootbuilder().find_entry_builder(['lo']))
        self.__hi_output_builder = find_cmake_output_builder(self.__package.rootbuilder().find_entry_builder(['hi']))
        self.__exe_output_builder = find_cmake_output_builder(self.__package.rootbuilder().find_entry_builder(['exe']))
        pass
Example #4
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
    def test(self):
        output_builder = find_cmake_output_builder(
            self.__hi_package_local.rootbuilder())

        # hi uses two installed packages. nothing interesting with the
        # includes. we need only one path, pointing to the installed
        # include directory.
        include_directories = output_builder.local_cmakelists(
        ).get_include_directories()
        self.failUnlessEqual(len(include_directories), 2)
        self.failUnlessEqual(include_directories[1],
                             '${CMAKE_INSTALL_PREFIX}/include')

        # boring with the library path as well.
        link_directories = output_builder.local_cmakelists(
        ).get_link_directories()
        self.failUnlessEqual(len(link_directories), 1)
        self.failUnlessEqual(link_directories[0],
                             '${CMAKE_INSTALL_PREFIX}/lib')

        # more fun with the libraries.
        exe_target_link_libraries = output_builder.local_cmakelists(
        ).get_target_link_libraries('exe')
        self.failUnlessEqual(exe_target_link_libraries, ['mid', 'lo'])

        pass
Example #6
0
    def test__CMAKE_CMAKELISTS_ADD_INCLUDE_DIRECTORY_local(self):
        fs = FileSystem(path=[''])
        fs.rootdirectory().add(
            name=const.CONFIX2_PKG,
            entry=File(lines=[
                'PACKAGE_NAME("test_CMAKE_CMAKELISTS_ADD_INCLUDE_DIRECTORY_local")',
                'PACKAGE_VERSION("1.2.3")'
            ]))
        fs.rootdirectory().add(name=const.CONFIX2_DIR,
                               entry=File(lines=['DIRECTORY(["subdir"])']))

        subdir = fs.rootdirectory().add(name='subdir', entry=Directory())
        subdir.add(
            name=const.CONFIX2_DIR,
            entry=File(lines=[
                'CMAKE_CMAKELISTS_ADD_INCLUDE_DIRECTORY("include-directory", CMAKE_BUILDINFO_LOCAL)'
            ]))

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

        cmake_output_builder = find_cmake_output_builder(
            package.rootbuilder().find_entry_builder(['subdir']))
        self.failUnless('include-directory' in cmake_output_builder.
                        local_cmakelists().get_include_directories())
        pass
Example #7
0
    def test__basic(self):
        fs = FileSystem(path=[])
        fs.rootdirectory().add(
            name=const.CONFIX2_PKG,
            entry=File(lines=[
                'PACKAGE_NAME("HierarchyInMemoryTest.basic")',
                'PACKAGE_VERSION("1.2.3")'
            ]))
        fs.rootdirectory().add(
            name=const.CONFIX2_DIR,
            entry=File(lines=[
                'DIRECTORY(["directory0"])', 'DIRECTORY(["directory1"])'
            ]))
        fs.rootdirectory().add(name='directory0', entry=Directory())
        fs.rootdirectory().add(name='directory1', entry=Directory())

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

        cmake_output_builder = find_cmake_output_builder(package.rootbuilder())

        self.failUnlessEqual(
            len(cmake_output_builder.local_cmakelists().get_subdirectories()),
            2
            # plus the admin stuff, confix-admin/cmake/Modules
            + 4)
        self.failUnless('directory0' in cmake_output_builder.local_cmakelists(
        ).get_subdirectories())
        self.failUnless('directory1' in cmake_output_builder.local_cmakelists(
        ).get_subdirectories())

        pass
Example #8
0
 def output(self):
     super(HeaderGenerator, self).output()
     cmake_output = find_cmake_output_builder(self.parentbuilder())
     cmake_output.local_cmakelists().add_custom_command__output(
         outputs=['generated-header.h'],
         commands=[('echo', ['generating generated-header.h']),
                   ('touch', ['generated-header.h'])],
         depends=[])
     pass
    def test(self):
        fs = FileSystem(path=[])

        fs.rootdirectory().add(name=const.CONFIX2_PKG,
                               entry=File(lines=[
                                   "PACKAGE_NAME('ExternalLibraryTest')",
                                   "PACKAGE_VERSION('1.2.3')"
                               ]))
        fs.rootdirectory().add(
            name=const.CONFIX2_DIR,
            entry=File(
                lines=["DIRECTORY(['external'])", "DIRECTORY(['linked'])"]))

        external = fs.rootdirectory().add(name='external', entry=Directory())
        external.add(name=const.CONFIX2_DIR,
                     entry=File(lines=[
                         "PROVIDE_SYMBOL('the-external-library')",
                         "CMAKE_EXTERNAL_LIBRARY(",
                         "    cflags=['my-cflag1', 'my-cflag2'],",
                         "    cxxflags=['my-cxxflag1', 'my-cxxflag2'])",
                     ]))

        linked = fs.rootdirectory().add(name='linked', entry=Directory())
        linked.add(name=const.CONFIX2_DIR,
                   entry=File(lines=[
                       "REQUIRE_SYMBOL('the-external-library', URGENCY_ERROR)",
                       "EXECUTABLE(center=C(filename='main.c'))"
                   ]))
        linked.add(name='main.c', entry=File(lines=["int main(void) {}"]))

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

        linked_cmake_output_builder = find_cmake_output_builder(
            package.rootbuilder().find_entry_builder(['linked']))
        self.failUnless('my-cflag1' in linked_cmake_output_builder.
                        local_cmakelists().get_definitions())
        self.failUnless('my-cflag2' in linked_cmake_output_builder.
                        local_cmakelists().get_definitions())
        self.failUnless('my-cxxflag1' in linked_cmake_output_builder.
                        local_cmakelists().get_definitions())
        self.failUnless('my-cxxflag2' in linked_cmake_output_builder.
                        local_cmakelists().get_definitions())
        pass
Example #10
0
    def setUp(self):
        rootdirectory = Directory()
        rootdirectory.add(
            name=const.CONFIX2_PKG,
            entry=File(lines=[
                'PACKAGE_NAME("package-name")', 'PACKAGE_VERSION("1.2.3")'
            ]))
        rootdirectory.add(name=const.CONFIX2_DIR, entry=File())
        package = LocalPackage(rootdirectory=rootdirectory,
                               setups=[CMakeSetup()])
        package.boil(external_nodes=[])
        package.output()

        self.__cmakelists = find_cmake_output_builder(
            package.rootbuilder()).top_cmakelists()
        pass
Example #11
0
    def test__CMAKE_CMAKELISTS_ADD_INCLUDE_DIRECTORY_propagate(self):
        fs = FileSystem(path=[''])
        fs.rootdirectory().add(
            name=const.CONFIX2_PKG,
            entry=File(lines=[
                'PACKAGE_NAME("test_CMAKE_CMAKELISTS_ADD_INCLUDE_DIRECTORY_propagate")',
                'PACKAGE_VERSION("1.2.3")'
            ]))
        fs.rootdirectory().add(
            name=const.CONFIX2_DIR,
            entry=File(
                lines=['DIRECTORY(["sender"])', 'DIRECTORY(["receiver"])']))

        sender = fs.rootdirectory().add(name='sender', entry=Directory())
        sender.add(
            name=const.CONFIX2_DIR,
            entry=File(lines=[
                'PROVIDE_SYMBOL("sender")',
                'CMAKE_CMAKELISTS_ADD_INCLUDE_DIRECTORY("include-directory", CMAKE_BUILDINFO_PROPAGATE)'
            ]))

        receiver = fs.rootdirectory().add(name='receiver', entry=Directory())
        receiver.add(name=const.CONFIX2_DIR,
                     entry=File(lines=[
                         'REQUIRE_SYMBOL("sender", URGENCY_ERROR)',
                         'C(filename="file.c")'
                     ]))
        # need a compiled file builder in order for the include path
        # to show up in the CMakeLists.txt.
        receiver.add(name='file.c', entry=File())

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

        cmake_output_builder = find_cmake_output_builder(
            package.rootbuilder().find_entry_builder(['receiver']))
        self.failUnless('include-directory' in cmake_output_builder.
                        local_cmakelists().get_include_directories())
        pass
    def output(self):
        super(LibraryDependenciesBuilder, self).output()

        cmake_output_builder = find_cmake_output_builder(self.parentbuilder())
        found_exe = False

        for exe in self.parentbuilder().iter_builders():
            if not isinstance(exe, ExecutableBuilder):
                continue
            found_exe = True
            for bi in exe.topo_libraries():
                if isinstance(bi, BuildInfo_CLibrary_NativeInstalled):
                    cmake_output_builder.top_cmakelists().add_find_call(
                        'ConfixFindNativeInstalledLibrary(' + bi.basename() +
                        ' ' + exe.exename() + ')')
                    cmake_output_builder.local_cmakelists(
                    ).tighten_target_link_library(target=exe.exename(),
                                                  basename=bi.basename(),
                                                  tightened='${' +
                                                  bi.basename() + '_LIBRARY}')
                    pass
                pass
            pass
        pass
Example #13
0
    def output(self):
        super(CompiledOutputBuilder, self).output()

        have_compiled = False

        native_local_include_dirs = []
        native_local_include_dirs_set = set()
        using_locally_installed_headers = False
        using_public_native_installed_headers = False

        for compiled_builder in self.parentbuilder().iter_builders():
            if not isinstance(compiled_builder, CompiledCBuilder):
                continue
            have_compiled = True
            for include_directory in compiled_builder.native_local_include_dirs(
            ):
                slashed_incdir = '/'.join(include_directory)
                if slashed_incdir in native_local_include_dirs_set:
                    continue
                native_local_include_dirs.append(slashed_incdir)
                native_local_include_dirs_set.add(slashed_incdir)
                pass
            if compiled_builder.have_locally_installed_includes():
                using_locally_installed_headers = True
                pass
            if compiled_builder.using_native_installed():
                using_public_native_installed_headers = True
                pass
            pass

        # no need to write out anything if we don't compile anything.
        if not have_compiled:
            return

        cmake_output_builder = find_cmake_output_builder(self.parentbuilder())

        # add the associated binary directory of the current source
        # directory, in case there are generated headers.
        cmake_output_builder.local_cmakelists().add_include_directory(
            '${CMAKE_CURRENT_BINARY_DIR}')

        # header files from directories in the local package, other
        # than the directory being compiled: in addition to the source
        # directory, add the associated build directory in case it
        # contains generated headers.
        for dir in native_local_include_dirs:
            cmake_output_builder.local_cmakelists().add_include_directory(
                '${' + self.package().name() + '_BINARY_DIR}/' + dir)
            cmake_output_builder.local_cmakelists().add_include_directory(
                '${' + self.package().name() + '_SOURCE_DIR}/' + dir)
            pass

        # if we have locally installed headers, add the
        # 'confix-include' directory to the include path.
        if using_locally_installed_headers:
            cmake_output_builder.local_cmakelists().add_include_directory(
                '${PROJECT_BINARY_DIR}/' + const.LOCAL_INCLUDE_DIR)
            pass

        # finding installed headers if need be. use our good old
        # prefix/include and readonly prefixes.
        if using_public_native_installed_headers:
            cmake_output_builder.local_cmakelists().add_include_directory(
                '${CMAKE_INSTALL_PREFIX}/include')
            cmake_output_builder.local_cmakelists().add_include_directory(
                directory=[
                    'FOREACH(dir ${READONLY_PREFIXES})',
                    '    INCLUDE_DIRECTORIES(${dir}/include)',
                    'ENDFOREACH(dir)',
                ],
                literally=True)
            pass

        # include paths contributed by external library definitions.
        for p in self.__external_incpath:
            for item in p:
                cmake_output_builder.local_cmakelists().add_include_directory(
                    item)
                pass
            pass

        # commandline macros floating in by external library
        # definitions.
        for macro, value in self.__external_cmdlinemacros.iteritems():
            if value is None:
                definition = '-D%s' % macro
            else:
                definition = '-D%s=%s' % (macro, value)
                pass
            cmake_output_builder.local_cmakelists().add_definitions(
                [definition])
            pass

        # cflags and cxxflags, likewise
        cmake_output_builder.local_cmakelists().add_definitions(
            self.__external_cflags)
        cmake_output_builder.local_cmakelists().add_definitions(
            self.__external_cxxflags)
        pass
Example #14
0
    def test(self):
        fs = FileSystem(path=[])
        source = fs.rootdirectory().add(
            name='source',
            entry=Directory())

        # external definitions
        if True:
            externals = source.add(
                name='externals',
                entry=Directory())
            externals.add(
                name=const.CONFIX2_PKG,
                entry=File(lines=["PACKAGE_NAME('ext1')",
                                  "PACKAGE_VERSION('1.2.3')"]))
            externals.add(
                name=const.CONFIX2_DIR,
                entry=File(lines=["DIRECTORY(['ext1'])",
                                  "DIRECTORY(['ext2'])"]))

            ext1 = externals.add(
                name='ext1',
                entry=Directory())
            ext1.add(
                name=const.CONFIX2_DIR,
                entry=File(lines=["PROVIDE_SYMBOL('ext1')",
                                  "CMAKE_EXTERNAL_LIBRARY(",
                                  "    incpath=['ext1-incpath1', 'ext1-incpath2'],",
                                  "    libpath=['ext1-libpath1', 'ext1-libpath2'],",
                                  "    libs=['ext1-lib1', 'ext1-lib2'],",
                                  "    cmdlinemacros={'ext1-macro1': 'ext1-value1', 'ext1-macro2': None})"
                                  ]))
        
            ext2 = externals.add(
                name='ext2',
                entry=Directory())
            ext2.add(
                name=const.CONFIX2_DIR,
                entry=File(lines=["REQUIRE_SYMBOL('ext1', URGENCY_ERROR)",
                                  "PROVIDE_SYMBOL('ext2')",
                                  "CMAKE_EXTERNAL_LIBRARY(",
                                  "    incpath=['ext2-incpath1', 'ext2-incpath2'],",
                                  "    libpath=['ext2-libpath1', 'ext2-libpath2'],",
                                  "    libs=['ext2-lib1', 'ext2-lib2'],",
                                  "    cmdlinemacros={'ext2-macro1': 'ext2-value1', 'ext2-macro2': None})"
                                  ]))

            externals_package = LocalPackage(rootdirectory=externals,
                                             setups=[ExplicitDirectorySetup(), ExplicitCSetup(), CMakeSetup()])
            externals_package.boil(external_nodes=[])
            externals_package.output()
            externals_installed = externals_package.install()
            pass

        # native package #1
        if True:
            native1 = source.add(
                name='native1',
                entry=Directory())
            native1.add(
                name=const.CONFIX2_PKG,
                entry=File(lines=["PACKAGE_NAME('native1')",
                                  "PACKAGE_VERSION('1.2.3')"]))
            native1.add(
                name=const.CONFIX2_DIR,
                entry=File(lines=["REQUIRE_SYMBOL('ext2', URGENCY_ERROR)",
                                  "PROVIDE_SYMBOL('native1')",
                                  "LIBRARY(basename='native1', members=[H(filename='native1.h'), C(filename='native1.c')])"]))
            native1.add(
                name='native1.h',
                entry=File())
            native1.add(
                name='native1.c',
                entry=File())

            native1_package = LocalPackage(rootdirectory=native1,
                                           setups=[ExplicitDirectorySetup(), ExplicitCSetup(), CMakeSetup()])
            native1_package.boil(external_nodes=externals_installed.nodes())
            native1_installed = native1_package.install()
            pass
        
        # native package #2
        if True:
            native2 = source.add(
                name='native2',
                entry=Directory())
            native2.add(
                name=const.CONFIX2_PKG,
                entry=File(lines=["PACKAGE_NAME('native2')",
                                  "PACKAGE_VERSION('1.2.3')"]))
            native2.add(
                name=const.CONFIX2_DIR,
                entry=File(lines=["REQUIRE_SYMBOL('native1', URGENCY_ERROR)",
                                  "PROVIDE_SYMBOL('native2')",
                                  "LIBRARY(basename='native2', members=[H(filename='native2.h'), C(filename='native2.c')])"]))
            native2.add(
                name='native2.h',
                entry=File())
            native2.add(
                name='native2.c',
                entry=File())

            native2_package = LocalPackage(rootdirectory=native2,
                                           setups=[ExplicitDirectorySetup(), ExplicitCSetup(), CMakeSetup()])
            native2_package.boil(external_nodes=externals_installed.nodes()+native1_installed.nodes())
            native2_installed = native2_package.install()
            pass
        
        # final package
        if True:
            final = source.add(
                name='final',
                entry=Directory())
            final.add(
                name=const.CONFIX2_PKG,
                entry=File(lines=["PACKAGE_NAME('final')",
                                  "PACKAGE_VERSION('1.2.3')"]))
            final.add(
                name=const.CONFIX2_DIR,
                entry=File(lines=["DIRECTORY(['local1'])",
                                  "DIRECTORY(['local2'])",
                                  "DIRECTORY(['bin'])"]))

            local1 = final.add(
                name='local1',
                entry=Directory())
            local1.add(
                name=const.CONFIX2_DIR,
                entry=File(lines=["REQUIRE_SYMBOL('native2', URGENCY_ERROR)",
                                  "PROVIDE_SYMBOL('local1')",
                                  "LIBRARY(basename='local1', members=[H(filename='local1.h'), C(filename='local1.c')])"]))
            local1.add(
                name='local1.h',
                entry=File())
            local1.add(
                name='local1.c',
                entry=File())

            local2 = final.add(
                name='local2',
                entry=Directory())
            local2.add(
                name=const.CONFIX2_DIR,
                entry=File(lines=["REQUIRE_SYMBOL('local1', URGENCY_ERROR)",
                                  "PROVIDE_SYMBOL('local2')",
                                  "LIBRARY(basename='local2', members=[H(filename='local2.h'), C(filename='local2.c')])"]))
            local2.add(
                name='local2.h',
                entry=File())
            local2.add(
                name='local2.c',
                entry=File())

            bin = final.add(
                name='bin',
                entry=Directory())
            bin.add(
                name=const.CONFIX2_DIR,
                entry=File(lines=["REQUIRE_SYMBOL('local2', URGENCY_ERROR)",
                                  "EXECUTABLE(exename='exe', center=C(filename='main.c'))"]))
            bin.add(
                name='main.c',
                entry=File())

            final_package = LocalPackage(rootdirectory=final,
                                         setups=[ExplicitDirectorySetup(), ExplicitCSetup(), CMakeSetup()])
            final_package.boil(external_nodes=externals_installed.nodes()+native1_installed.nodes()+native2_installed.nodes())
            final_package.output()
            pass

        cmake_output_builder = find_cmake_output_builder(final_package.rootbuilder().find_entry_builder(['bin']))
        self.failUnlessEqual(cmake_output_builder.local_cmakelists().get_include_directories(),
                             ['${CMAKE_CURRENT_BINARY_DIR}',
                              '${final_BINARY_DIR}/local2',
                              '${final_SOURCE_DIR}/local2',
                              '${final_BINARY_DIR}/local1',
                              '${final_SOURCE_DIR}/local1',
                              '${CMAKE_INSTALL_PREFIX}/include',
                              'ext2-incpath1', 'ext2-incpath2',
                              'ext1-incpath1', 'ext1-incpath2'])

        self.failUnlessEqual(cmake_output_builder.local_cmakelists().get_link_directories(),
                             ['${CMAKE_INSTALL_PREFIX}/lib',
                              'ext2-libpath1', 'ext2-libpath2',
                              'ext1-libpath1', 'ext1-libpath2'])

        self.failUnlessEqual(cmake_output_builder.local_cmakelists().get_target_link_libraries('exe'),
                             ['local2', 'local1', 'native2', 'native1',
                              'ext2-lib1', 'ext2-lib2', 'ext1-lib1', 'ext1-lib2'])
        pass
Example #15
0
    def output(self):
        super(HeaderOutputBuilder, self).output()

        cmake_output_builder = find_cmake_output_builder(self.parentbuilder())

        for header in self.parentbuilder().iter_builders():
            if not isinstance(header, HeaderBuilder):
                continue

            # cmake makes a difference between files that have been
            # generated in the build directory and regular ones from
            # the source directory. we use the FileState.VIRTUAL as a
            # heuristic, until we find a better way.
            generated = header.file().state() is FileState.VIRTUAL

            # install headers that want this.
            if header.public():
                if generated:
                    path = '${CMAKE_CURRENT_BINARY_DIR}/' + header.file().name(
                    )
                else:
                    path = header.file().name()
                    pass
                cmake_output_builder.local_cmakelists().add_install__files(
                    files=[path],
                    destination='/'.join(['include'] + header.visibility()))
                pass

            # local install
            if header.package_visibility_action(
            )[0] == HeaderBuilder.LOCALVISIBILITY_INSTALL:
                destdir = '/'.join(
                    ['${PROJECT_BINARY_DIR}', 'confix-include'] +
                    header.package_visibility_action()[1])
                destfile = destdir + '/' + header.file().name()
                destfile_all_target = '.'.join(
                    ['confix-local-install'] +
                    header.package_visibility_action()[1] +
                    [header.file().name()])
                if generated:
                    sourcefile = '${CMAKE_CURRENT_BINARY_DIR}/' + header.file(
                    ).name()
                else:
                    sourcefile = '${CMAKE_CURRENT_SOURCE_DIR}/' + header.file(
                    ).name()
                    pass

                # create rule for the header local install
                cmake_output_builder.local_cmakelists(
                ).add_custom_command__output(
                    outputs=[destfile],
                    commands=[
                        ('${CMAKE_COMMAND} -E make_directory ' + destdir, []),
                        ('${CMAKE_COMMAND} -E copy ' + sourcefile + ' ' +
                         destfile, []),
                    ],
                    depends=[sourcefile],
                )

                # hook header local install to the 'all' target.
                cmake_output_builder.local_cmakelists().add_custom_target(
                    name=destfile_all_target, all=True, depends=[destfile])
                pass
            elif header.package_visibility_action(
            )[0] is HeaderBuilder.LOCALVISIBILITY_DIRECT_INCLUDE:
                pass
            else:
                assert False, package_visibility_action[0]
                pass
            pass
        pass
Example #16
0
    def output(self):
        super(LinkedOutputBuilder, self).output()
        cmake_output_builder = find_cmake_output_builder(self.parentbuilder())

        for linked in self.parentbuilder().iter_builders():
            if not isinstance(linked, LinkedBuilder):
                continue

            # add the linked entity.
            if True:
                members = []
                for member in linked.members():
                    if member.file().state() == FileState.VIRTUAL:
                        members.append('${CMAKE_CURRENT_BINARY_DIR}/%s' %
                                       member.file().name())
                    else:
                        members.append(member.file().name())
                        pass
                    pass

                if isinstance(linked, ExecutableBuilder):
                    target_name = linked.exename()
                    cmake_output_builder.local_cmakelists().add_executable(
                        target_name, members)
                    if linked.what() == ExecutableBuilder.BIN:
                        cmake_output_builder.local_cmakelists(
                        ).add_install__targets(targets=[target_name],
                                               destination='bin')
                        pass
                    pass
                elif isinstance(linked, LibraryBuilder):
                    target_name = linked.basename()
                    cmake_output_builder.local_cmakelists().add_library(
                        target_name, members)
                    cmake_output_builder.local_cmakelists(
                    ).add_install__targets(targets=[target_name],
                                           destination='lib')
                    pass
                else:
                    assert False, 'unknown LinkedBuilder type: ' + str(linked)
                    pass
                pass

            # add libraries and linker paths if any.
            if True:
                native_local_libraries = []
                native_installed_libraries = []

                for bi in linked.topo_libraries():
                    if isinstance(bi, BuildInfo_CLibrary_NativeLocal):
                        native_local_libraries.append(bi.basename())
                        continue
                    if isinstance(bi, BuildInfo_CLibrary_NativeInstalled):
                        native_installed_libraries.append(bi.basename())
                        continue
                    assert 0, 'missed some relevant build info type'
                    pass

                # if there are libraries that have been installed
                # natively using confix, then their path is added
                # first.
                if len(native_installed_libraries):
                    cmake_output_builder.local_cmakelists().add_link_directory(
                        '${CMAKE_INSTALL_PREFIX}/lib')
                    cmake_output_builder.local_cmakelists().add_link_directory(
                        directory=[
                            'FOREACH(dir ${READONLY_PREFIXES})',
                            '    LINK_DIRECTORIES(${dir}/lib)',
                            'ENDFOREACH(dir)'
                        ],
                        literally=True)
                    pass

                # next come the paths pointing to external libraries.
                for dir in self.__external_libpath:
                    cmake_output_builder.local_cmakelists().add_link_directory(
                        dir)
                    pass

                link_libraries = []
                have = set()
                for lib in itertools.chain(native_local_libraries,
                                           native_installed_libraries,
                                           self.__external_libraries):
                    if lib in have:
                        continue
                    have.add(lib)
                    link_libraries.append(lib)
                    pass

                if len(link_libraries):
                    cmake_output_builder.local_cmakelists(
                    ).target_link_libraries(target_name, link_libraries)
                    pass
                pass
            pass

        pass
Example #17
0
    def test__CMAKE_PKG_CONFIG_LIBRARY(self):
        fs = FileSystem(path=[])
        fs.rootdirectory().add(
            name=const.CONFIX2_PKG,
            entry=File(lines=[
                "PACKAGE_NAME('test_CMAKE_PKG_CONFIG_LIBRARY')",
                "PACKAGE_VERSION('1.2.3')"
            ]))
        fs.rootdirectory().add(
            name=const.CONFIX2_DIR,
            entry=File(
                lines=["DIRECTORY(['external'])", "DIRECTORY(['linked'])"]))

        external = fs.rootdirectory().add(name='external', entry=Directory())
        external.add(name=const.CONFIX2_DIR,
                     entry=File(lines=[
                         "PROVIDE_SYMBOL('xxx-glue')",
                         "CMAKE_PKG_CONFIG_LIBRARY(packagename='xxx')"
                     ]))

        linked = fs.rootdirectory().add(name='linked', entry=Directory())
        linked.add(name=const.CONFIX2_DIR,
                   entry=File(lines=[
                       "REQUIRE_SYMBOL('xxx-glue', URGENCY_ERROR)",
                       "EXECUTABLE(exename='exe', center=C(filename='main.c'))"
                   ]))
        linked.add(name='main.c', entry=File(lines=['int main(void() {}']))

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

        linked_cmake_output_builder = find_cmake_output_builder(
            package.rootbuilder().find_entry_builder(['linked']))

        self.failUnless(
            'FIND_PACKAGE(PkgConfig)' in
            linked_cmake_output_builder.top_cmakelists().get_find_calls())
        self.failUnless(
            'PKG_CHECK_MODULES(CONFIX_CMAKE_PKG_CONFIG__xxx REQUIRED xxx)' in
            linked_cmake_output_builder.top_cmakelists().get_find_calls())

        self.failUnless('${CONFIX_CMAKE_PKG_CONFIG__xxx_LIBRARIES}' in
                        linked_cmake_output_builder.local_cmakelists(
                        ).get_target_link_libraries('exe'))
        self.failUnless('${CONFIX_CMAKE_PKG_CONFIG__xxx_LIBRARY_DIRS}' in
                        linked_cmake_output_builder.local_cmakelists(
                        ).get_link_directories())
        self.failUnless('${CONFIX_CMAKE_PKG_CONFIG__xxx_INCLUDE_DIRS}' in
                        linked_cmake_output_builder.local_cmakelists(
                        ).get_include_directories())
        self.failUnless(
            '${CONFIX_CMAKE_PKG_CONFIG__xxx_CFLAGS}' in
            linked_cmake_output_builder.local_cmakelists().get_definitions())
        self.failUnless(
            '${CONFIX_CMAKE_PKG_CONFIG__xxx_CFLAGS_OTHER}' in
            linked_cmake_output_builder.local_cmakelists().get_definitions())

        pass