1# Copyright (c) 2016 WorkWare Systems http://www.workware.net.au/ 2# All rights reserved 3 4# @synopsis: 5# 6# The 'pkg-config' module allows package information to be found via 'pkg-config'. 7# 8# If not cross-compiling, the package path should be determined automatically 9# by 'pkg-config'. 10# If cross-compiling, the default package path is the compiler sysroot. 11# If the C compiler doesn't support '-print-sysroot', the path can be supplied 12# by the '--sysroot' option or by defining 'SYSROOT'. 13# 14# 'PKG_CONFIG' may be set to use an alternative to 'pkg-config'. 15 16use cc 17 18options { 19 sysroot:dir => "Override compiler sysroot for pkg-config search path" 20} 21 22# @pkg-config-init ?required? 23# 24# Initialises the 'pkg-config' system. Unless '$required' is set to 0, 25# it is a fatal error if a usable 'pkg-config' is not found . 26# 27# This command will normally be called automatically as required, 28# but it may be invoked explicitly if lack of 'pkg-config' is acceptable. 29# 30# Returns 1 if ok, or 0 if 'pkg-config' not found/usable (only if '$required' is 0). 31# 32proc pkg-config-init {{required 1}} { 33 if {[is-defined HAVE_PKG_CONFIG]} { 34 return [get-define HAVE_PKG_CONFIG] 35 } 36 set found 0 37 38 define PKG_CONFIG [get-env PKG_CONFIG pkg-config] 39 msg-checking "Checking for pkg-config..." 40 41 if {[catch {exec [get-define PKG_CONFIG] --version} version]} { 42 msg-result "[get-define PKG_CONFIG] (not found)" 43 if {$required} { 44 user-error "No usable pkg-config" 45 } 46 } else { 47 msg-result $version 48 define PKG_CONFIG_VERSION $version 49 50 set found 1 51 52 if {[opt-str sysroot o]} { 53 define SYSROOT [file-normalize $o] 54 msg-result "Using specified sysroot [get-define SYSROOT]" 55 } elseif {[get-define build] ne [get-define host]} { 56 if {[catch {exec-with-stderr {*}[get-define CC] -print-sysroot} result errinfo] == 0} { 57 # Use the compiler sysroot, if there is one 58 define SYSROOT $result 59 msg-result "Found compiler sysroot $result" 60 } else { 61 configlog "[get-define CC] -print-sysroot: $result" 62 set msg "pkg-config: Cross compiling, but no compiler sysroot and no --sysroot supplied" 63 if {$required} { 64 user-error $msg 65 } else { 66 msg-result $msg 67 } 68 set found 0 69 } 70 } 71 if {[is-defined SYSROOT]} { 72 set sysroot [get-define SYSROOT] 73 74 # XXX: It's possible that these should be set only when invoking pkg-config 75 global env 76 set env(PKG_CONFIG_DIR) "" 77 # Supposedly setting PKG_CONFIG_LIBDIR means that PKG_CONFIG_PATH is ignored, 78 # but it doesn't seem to work that way in practice 79 set env(PKG_CONFIG_PATH) "" 80 # Do we need to try /usr/local as well or instead? 81 set env(PKG_CONFIG_LIBDIR) $sysroot/usr/lib/pkgconfig:$sysroot/usr/share/pkgconfig 82 set env(PKG_CONFIG_SYSROOT_DIR) $sysroot 83 } 84 } 85 define HAVE_PKG_CONFIG $found 86 return $found 87} 88 89# @pkg-config module ?requirements? 90# 91# Use 'pkg-config' to find the given module meeting the given requirements. 92# e.g. 93# 94## pkg-config pango >= 1.37.0 95# 96# If found, returns 1 and sets 'HAVE_PKG_PANGO' to 1 along with: 97# 98## PKG_PANGO_VERSION to the found version 99## PKG_PANGO_LIBS to the required libs (--libs-only-l) 100## PKG_PANGO_LDFLAGS to the required linker flags (--libs-only-L) 101## PKG_PANGO_CFLAGS to the required compiler flags (--cflags) 102# 103# If not found, returns 0. 104# 105proc pkg-config {module args} { 106 set ok [pkg-config-init] 107 108 msg-checking "Checking for $module $args..." 109 110 if {!$ok} { 111 msg-result "no pkg-config" 112 return 0 113 } 114 115 set pkgconfig [get-define PKG_CONFIG] 116 117 set ret [catch {exec $pkgconfig --modversion "$module $args"} version] 118 configlog "$pkgconfig --modversion $module $args: $version" 119 if {$ret} { 120 msg-result "not found" 121 return 0 122 } 123 # Sometimes --modversion succeeds but because of dependencies it isn't usable 124 # This seems to show up with --cflags 125 set ret [catch {exec $pkgconfig --cflags $module} cflags] 126 if {$ret} { 127 msg-result "unusable ($version - see config.log)" 128 configlog "$pkgconfig --cflags $module" 129 configlog $cflags 130 return 0 131 } 132 msg-result $version 133 set prefix [feature-define-name $module PKG_] 134 define HAVE_${prefix} 135 define ${prefix}_VERSION $version 136 define ${prefix}_CFLAGS $cflags 137 define ${prefix}_LIBS [exec $pkgconfig --libs-only-l $module] 138 define ${prefix}_LDFLAGS [exec $pkgconfig --libs-only-L $module] 139 return 1 140} 141 142# @pkg-config-get module setting 143# 144# Convenience access to the results of 'pkg-config'. 145# 146# For example, '[pkg-config-get pango CFLAGS]' returns 147# the value of 'PKG_PANGO_CFLAGS', or '""' if not defined. 148proc pkg-config-get {module name} { 149 set prefix [feature-define-name $module PKG_] 150 get-define ${prefix}_${name} "" 151} 152 153# @pkg-config-get-var module variable 154# 155# Return the value of the given variable from the given pkg-config module. 156# The module must already have been successfully detected with pkg-config. 157# e.g. 158# 159## if {[pkg-config harfbuzz >= 2.5]} { 160## define harfbuzz_libdir [pkg-config-get-var harfbuzz libdir] 161## } 162# 163# Returns the empty string if the variable isn't defined. 164proc pkg-config-get-var {module variable} { 165 set pkgconfig [get-define PKG_CONFIG] 166 set prefix [feature-define-name $module HAVE_PKG_] 167 exec $pkgconfig $module --variable $variable 168} 169