(self, target: build.BuildTarget)
return other_src[0], other_src[1], vala_c_src
Vala is compiled into C. Set up all necessary build steps here.
Vala is compiled into C. Set up all necessary build steps here.
Vala is compiled into C . Set up all necessary build steps here .
def generate_vala_compile(self, target: build.BuildTarget) -> \
            T.Tuple[T.MutableMapping[str, File], T.MutableMapping[str, File], T.List[str]]:
        """Vala is compiled into C. Set up all necessary build steps here."""
        (vala_src, vapi_src, other_src) = self.split_vala_sources(target)
        extra_dep_files = []
        if not vala_src:
            raise InvalidArguments(f'Vala library {target.name!r} has no Vala or Genie source files.')

        valac = target.compilers['vala']
        c_out_dir = self.get_target_private_dir(target)
        # C files generated by valac
        vala_c_src: T.List[str] = []
        # Files generated by valac
        valac_outputs: T.List = []
        # All sources that are passed to valac on the commandline
        all_files = list(vapi_src)
        # Passed as --basedir
        srcbasedir = os.path.join(self.build_to_src, target.get_subdir())
        for (vala_file, gensrc) in vala_src.items():
            all_files.append(vala_file)
            # Figure out where the Vala compiler will write the compiled C file
            #
            # If the Vala file is in a subdir of the build dir (in our case
            # because it was generated/built by something else), and is also
            # a subdir of --basedir (because the builddir is in the source
            # tree, and the target subdir is the source root), the subdir
            # components from the source root till the private builddir will be
            # duplicated inside the private builddir. Otherwise, just the
            # basename will be used.
            #
            # If the Vala file is outside the build directory, the paths from
            # the --basedir till the subdir will be duplicated inside the
            # private builddir.
            if isinstance(gensrc, (build.CustomTarget, build.GeneratedList)) or gensrc.is_built:
                vala_c_file = os.path.splitext(os.path.basename(vala_file))[0] + '.c'
                # Check if the vala file is in a subdir of --basedir
                abs_srcbasedir = os.path.join(self.environment.get_source_dir(), target.get_subdir())
                abs_vala_file = os.path.join(self.environment.get_build_dir(), vala_file)
                if PurePath(os.path.commonpath((abs_srcbasedir, abs_vala_file))) == PurePath(abs_srcbasedir):
                    vala_c_subdir = PurePath(abs_vala_file).parent.relative_to(abs_srcbasedir)
                    vala_c_file = os.path.join(str(vala_c_subdir), vala_c_file)
            else:
                path_to_target = os.path.join(self.build_to_src, target.get_subdir())
                if vala_file.startswith(path_to_target):
                    vala_c_file = os.path.splitext(os.path.relpath(vala_file, path_to_target))[0] + '.c'
                else:
                    vala_c_file = os.path.splitext(os.path.basename(vala_file))[0] + '.c'
            # All this will be placed inside the c_out_dir
            vala_c_file = os.path.join(c_out_dir, vala_c_file)
            vala_c_src.append(vala_c_file)
            valac_outputs.append(vala_c_file)

        args = self.generate_basic_compiler_args(target, valac)
        args += valac.get_colorout_args(self.environment.coredata.options.get(OptionKey('b_colorout')).value)
        # Tell Valac to output everything in our private directory. Sadly this
        # means it will also preserve the directory components of Vala sources
        # found inside the build tree (generated sources).
        args += ['--directory', c_out_dir]
        args += ['--basedir', srcbasedir]
        if target.is_linkable_target():
            # Library name
            args += ['--library', target.name]
            # Outputted header
            hname = os.path.join(self.get_target_dir(target), target.vala_header)
            args += ['--header', hname]
            if self.is_unity(target):
                # Without this the declarations will get duplicated in the .c
                # files and cause a build failure when all of them are
                # #include-d in one .c file.
                # https://github.com/mesonbuild/meson/issues/1969
                args += ['--use-header']
            valac_outputs.append(hname)
            # Outputted vapi file
            vapiname = os.path.join(self.get_target_dir(target), target.vala_vapi)
            # Force valac to write the vapi and gir files in the target build dir.
            # Without this, it will write it inside c_out_dir
            args += ['--vapi', os.path.join('..', target.vala_vapi)]
            valac_outputs.append(vapiname)
            target.outputs += [target.vala_header, target.vala_vapi]
            target.install_tag += ['devel', 'devel']
            # Install header and vapi to default locations if user requests this
            if len(target.install_dir) > 1 and target.install_dir[1] is True:
                target.install_dir[1] = self.environment.get_includedir()
            if len(target.install_dir) > 2 and target.install_dir[2] is True:
                target.install_dir[2] = os.path.join(self.environment.get_datadir(), 'vala', 'vapi')
            # Generate GIR if requested
            if isinstance(target.vala_gir, str):
                girname = os.path.join(self.get_target_dir(target), target.vala_gir)
                args += ['--gir', os.path.join('..', target.vala_gir)]
                valac_outputs.append(girname)
                target.outputs.append(target.vala_gir)
                target.install_tag.append('devel')
                # Install GIR to default location if requested by user
                if len(target.install_dir) > 3 and target.install_dir[3] is True:
                    target.install_dir[3] = os.path.join(self.environment.get_datadir(), 'gir-1.0')
        # Detect gresources and add --gresources arguments for each
        for gensrc in other_src[1].values():
            if isinstance(gensrc, modules.GResourceTarget):
                gres_xml, = self.get_custom_target_sources(gensrc)
                args += ['--gresources=' + gres_xml]
        extra_args = []

        for a in target.extra_args.get('vala', []):
            if isinstance(a, File):
                relname = a.rel_to_builddir(self.build_to_src)
                extra_dep_files.append(relname)
                extra_args.append(relname)
            else:
                extra_args.append(a)
        dependency_vapis = self.determine_dep_vapis(target)
        extra_dep_files += dependency_vapis
        args += extra_args
        element = NinjaBuildElement(self.all_outputs, valac_outputs,
                                    self.compiler_to_rule_name(valac),
                                    all_files + dependency_vapis)
        element.add_item('ARGS', args)
        element.add_dep(extra_dep_files)
        self.add_build(element)
        self.create_target_source_introspection(target, valac, args, all_files, [])
        return other_src[0], other_src[1], vala_c_src
