1*4882a593Smuzhiyun# waf is a build system which is used by samba related project. 2*4882a593Smuzhiyun# Obtain details from https://wiki.samba.org/index.php/Waf 3*4882a593Smuzhiyun# 4*4882a593Smuzhiyuninherit qemu python3native 5*4882a593Smuzhiyun 6*4882a593SmuzhiyunDEPENDS += "qemu-native libxslt-native docbook-xsl-stylesheets-native python3" 7*4882a593Smuzhiyun 8*4882a593SmuzhiyunCONFIGUREOPTS = " --prefix=${prefix} \ 9*4882a593Smuzhiyun --bindir=${bindir} \ 10*4882a593Smuzhiyun --sbindir=${sbindir} \ 11*4882a593Smuzhiyun --libexecdir=${libexecdir} \ 12*4882a593Smuzhiyun --datadir=${datadir} \ 13*4882a593Smuzhiyun --sysconfdir=${sysconfdir} \ 14*4882a593Smuzhiyun --sharedstatedir=${sharedstatedir} \ 15*4882a593Smuzhiyun --localstatedir=${localstatedir} \ 16*4882a593Smuzhiyun --libdir=${libdir} \ 17*4882a593Smuzhiyun --includedir=${includedir} \ 18*4882a593Smuzhiyun --oldincludedir=${oldincludedir} \ 19*4882a593Smuzhiyun --infodir=${infodir} \ 20*4882a593Smuzhiyun --mandir=${mandir} \ 21*4882a593Smuzhiyun ${PACKAGECONFIG_CONFARGS} \ 22*4882a593Smuzhiyun " 23*4882a593Smuzhiyun 24*4882a593Smuzhiyun# avoids build breaks when using no-static-libs.inc 25*4882a593SmuzhiyunDISABLE_STATIC = "" 26*4882a593Smuzhiyun 27*4882a593Smuzhiyundef get_waf_parallel_make(d): 28*4882a593Smuzhiyun pm = d.getVar('PARALLEL_MAKE') 29*4882a593Smuzhiyun if pm: 30*4882a593Smuzhiyun # look for '-j' and throw other options (e.g. '-l') away 31*4882a593Smuzhiyun # because they might have different meaning in bjam 32*4882a593Smuzhiyun pm = pm.split() 33*4882a593Smuzhiyun while pm: 34*4882a593Smuzhiyun opt = pm.pop(0) 35*4882a593Smuzhiyun if opt == '-j': 36*4882a593Smuzhiyun v = pm.pop(0) 37*4882a593Smuzhiyun elif opt.startswith('-j'): 38*4882a593Smuzhiyun v = opt[2:].strip() 39*4882a593Smuzhiyun else: 40*4882a593Smuzhiyun continue 41*4882a593Smuzhiyun 42*4882a593Smuzhiyun v = min(64, int(v)) 43*4882a593Smuzhiyun return '-j' + str(v) 44*4882a593Smuzhiyun 45*4882a593Smuzhiyun return "" 46*4882a593Smuzhiyun 47*4882a593Smuzhiyun# Three methods for waf cross compile: 48*4882a593Smuzhiyun# 1. answers: 49*4882a593Smuzhiyun# Only --cross-answers - try the cross-answers file, and if 50*4882a593Smuzhiyun# there's no corresponding answer, add to the file and mark 51*4882a593Smuzhiyun# the configure process as unfinished. 52*4882a593Smuzhiyun# 2. exec: 53*4882a593Smuzhiyun# Only --cross-execute - get the answer from cross-execute, 54*4882a593Smuzhiyun# an emulator (qemu) is used to run cross-compiled binaries. 55*4882a593Smuzhiyun# 3. both: 56*4882a593Smuzhiyun# (notes: not supported in lower version of some packages, 57*4882a593Smuzhiyun# please check buildtools/wafsamba/samba_cross.py in the 58*4882a593Smuzhiyun# package source) 59*4882a593Smuzhiyun# Try the cross-answers file first, and if there is no 60*4882a593Smuzhiyun# corresponding answer, use cross-execute to get an answer, 61*4882a593Smuzhiyun# and add that answer to the file. 62*4882a593Smuzhiyun# 63*4882a593Smuzhiyun# The first one is preferred since it may fail with 2 or 3 if 64*4882a593Smuzhiyun# the target board is not suported by qemu, but we can use 2 or 3 65*4882a593Smuzhiyun# to help generate the cross answer when adding new board support. 66*4882a593SmuzhiyunCROSS_METHOD ?= "answer" 67*4882a593Smuzhiyun 68*4882a593Smuzhiyundo_configure() { 69*4882a593Smuzhiyun 70*4882a593Smuzhiyun # Prepare the cross-answers file 71*4882a593Smuzhiyun WAF_CROSS_ANSWERS_PATH="${THISDIR}/../../files/waf-cross-answers" 72*4882a593Smuzhiyun CROSS_ANSWERS="${B}/cross-answers-${TARGET_ARCH}.txt" 73*4882a593Smuzhiyun if [ -e ${CROSS_ANSWERS} ]; then 74*4882a593Smuzhiyun rm -f ${CROSS_ANSWERS} 75*4882a593Smuzhiyun fi 76*4882a593Smuzhiyun echo 'Checking uname machine type: "${TARGET_ARCH}"' >> ${CROSS_ANSWERS} 77*4882a593Smuzhiyun echo 'Checking uname release type: "${OLDEST_KERNEL}"' >> ${CROSS_ANSWERS} 78*4882a593Smuzhiyun cat ${WAF_CROSS_ANSWERS_PATH}/cross-answers-${TARGET_ARCH}.txt >> ${CROSS_ANSWERS} 79*4882a593Smuzhiyun 80*4882a593Smuzhiyun qemu_binary="${@qemu_target_binary(d)}" 81*4882a593Smuzhiyun if [ "${qemu_binary}" = "qemu-allarch" ]; then 82*4882a593Smuzhiyun qemu_binary="qemuwrapper" 83*4882a593Smuzhiyun fi 84*4882a593Smuzhiyun 85*4882a593Smuzhiyun libdir_qemu="${STAGING_DIR_HOST}/${libdir}" 86*4882a593Smuzhiyun base_libdir_qemu="${STAGING_DIR_HOST}/${base_libdir}" 87*4882a593Smuzhiyun 88*4882a593Smuzhiyun CROSS_EXEC="${qemu_binary} \ 89*4882a593Smuzhiyun ${QEMU_OPTIONS} \ 90*4882a593Smuzhiyun -L ${STAGING_DIR_HOST} \ 91*4882a593Smuzhiyun -E LD_LIBRARY_PATH=${libdir_qemu}:${base_libdir_qemu}" 92*4882a593Smuzhiyun 93*4882a593Smuzhiyun export BUILD_ARCH=${BUILD_ARCH} 94*4882a593Smuzhiyun export HOST_ARCH=${HOST_ARCH} 95*4882a593Smuzhiyun export STAGING_LIBDIR=${STAGING_LIBDIR} 96*4882a593Smuzhiyun export STAGING_INCDIR=${STAGING_INCDIR} 97*4882a593Smuzhiyun export PYTHONPATH=${STAGING_DIR_HOST}${PYTHON_SITEPACKAGES_DIR} 98*4882a593Smuzhiyun 99*4882a593Smuzhiyun CONFIG_CMD="./configure ${CONFIGUREOPTS} ${EXTRA_OECONF} --cross-compile" 100*4882a593Smuzhiyun if [ "${CROSS_METHOD}" = "answer" ]; then 101*4882a593Smuzhiyun ${CONFIG_CMD} --cross-answers="${CROSS_ANSWERS}" 102*4882a593Smuzhiyun elif [ "${CROSS_METHOD}" = "exec" ]; then 103*4882a593Smuzhiyun ${CONFIG_CMD} --cross-exec="${CROSS_EXEC}" 104*4882a593Smuzhiyun elif [ "${CROSS_METHOD}" = "both" ]; then 105*4882a593Smuzhiyun ${CONFIG_CMD} --cross-answers="${CROSS_ANSWERS}" --cross-exec="${CROSS_EXEC}" 106*4882a593Smuzhiyun else 107*4882a593Smuzhiyun echo "ERROR: ${CROSS_METHOD} is not valid for cross-compile!" 108*4882a593Smuzhiyun exit 1 109*4882a593Smuzhiyun fi 110*4882a593Smuzhiyun} 111*4882a593Smuzhiyun 112*4882a593Smuzhiyundo_compile[progress] = "outof:^\[\s*(\d+)/\s*(\d+)\]\s+" 113*4882a593Smuzhiyundo_compile () { 114*4882a593Smuzhiyun python3 ./buildtools/bin/waf ${@oe.utils.parallel_make_argument(d, '-j%d', limit=64)} 115*4882a593Smuzhiyun} 116*4882a593Smuzhiyun 117*4882a593Smuzhiyundo_install() { 118*4882a593Smuzhiyun oe_runmake install DESTDIR=${D} 119*4882a593Smuzhiyun} 120