@ -266,7 +266,7 @@ class PkgConfigModule(ExtensionModule):
def generate_pkgconfig_file ( self , state , deps , subdirs , name , description ,
url , version , pcfile , conflicts , variables ,
uninstalled = False ) :
uninstalled = False , dataonly = False ) :
deps . remove_dups ( )
coredata = state . environment . get_coredata ( )
if uninstalled :
@ -283,12 +283,13 @@ class PkgConfigModule(ExtensionModule):
incdir = PurePath ( coredata . get_builtin_option ( ' includedir ' ) )
fname = os . path . join ( outdir , pcfile )
with open ( fname , ' w ' , encoding = ' utf-8 ' ) as ofile :
ofile . write ( ' prefix= {} \n ' . format ( self . _escape ( prefix ) ) )
if uninstalled :
ofile . write ( ' srcdir= {} \n ' . format ( self . _escape ( srcdir ) ) )
else :
ofile . write ( ' libdir= {} \n ' . format ( self . _escape ( ' $ {prefix} ' / libdir ) ) )
ofile . write ( ' includedir= {} \n ' . format ( self . _escape ( ' $ {prefix} ' / incdir ) ) )
if not dataonly :
ofile . write ( ' prefix= {} \n ' . format ( self . _escape ( prefix ) ) )
if uninstalled :
ofile . write ( ' srcdir= {} \n ' . format ( self . _escape ( srcdir ) ) )
else :
ofile . write ( ' libdir= {} \n ' . format ( self . _escape ( ' $ {prefix} ' / libdir ) ) )
ofile . write ( ' includedir= {} \n ' . format ( self . _escape ( ' $ {prefix} ' / incdir ) ) )
if variables :
ofile . write ( ' \n ' )
for k , v in variables :
@ -370,27 +371,28 @@ class PkgConfigModule(ExtensionModule):
ofile . write ( ' Libs: {} \n ' . format ( ' ' . join ( generate_libs_flags ( deps . pub_libs ) ) ) )
if len ( deps . priv_libs ) > 0 :
ofile . write ( ' Libs.private: {} \n ' . format ( ' ' . join ( generate_libs_flags ( deps . priv_libs ) ) ) )
def generate_compiler_flags ( ) :
cflags_buf = [ ]
for f in deps . cflags :
cflags_buf . append ( self . _escape ( f ) )
return cflags_buf
cflags = generate_compiler_flags ( )
ofile . write ( ' Cflags: ' )
if uninstalled :
ofile . write ( ' ' . join ( generate_uninstalled_cflags ( deps . pub_libs + deps . priv_libs ) ) )
else :
for h in subdirs :
ofile . write ( ' ' )
if h == ' . ' :
ofile . write ( ' -I$ {includedir} ' )
else :
ofile . write ( self . _escape ( PurePath ( ' -I$ {includedir} ' ) / h ) )
for f in deps . cflags :
ofile . write ( ' ' )
ofile . write ( self . _escape ( f ) )
ofile . write ( ' \n ' )
elif not dataonly and cflags :
ofile . write ( ' {} \n ' . format ( ' ' . join ( cflags ) ) )
@FeatureNewKwargs ( ' pkgconfig.generate ' , ' 0.54.0 ' , [ ' uninstalled_variables ' ] )
@FeatureNewKwargs ( ' pkgconfig.generate ' , ' 0.42.0 ' , [ ' extra_cflags ' ] )
@FeatureNewKwargs ( ' pkgconfig.generate ' , ' 0.41.0 ' , [ ' variables ' ] )
@FeatureNewKwargs ( ' pkgconfig.generate ' , ' 0.54.0 ' , [ ' dataonly ' ] )
@permittedKwargs ( { ' libraries ' , ' version ' , ' name ' , ' description ' , ' filebase ' ,
' subdirs ' , ' requires ' , ' requires_private ' , ' libraries_private ' ,
' install_dir ' , ' extra_cflags ' , ' variables ' , ' url ' , ' d_module_versions ' } )
' install_dir ' , ' extra_cflags ' , ' variables ' , ' url ' , ' d_module_versions ' ,
' dataonly ' } )
def generate ( self , state , args , kwargs ) :
if ' variables ' in kwargs :
FeatureNew ( ' custom pkgconfig variables ' , ' 0.41.0 ' ) . use ( state . subproject )
@ -399,6 +401,7 @@ class PkgConfigModule(ExtensionModule):
default_description = None
default_name = None
mainlib = None
default_subdirs = [ ' . ' ]
if not args and ' version ' not in kwargs :
FeatureNew ( ' pkgconfig.generate implicit version keyword ' , ' 0.46.0 ' ) . use ( state . subproject )
elif len ( args ) == 1 :
@ -414,7 +417,14 @@ class PkgConfigModule(ExtensionModule):
elif len ( args ) > 1 :
raise mesonlib . MesonException ( ' Too many positional arguments passed to Pkgconfig_gen. ' )
subdirs = mesonlib . stringlistify ( kwargs . get ( ' subdirs ' , [ ' . ' ] ) )
dataonly = kwargs . get ( ' dataonly ' , False )
if dataonly :
default_subdirs = [ ]
blocked_vars = [ ' libraries ' , ' libraries_private ' , ' require_private ' , ' extra_cflags ' , ' subdirs ' ]
if len ( set ( kwargs ) & set ( blocked_vars ) ) > 0 :
raise mesonlib . MesonException ( ' Cannot combine dataonly with any of {} ' . format ( blocked_vars ) )
subdirs = mesonlib . stringlistify ( kwargs . get ( ' subdirs ' , default_subdirs ) )
version = kwargs . get ( ' version ' , default_version )
if not isinstance ( version , str ) :
raise mesonlib . MesonException ( ' Version must be specified. ' )
@ -440,6 +450,11 @@ class PkgConfigModule(ExtensionModule):
libraries = [ mainlib ] + libraries
deps = DependenciesHelper ( state , filebase )
for d in subdirs :
if d == ' . ' :
deps . add_cflags ( [ ' -I$ {includedir} ' ] )
else :
deps . add_cflags ( self . _escape ( PurePath ( ' -I$ {includedir} ' ) / d ) )
deps . add_pub_libs ( libraries )
deps . add_priv_libs ( kwargs . get ( ' libraries_private ' , [ ] ) )
deps . add_pub_reqs ( kwargs . get ( ' requires ' , [ ] ) )
@ -488,13 +503,14 @@ class PkgConfigModule(ExtensionModule):
if not isinstance ( pkgroot , str ) :
raise mesonlib . MesonException ( ' Install_dir must be a string. ' )
self . generate_pkgconfig_file ( state , deps , subdirs , name , description , url ,
version , pcfile , conflicts , variables )
version , pcfile , conflicts , variables ,
False , dataonly )
res = build . Data ( mesonlib . File ( True , state . environment . get_scratch_dir ( ) , pcfile ) , pkgroot )
variables = parse_variable_list ( mesonlib . stringlistify ( kwargs . get ( ' uninstalled_variables ' , [ ] ) ) )
pcfile = filebase + ' -uninstalled.pc '
self . generate_pkgconfig_file ( state , deps , subdirs , name , description , url ,
version , pcfile , conflicts , variables ,
uninstalled = True )
uninstalled = True , dataonly = dataonly )
# Associate the main library with this generated pc file. If the library
# is used in any subsequent call to the generated, it will generate a
# 'Requires:' or 'Requires.private:'.