def generate_vala_compile ( self , target : build . BuildTarget ) -> T . Tuple [ T . MutableMapping [ str , File ] , T . MutableMapping [ str , File ] , T . List [ str ] ] : ( vala_src , vapi_src , other_src ) = self . split_vala_sources ( target ) extra_dep_files = [ ] if not vala_src : raise InvalidArguments ( f'Vala library {target.name!r} has no Vala or Genie source files.' ) valac = target . compilers [ 'vala' ] c_out_dir = self . get_target_private_dir ( target ) # C files generated by valac vala_c_src : T . List [ str ] = [ ] # Files generated by valac valac_outputs : T . List = [ ] # All sources that are passed to valac on the commandline all_files = list ( vapi_src ) # Passed as --basedir srcbasedir = os . path . join ( self . build_to_src , target . get_subdir ( ) ) for ( vala_file , gensrc ) in vala_src . items ( ) : all_files . append ( vala_file ) # Figure out where the Vala compiler will write the compiled C file # # If the Vala file is in a subdir of the build dir (in our case # because it was generated/built by something else), and is also # a subdir of --basedir (because the builddir is in the source # tree, and the target subdir is the source root), the subdir # components from the source root till the private builddir will be # duplicated inside the private builddir. Otherwise, just the # basename will be used. # # If the Vala file is outside the build directory, the paths from # the --basedir till the subdir will be duplicated inside the # private builddir. if isinstance ( gensrc , ( build . CustomTarget , build . GeneratedList ) ) or gensrc . is_built : vala_c_file = os . path . splitext ( os . path . basename ( vala_file ) ) [ 0 ] + '.c' # Check if the vala file is in a subdir of --basedir abs_srcbasedir = os . path . join ( self . environment . get_source_dir ( ) , target . get_subdir ( ) ) abs_vala_file = os . path . join ( self . environment . get_build_dir ( ) , vala_file ) if PurePath ( os . path . commonpath ( ( abs_srcbasedir , abs_vala_file ) ) ) == PurePath ( abs_srcbasedir ) : vala_c_subdir = PurePath ( abs_vala_file ) . parent . relative_to ( abs_srcbasedir ) vala_c_file = os . path . join ( str ( vala_c_subdir ) , vala_c_file ) else : path_to_target = os . path . join ( self . build_to_src , target . get_subdir ( ) ) if vala_file . startswith ( path_to_target ) : vala_c_file = os . path . splitext ( os . path . relpath ( vala_file , path_to_target ) ) [ 0 ] + '.c' else : vala_c_file = os . path . splitext ( os . path . basename ( vala_file ) ) [ 0 ] + '.c' # All this will be placed inside the c_out_dir vala_c_file = os . path . join ( c_out_dir , vala_c_file ) vala_c_src . append ( vala_c_file ) valac_outputs . append ( vala_c_file ) args = self . generate_basic_compiler_args ( target , valac ) args += valac . get_colorout_args ( self . environment . coredata . options . get ( OptionKey ( 'b_colorout' ) ) . value ) # Tell Valac to output everything in our private directory. Sadly this # means it will also preserve the directory components of Vala sources # found inside the build tree (generated sources). args += [ '--directory' , c_out_dir ] args += [ '--basedir' , srcbasedir ] if target . is_linkable_target ( ) : # Library name args += [ '--library' , target . name ] # Outputted header hname = os . path . join ( self . get_target_dir ( target ) , target . vala_header ) args += [ '--header' , hname ] if self . is_unity ( target ) : # Without this the declarations will get duplicated in the .c # files and cause a build failure when all of them are # #include-d in one .c file. # https://github.com/mesonbuild/meson/issues/1969 args += [ '--use-header' ] valac_outputs . append ( hname ) # Outputted vapi file vapiname = os . path . join ( self . get_target_dir ( target ) , target . vala_vapi ) # Force valac to write the vapi and gir files in the target build dir. # Without this, it will write it inside c_out_dir args += [ '--vapi' , os . path . join ( '..' , target . vala_vapi ) ] valac_outputs . append ( vapiname ) target . outputs += [ target . vala_header , target . vala_vapi ] target . install_tag += [ 'devel' , 'devel' ] # Install header and vapi to default locations if user requests this if len ( target . install_dir ) > 1 and target . install_dir [ 1 ] is True : target . install_dir [ 1 ] = self . environment . get_includedir ( ) if len ( target . install_dir ) > 2 and target . install_dir [ 2 ] is True : target . install_dir [ 2 ] = os . path . join ( self . environment . get_datadir ( ) , 'vala' , 'vapi' ) # Generate GIR if requested if isinstance ( target . vala_gir , str ) : girname = os . path . join ( self . get_target_dir ( target ) , target . vala_gir ) args += [ '--gir' , os . path . join ( '..' , target . vala_gir ) ] valac_outputs . append ( girname ) target . outputs . append ( target . vala_gir ) target . install_tag . append ( 'devel' ) # Install GIR to default location if requested by user if len ( target . install_dir ) > 3 and target . install_dir [ 3 ] is True : target . install_dir [ 3 ] = os . path . join ( self . environment . get_datadir ( ) , 'gir-1.0' ) # Detect gresources and add --gresources arguments for each for gensrc in other_src [ 1 ] . values ( ) : if isinstance ( gensrc , modules . GResourceTarget ) : gres_xml , = self . get_custom_target_sources ( gensrc ) args += [ '--gresources=' + gres_xml ] extra_args = [ ] for a in target . extra_args . get ( 'vala' , [ ] ) : if isinstance ( a , File ) : relname = a . rel_to_builddir ( self . build_to_src ) extra_dep_files . append ( relname ) extra_args . append ( relname ) else : extra_args . append ( a ) dependency_vapis = self . determine_dep_vapis ( target ) extra_dep_files += dependency_vapis args += extra_args element = NinjaBuildElement ( self . all_outputs , valac_outputs , self . compiler_to_rule_name ( valac ) , all_files + dependency_vapis ) element . add_item ( 'ARGS' , args ) element . add_dep ( extra_dep_files ) self . add_build ( element ) self . create_target_source_introspection ( target , valac , args , all_files , [ ] ) return other_src [ 0 ] , other_src [ 1 ] , vala_c_src