@ -18,6 +18,7 @@ functionality such as gobject-introspection and gresources.'''
from . . import build
import os
import sys
import copy
import subprocess
from . . mesonlib import MesonException
from . . import dependencies
@ -43,9 +44,9 @@ class GnomeModule:
def __print_gresources_warning ( self , state ) :
global gresource_warning_printed
if not gresource_warning_printed :
if mesonlib . version_compare ( self . _get_native_glib_version ( state ) , ' < 2.50.0 ' ) :
if mesonlib . version_compare ( self . _get_native_glib_version ( state ) , ' < 2.50.2 ' ) :
mlog . warning ( ' GLib compiled dependencies do not work fully '
' with versions of GLib older than 2.50.0 . \n '
' with versions of GLib older than 2.50.2 . \n '
' See the following upstream issue: ' ,
mlog . bold ( ' https://bugzilla.gnome.org/show_bug.cgi?id=745754 ' ) )
gresource_warning_printed = True
@ -60,9 +61,6 @@ class GnomeModule:
if not isinstance ( source_dirs , list ) :
source_dirs = [ source_dirs ]
# Always include current directory, but after paths set by user
source_dirs . append ( os . path . join ( state . environment . get_source_dir ( ) , state . subdir ) )
if len ( args ) < 2 :
raise MesonException ( ' Not enough arguments; The name of the resource and the path to the XML file are required ' )
@ -70,8 +68,8 @@ class GnomeModule:
if not isinstance ( dependencies , list ) :
dependencies = [ dependencies ]
if mesonlib . version_compare ( self . _get_native_glib_version ( state ) ,
' < 2.48.2 ' ) :
glib_version = self . _get_native_glib_version ( state )
if mesonlib . version_compare ( glib_version , ' < 2.48.2 ' ) :
if len ( dependencies ) > 0 :
raise MesonException (
' The " dependencies " argument of gnome.compile_resources() '
@ -87,18 +85,18 @@ class GnomeModule:
else :
raise RuntimeError ( ' Unreachable code. ' )
kwargs [ ' depend_files ' ] = self . _get_gresource_dependencies (
depend_files , depends , subdirs = self . _get_gresource_dependencies (
state , ifile , source_dirs , dependencies )
for source_dir in source_dirs :
sourcedir = os . path . join ( state . build_to_src , state . subdir , source_dir )
cmd + = [ ' --sourcedir ' , sourcedir ]
# Make source dirs relative to build dir now
source_dirs = [ os . path . join ( state . build_to_src , state . subdir , d ) for d in source_dirs ]
# Always include current directory, but after paths set by user
source_dirs . append ( os . path . join ( state . build_to_src , state . subdir ) )
# Ensure build directories of generated deps are included
source_dirs + = subdirs
if len ( dependencies ) > 0 :
# Add the build variant of each sourcedir if we have any
# generated dependencies.
sourcedir = os . path . join ( state . subdir , source_dir )
cmd + = [ ' --sourcedir ' , sourcedir ]
for source_dir in set ( source_dirs ) :
cmd + = [ ' --sourcedir ' , source_dir ]
if ' c_name ' in kwargs :
cmd + = [ ' --c-name ' , kwargs . pop ( ' c_name ' ) ]
@ -106,17 +104,30 @@ class GnomeModule:
cmd + = mesonlib . stringlistify ( kwargs . pop ( ' extra_args ' , [ ] ) )
kwargs [ ' command ' ] = cmd
kwargs [ ' input ' ] = args [ 1 ]
kwargs [ ' output ' ] = args [ 0 ] + ' .c '
kwargs [ ' depends ' ] = depends
if mesonlib . version_compare ( glib_version , ' < 2.50.2 ' ) :
# This will eventually go out of sync if dependencies are added
kwargs [ ' depend_files ' ] = depend_files
kwargs [ ' command ' ] = cmd
else :
depfile = kwargs [ ' output ' ] + ' .d '
kwargs [ ' depfile ' ] = depfile
kwargs [ ' command ' ] = copy . copy ( cmd ) + [ ' --dependency-file ' , ' @DEPFILE@ ' ]
target_c = build . CustomTarget ( args [ 0 ] + ' _c ' , state . subdir , kwargs )
kwargs [ ' output ' ] = args [ 0 ] + ' .h '
target_h = build . CustomTarget ( args [ 0 ] + ' _h ' , state . subdir , kwargs )
h_kwargs = {
' command ' : cmd ,
' input ' : args [ 1 ] ,
' output ' : args [ 0 ] + ' .h ' ,
# The header doesn't actually care about the files yet it errors if missing
' depends ' : depends
}
target_h = build . CustomTarget ( args [ 0 ] + ' _h ' , state . subdir , h_kwargs )
return [ target_c , target_h ]
def _get_gresource_dependencies ( self , state , input_file , source_dirs , dependencies ) :
self . __print_gresources_warning ( state )
for dep in dependencies :
if not isinstance ( dep , interpreter . CustomTargetHolder ) and not \
isinstance ( dep , mesonlib . File ) :
@ -131,6 +142,7 @@ class GnomeModule:
for source_dir in source_dirs :
cmd + = [ ' --sourcedir ' , os . path . join ( state . subdir , source_dir ) ]
cmd + = [ ' --sourcedir ' , state . subdir ] # Current dir
pc = subprocess . Popen ( cmd , stdout = subprocess . PIPE , universal_newlines = True ,
cwd = state . environment . get_source_dir ( ) )
@ -154,6 +166,8 @@ class GnomeModule:
return os . path . exists ( os . path . join ( state . environment . get_source_dir ( ) , f ) )
missing_dep_files = [ f for f in dep_files if not exists_in_srcdir ( f ) ]
depends = [ ]
subdirs = [ ]
for missing in missing_dep_files :
found = False
missing_basename = os . path . basename ( missing )
@ -164,6 +178,7 @@ class GnomeModule:
found = True
dep_files . remove ( missing )
dep_files . append ( dep )
subdirs . append ( dep . subdir )
break
elif isinstance ( dep , interpreter . CustomTargetHolder ) :
if dep . held_object . get_basename ( ) == missing_basename :
@ -174,6 +189,8 @@ class GnomeModule:
is_built = True ,
subdir = dep . held_object . get_subdir ( ) ,
fname = dep . held_object . get_basename ( ) ) )
depends . append ( dep . held_object )
subdirs . append ( dep . held_object . get_subdir ( ) )
break
if not found :
@ -183,7 +200,7 @@ class GnomeModule:
' gnome.compile_resources() using the " dependencies " '
' keyword argument. ' % ( missing , input_file ) )
return dep_files
return dep_files , depends , subdirs
@staticmethod
def _get_link_args ( state , lib , depends = None ) :