| Brad Bishop | 1a4b7ee | 2018-12-16 17:11:34 -0800 | [diff] [blame] | 1 | inherit siteinfo python3native | 
| Brad Bishop | 316dfdd | 2018-06-25 12:45:53 -0400 | [diff] [blame] | 2 |  | 
|  | 3 | DEPENDS_append = " meson-native ninja-native" | 
|  | 4 |  | 
|  | 5 | # As Meson enforces out-of-tree builds we can just use cleandirs | 
|  | 6 | B = "${WORKDIR}/build" | 
|  | 7 | do_configure[cleandirs] = "${B}" | 
|  | 8 |  | 
|  | 9 | # Where the meson.build build configuration is | 
|  | 10 | MESON_SOURCEPATH = "${S}" | 
|  | 11 |  | 
|  | 12 | def noprefix(var, d): | 
|  | 13 | return d.getVar(var).replace(d.getVar('prefix') + '/', '', 1) | 
|  | 14 |  | 
|  | 15 | MESONOPTS = " --prefix ${prefix} \ | 
|  | 16 | --buildtype plain \ | 
|  | 17 | --bindir ${@noprefix('bindir', d)} \ | 
|  | 18 | --sbindir ${@noprefix('sbindir', d)} \ | 
|  | 19 | --datadir ${@noprefix('datadir', d)} \ | 
|  | 20 | --libdir ${@noprefix('libdir', d)} \ | 
|  | 21 | --libexecdir ${@noprefix('libexecdir', d)} \ | 
|  | 22 | --includedir ${@noprefix('includedir', d)} \ | 
|  | 23 | --mandir ${@noprefix('mandir', d)} \ | 
|  | 24 | --infodir ${@noprefix('infodir', d)} \ | 
|  | 25 | --sysconfdir ${sysconfdir} \ | 
|  | 26 | --localstatedir ${localstatedir} \ | 
| Brad Bishop | 1a4b7ee | 2018-12-16 17:11:34 -0800 | [diff] [blame] | 27 | --sharedstatedir ${sharedstatedir} \ | 
|  | 28 | -Dc_args='${BUILD_CPPFLAGS} ${BUILD_CFLAGS}' \ | 
|  | 29 | -Dc_link_args='${BUILD_LDFLAGS}' \ | 
|  | 30 | -Dcpp_args='${BUILD_CPPFLAGS} ${BUILD_CXXFLAGS}' \ | 
|  | 31 | -Dcpp_link_args='${BUILD_LDFLAGS}'" | 
| Brad Bishop | 316dfdd | 2018-06-25 12:45:53 -0400 | [diff] [blame] | 32 |  | 
| Brad Bishop | 1a4b7ee | 2018-12-16 17:11:34 -0800 | [diff] [blame] | 33 | EXTRA_OEMESON_append = " ${PACKAGECONFIG_CONFARGS}" | 
| Brad Bishop | 316dfdd | 2018-06-25 12:45:53 -0400 | [diff] [blame] | 34 |  | 
|  | 35 | MESON_CROSS_FILE = "" | 
|  | 36 | MESON_CROSS_FILE_class-target = "--cross-file ${WORKDIR}/meson.cross" | 
|  | 37 | MESON_CROSS_FILE_class-nativesdk = "--cross-file ${WORKDIR}/meson.cross" | 
|  | 38 |  | 
|  | 39 | def meson_array(var, d): | 
| Brad Bishop | 1a4b7ee | 2018-12-16 17:11:34 -0800 | [diff] [blame] | 40 | items = d.getVar(var).split() | 
|  | 41 | return repr(items[0] if len(items) == 1 else items) | 
|  | 42 |  | 
|  | 43 | # Map our ARCH values to what Meson expects: | 
|  | 44 | # http://mesonbuild.com/Reference-tables.html#cpu-families | 
|  | 45 | def meson_cpu_family(var, d): | 
|  | 46 | import re | 
|  | 47 | arch = d.getVar(var) | 
|  | 48 | if arch == 'powerpc': | 
|  | 49 | return 'ppc' | 
|  | 50 | elif arch == 'powerpc64': | 
|  | 51 | return 'ppc64' | 
| Brad Bishop | 1932369 | 2019-04-05 15:28:33 -0400 | [diff] [blame] | 52 | elif arch == 'armeb': | 
|  | 53 | return 'arm' | 
| Brad Bishop | 15ae250 | 2019-06-18 21:44:24 -0400 | [diff] [blame] | 54 | elif arch == 'aarch64_be': | 
|  | 55 | return 'aarch64' | 
| Brad Bishop | 1a4b7ee | 2018-12-16 17:11:34 -0800 | [diff] [blame] | 56 | elif arch == 'mipsel': | 
|  | 57 | return 'mips' | 
| Brad Bishop | 1932369 | 2019-04-05 15:28:33 -0400 | [diff] [blame] | 58 | elif arch == 'mips64el': | 
|  | 59 | return 'mips64' | 
| Brad Bishop | 1a4b7ee | 2018-12-16 17:11:34 -0800 | [diff] [blame] | 60 | elif re.match(r"i[3-6]86", arch): | 
|  | 61 | return "x86" | 
|  | 62 | else: | 
|  | 63 | return arch | 
|  | 64 |  | 
|  | 65 | def meson_endian(prefix, d): | 
|  | 66 | arch, os = d.getVar(prefix + "_ARCH"), d.getVar(prefix + "_OS") | 
|  | 67 | sitedata = siteinfo_data_for_machine(arch, os, d) | 
|  | 68 | if "endian-little" in sitedata: | 
|  | 69 | return "little" | 
|  | 70 | elif "endian-big" in sitedata: | 
|  | 71 | return "big" | 
|  | 72 | else: | 
|  | 73 | bb.fatal("Cannot determine endianism for %s-%s" % (arch, os)) | 
| Brad Bishop | 316dfdd | 2018-06-25 12:45:53 -0400 | [diff] [blame] | 74 |  | 
|  | 75 | addtask write_config before do_configure | 
| Brad Bishop | 96ff198 | 2019-08-19 13:50:42 -0400 | [diff] [blame] | 76 | do_write_config[vardeps] += "CC CXX LD AR NM STRIP READELF CFLAGS CXXFLAGS LDFLAGS" | 
| Brad Bishop | 316dfdd | 2018-06-25 12:45:53 -0400 | [diff] [blame] | 77 | do_write_config() { | 
|  | 78 | # This needs to be Py to split the args into single-element lists | 
|  | 79 | cat >${WORKDIR}/meson.cross <<EOF | 
|  | 80 | [binaries] | 
| Brad Bishop | 1a4b7ee | 2018-12-16 17:11:34 -0800 | [diff] [blame] | 81 | c = ${@meson_array('CC', d)} | 
|  | 82 | cpp = ${@meson_array('CXX', d)} | 
|  | 83 | ar = ${@meson_array('AR', d)} | 
|  | 84 | nm = ${@meson_array('NM', d)} | 
|  | 85 | ld = ${@meson_array('LD', d)} | 
|  | 86 | strip = ${@meson_array('STRIP', d)} | 
|  | 87 | readelf = ${@meson_array('READELF', d)} | 
| Brad Bishop | 316dfdd | 2018-06-25 12:45:53 -0400 | [diff] [blame] | 88 | pkgconfig = 'pkg-config' | 
| Brad Bishop | 1932369 | 2019-04-05 15:28:33 -0400 | [diff] [blame] | 89 | llvm-config = 'llvm-config8.0.0' | 
| Brad Bishop | 316dfdd | 2018-06-25 12:45:53 -0400 | [diff] [blame] | 90 |  | 
|  | 91 | [properties] | 
|  | 92 | needs_exe_wrapper = true | 
| Brad Bishop | 96ff198 | 2019-08-19 13:50:42 -0400 | [diff] [blame] | 93 | c_args = ${@meson_array('CFLAGS', d)} | 
|  | 94 | c_link_args = ${@meson_array('LDFLAGS', d)} | 
|  | 95 | cpp_args = ${@meson_array('CXXFLAGS', d)} | 
|  | 96 | cpp_link_args = ${@meson_array('LDFLAGS', d)} | 
| Brad Bishop | 316dfdd | 2018-06-25 12:45:53 -0400 | [diff] [blame] | 97 | gtkdoc_exe_wrapper = '${B}/gtkdoc-qemuwrapper' | 
|  | 98 |  | 
|  | 99 | [host_machine] | 
|  | 100 | system = '${HOST_OS}' | 
| Brad Bishop | 1a4b7ee | 2018-12-16 17:11:34 -0800 | [diff] [blame] | 101 | cpu_family = '${@meson_cpu_family('HOST_ARCH', d)}' | 
| Brad Bishop | 316dfdd | 2018-06-25 12:45:53 -0400 | [diff] [blame] | 102 | cpu = '${HOST_ARCH}' | 
| Brad Bishop | 1a4b7ee | 2018-12-16 17:11:34 -0800 | [diff] [blame] | 103 | endian = '${@meson_endian('HOST', d)}' | 
| Brad Bishop | 316dfdd | 2018-06-25 12:45:53 -0400 | [diff] [blame] | 104 |  | 
|  | 105 | [target_machine] | 
|  | 106 | system = '${TARGET_OS}' | 
| Brad Bishop | 1a4b7ee | 2018-12-16 17:11:34 -0800 | [diff] [blame] | 107 | cpu_family = '${@meson_cpu_family('TARGET_ARCH', d)}' | 
| Brad Bishop | 316dfdd | 2018-06-25 12:45:53 -0400 | [diff] [blame] | 108 | cpu = '${TARGET_ARCH}' | 
| Brad Bishop | 1a4b7ee | 2018-12-16 17:11:34 -0800 | [diff] [blame] | 109 | endian = '${@meson_endian('TARGET', d)}' | 
| Brad Bishop | 316dfdd | 2018-06-25 12:45:53 -0400 | [diff] [blame] | 110 | EOF | 
|  | 111 | } | 
|  | 112 |  | 
|  | 113 | CONFIGURE_FILES = "meson.build" | 
|  | 114 |  | 
|  | 115 | meson_do_configure() { | 
| Brad Bishop | 1a4b7ee | 2018-12-16 17:11:34 -0800 | [diff] [blame] | 116 | # Work around "Meson fails if /tmp is mounted with noexec #2972" | 
|  | 117 | mkdir -p "${B}/meson-private/tmp" | 
|  | 118 | export TMPDIR="${B}/meson-private/tmp" | 
|  | 119 | bbnote Executing meson ${EXTRA_OEMESON}... | 
| Brad Bishop | 316dfdd | 2018-06-25 12:45:53 -0400 | [diff] [blame] | 120 | if ! meson ${MESONOPTS} "${MESON_SOURCEPATH}" "${B}" ${MESON_CROSS_FILE} ${EXTRA_OEMESON}; then | 
| Brad Bishop | 316dfdd | 2018-06-25 12:45:53 -0400 | [diff] [blame] | 121 | bbfatal_log meson failed | 
|  | 122 | fi | 
|  | 123 | } | 
|  | 124 |  | 
| Brad Bishop | 1a4b7ee | 2018-12-16 17:11:34 -0800 | [diff] [blame] | 125 | override_native_tools() { | 
| Brad Bishop | 316dfdd | 2018-06-25 12:45:53 -0400 | [diff] [blame] | 126 | # Set these so that meson uses the native tools for its build sanity tests, | 
|  | 127 | # which require executables to be runnable. The cross file will still | 
| Brad Bishop | 1a4b7ee | 2018-12-16 17:11:34 -0800 | [diff] [blame] | 128 | # override these for the target build. | 
| Brad Bishop | 316dfdd | 2018-06-25 12:45:53 -0400 | [diff] [blame] | 129 | export CC="${BUILD_CC}" | 
|  | 130 | export CXX="${BUILD_CXX}" | 
|  | 131 | export LD="${BUILD_LD}" | 
|  | 132 | export AR="${BUILD_AR}" | 
| Brad Bishop | 96ff198 | 2019-08-19 13:50:42 -0400 | [diff] [blame] | 133 | export STRIP="${BUILD_STRIP}" | 
| Brad Bishop | 1a4b7ee | 2018-12-16 17:11:34 -0800 | [diff] [blame] | 134 | # These contain *target* flags but will be used as *native* flags.  The | 
|  | 135 | # correct native flags will be passed via -Dc_args and so on, unset them so | 
|  | 136 | # they don't interfere with tools invoked by Meson (such as g-ir-scanner) | 
|  | 137 | unset CPPFLAGS CFLAGS CXXFLAGS LDFLAGS | 
|  | 138 | } | 
|  | 139 |  | 
|  | 140 | meson_do_configure_prepend_class-target() { | 
|  | 141 | override_native_tools | 
| Brad Bishop | 316dfdd | 2018-06-25 12:45:53 -0400 | [diff] [blame] | 142 | } | 
|  | 143 |  | 
|  | 144 | meson_do_configure_prepend_class-nativesdk() { | 
| Brad Bishop | 1a4b7ee | 2018-12-16 17:11:34 -0800 | [diff] [blame] | 145 | override_native_tools | 
| Brad Bishop | 316dfdd | 2018-06-25 12:45:53 -0400 | [diff] [blame] | 146 | } | 
|  | 147 |  | 
|  | 148 | meson_do_configure_prepend_class-native() { | 
|  | 149 | export PKG_CONFIG="pkg-config-native" | 
|  | 150 | } | 
|  | 151 |  | 
|  | 152 | do_compile[progress] = "outof:^\[(\d+)/(\d+)\]\s+" | 
|  | 153 | meson_do_compile() { | 
| Brad Bishop | 1a4b7ee | 2018-12-16 17:11:34 -0800 | [diff] [blame] | 154 | ninja -v ${PARALLEL_MAKE} | 
| Brad Bishop | 316dfdd | 2018-06-25 12:45:53 -0400 | [diff] [blame] | 155 | } | 
|  | 156 |  | 
|  | 157 | meson_do_install() { | 
| Brad Bishop | 1a4b7ee | 2018-12-16 17:11:34 -0800 | [diff] [blame] | 158 | DESTDIR='${D}' ninja -v ${PARALLEL_MAKEINST} install | 
| Brad Bishop | 316dfdd | 2018-06-25 12:45:53 -0400 | [diff] [blame] | 159 | } | 
|  | 160 |  | 
|  | 161 | EXPORT_FUNCTIONS do_configure do_compile do_install |