Exemplo n.º 1
0
class Target:
    StaticLibrary = 'static'
    SharedLibrary = 'shared'
    Executable = 'executable'

    # ctor
    def __init__(self,
                 name,
                 sources=None,
                 paths=None,
                 defines=None,
                 linkTo=None,
                 link=None):
        self._project = Makefile.project
        self.name = name
        self._defines = []
        self._root = Folder(self)
        self.resources = []
        self.commands = []
        self._linkWith = []
        self._paths = []
        self.type = linkTo
        self._pathScope = PathScope.current

        # Register this target
        if self.project:
            self.project.registerTarget(self)

        # Add default include folders
        if paths:
            for path in paths:
                if path.startswith('L:'):
                    self.librarySearchPaths(path.split(':')[1])
                else:
                    self.include(path)

        # Add default libs
        if link:
            self.link(*link)

        # Add default defines
        if defines:
            self.define(*defines)

        # Add default sources
        if sources:
            for source in sources:
                fullPath = self.toFullPath(source)

                if os.path.isfile(fullPath):
                    self.files(source)
                else:
                    self.dirs(source)

        # Link to
        if linkTo == Target.Executable:
            self.executable()
        elif linkTo == Target.StaticLibrary:
            self.staticLibrary()
        elif linkTo == Target.SharedLibrary:
            self.sharedLibrary()

    # projectpath
    @property
    def projectpath(self):
        return (self.project.generator.getPathForTarget(self) if self.project
                else self._currentBinaryDir).replace('\\', '/')

    # sourcePath
    @property
    def sourcePath(self):
        return self._pathScope.source

    # project
    @property
    def project(self):
        return self._project

    # defines
    @property
    def defines(self):
        return self._defines

    # toFullPath
    def toFullPath(self, path):
        return os.path.join(self._pathScope.source,
                            Makefile.substituteVars(path)).replace('\\', '/')

    # toSourcePath
    def toSourcePath(self, path):
        return os.path.relpath(path, self._pathScope.source).replace('\\', '/')

    # define
    def define(self, *list):
        [self.defines.append(define) for define in list]

    # dirs
    def dirs(self, *list):
        [
            self._root.addFilesFromDirectory(self.toFullPath(path))
            for path in list
        ]

    # files
    def files(self, *items):
        for item in items:
            if isinstance(item, list):
                self.files(*item)
            else:
                self._root.addFileAtPath(
                    self.toSourcePath(self.toFullPath(item)))

    # link
    def link(self, *list):
        assert not None in list
        [
            self._linkWith.append(
                namedtuple('LocalLibrary', 'type, name')(type='local',
                                                         name=item))
            for item in list
        ]

    # linkExternal
    def linkExternal(self, *list):
        allLinked = True

        for location in list:
            if not location or not location.name:
                allLinked = False
                continue

            self._linkWith.append(location)

        return allLinked

    # include
    def include(self, *paths):
        [self._paths.append(Path(Path.Headers, path)) for path in paths]

    # add_library_search_paths
    def add_library_search_paths(self, *paths):
        [self._paths.append(Path(Path.Libraries, path)) for path in paths]

    # add_headers_search_paths
    def add_headers_search_paths(self, *paths):
        [self._paths.append(Path(Path.Headers, path)) for path in paths]

    # assets
    def assets(self, *list):
        [self.resources.append(path) for path in list]

    # filterSourceFiles
    def filterSourceFiles(self, filter=None):
        return self._root.filterFiles(filter)

    # filterLibraries
    def filterLibraries(self, filter=None):
        return [
            library for library in self._linkWith
            if filter == None or filter(library)
        ]

    # filterFolders
    def filterFolders(self, filter=None):
        return self._root.filterFolders(filter)

    # filterPaths
    def filterPaths(self, filter=None):
        return [path for path in self._paths if filter == None or filter(path)]

    # sharedLibrary
    def sharedLibrary(self):
        self.type = Target.SharedLibrary

    # staticLibrary
    def staticLibrary(self):
        self.type = Target.StaticLibrary

    # executable
    def executable(self, **params):
        self.params = params
        self.type = Target.Executable