xref: /OK3568_Linux_fs/yocto/meta-openembedded/meta-networking/classes/waf-samba.bbclass (revision 4882a59341e53eb6f0b4789bf948001014eff981)
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