1*4882a593Smuzhiyuninherit goarch 2*4882a593Smuzhiyun 3*4882a593SmuzhiyunGO_PARALLEL_BUILD ?= "${@oe.utils.parallel_make_argument(d, '-p %d')}" 4*4882a593Smuzhiyun 5*4882a593Smuzhiyunexport GODEBUG = "gocachehash=1" 6*4882a593Smuzhiyun 7*4882a593SmuzhiyunGOROOT:class-native = "${STAGING_LIBDIR_NATIVE}/go" 8*4882a593SmuzhiyunGOROOT:class-nativesdk = "${STAGING_DIR_TARGET}${libdir}/go" 9*4882a593SmuzhiyunGOROOT = "${STAGING_LIBDIR}/go" 10*4882a593Smuzhiyunexport GOROOT 11*4882a593Smuzhiyunexport GOROOT_FINAL = "${libdir}/go" 12*4882a593Smuzhiyunexport GOCACHE = "${B}/.cache" 13*4882a593Smuzhiyun 14*4882a593Smuzhiyunexport GOARCH = "${TARGET_GOARCH}" 15*4882a593Smuzhiyunexport GOOS = "${TARGET_GOOS}" 16*4882a593Smuzhiyunexport GOHOSTARCH="${BUILD_GOARCH}" 17*4882a593Smuzhiyunexport GOHOSTOS="${BUILD_GOOS}" 18*4882a593Smuzhiyun 19*4882a593SmuzhiyunGOARM[export] = "0" 20*4882a593SmuzhiyunGOARM:arm:class-target = "${TARGET_GOARM}" 21*4882a593SmuzhiyunGOARM:arm:class-target[export] = "1" 22*4882a593Smuzhiyun 23*4882a593SmuzhiyunGO386[export] = "0" 24*4882a593SmuzhiyunGO386:x86:class-target = "${TARGET_GO386}" 25*4882a593SmuzhiyunGO386:x86:class-target[export] = "1" 26*4882a593Smuzhiyun 27*4882a593SmuzhiyunGOMIPS[export] = "0" 28*4882a593SmuzhiyunGOMIPS:mips:class-target = "${TARGET_GOMIPS}" 29*4882a593SmuzhiyunGOMIPS:mips:class-target[export] = "1" 30*4882a593Smuzhiyun 31*4882a593SmuzhiyunDEPENDS_GOLANG:class-target = "virtual/${TUNE_PKGARCH}-go virtual/${TARGET_PREFIX}go-runtime" 32*4882a593SmuzhiyunDEPENDS_GOLANG:class-native = "go-native" 33*4882a593SmuzhiyunDEPENDS_GOLANG:class-nativesdk = "virtual/${TARGET_PREFIX}go-crosssdk virtual/${TARGET_PREFIX}go-runtime" 34*4882a593Smuzhiyun 35*4882a593SmuzhiyunDEPENDS:append = " ${DEPENDS_GOLANG}" 36*4882a593Smuzhiyun 37*4882a593SmuzhiyunGO_LINKSHARED ?= "${@'-linkshared' if d.getVar('GO_DYNLINK') else ''}" 38*4882a593SmuzhiyunGO_RPATH_LINK = "${@'-Wl,-rpath-link=${STAGING_DIR_TARGET}${libdir}/go/pkg/${TARGET_GOTUPLE}_dynlink' if d.getVar('GO_DYNLINK') else ''}" 39*4882a593SmuzhiyunGO_RPATH = "${@'-r ${libdir}/go/pkg/${TARGET_GOTUPLE}_dynlink' if d.getVar('GO_DYNLINK') else ''}" 40*4882a593SmuzhiyunGO_RPATH:class-native = "${@'-r ${STAGING_LIBDIR_NATIVE}/go/pkg/${TARGET_GOTUPLE}_dynlink' if d.getVar('GO_DYNLINK') else ''}" 41*4882a593SmuzhiyunGO_RPATH_LINK:class-native = "${@'-Wl,-rpath-link=${STAGING_LIBDIR_NATIVE}/go/pkg/${TARGET_GOTUPLE}_dynlink' if d.getVar('GO_DYNLINK') else ''}" 42*4882a593SmuzhiyunGO_EXTLDFLAGS ?= "${HOST_CC_ARCH}${TOOLCHAIN_OPTIONS} ${GO_RPATH_LINK} ${LDFLAGS}" 43*4882a593SmuzhiyunGO_LINKMODE ?= "" 44*4882a593SmuzhiyunGO_LINKMODE:class-nativesdk = "--linkmode=external" 45*4882a593SmuzhiyunGO_LINKMODE:class-native = "--linkmode=external" 46*4882a593SmuzhiyunGO_EXTRA_LDFLAGS ?= "" 47*4882a593SmuzhiyunGO_LDFLAGS ?= '-ldflags="${GO_RPATH} ${GO_LINKMODE} ${GO_EXTRA_LDFLAGS} -extldflags '${GO_EXTLDFLAGS}'"' 48*4882a593Smuzhiyunexport GOBUILDFLAGS ?= "-v ${GO_LDFLAGS} -trimpath" 49*4882a593Smuzhiyunexport GOPATH_OMIT_IN_ACTIONID ?= "1" 50*4882a593Smuzhiyunexport GOPTESTBUILDFLAGS ?= "${GOBUILDFLAGS} -c" 51*4882a593Smuzhiyunexport GOPTESTFLAGS ?= "" 52*4882a593SmuzhiyunGOBUILDFLAGS:prepend:task-compile = "${GO_PARALLEL_BUILD} " 53*4882a593Smuzhiyun 54*4882a593Smuzhiyunexport GO = "${HOST_PREFIX}go" 55*4882a593SmuzhiyunGOTOOLDIR = "${STAGING_LIBDIR_NATIVE}/${TARGET_SYS}/go/pkg/tool/${BUILD_GOTUPLE}" 56*4882a593SmuzhiyunGOTOOLDIR:class-native = "${STAGING_LIBDIR_NATIVE}/go/pkg/tool/${BUILD_GOTUPLE}" 57*4882a593Smuzhiyunexport GOTOOLDIR 58*4882a593Smuzhiyun 59*4882a593Smuzhiyunexport CGO_ENABLED ?= "1" 60*4882a593Smuzhiyunexport CGO_CFLAGS ?= "${CFLAGS}" 61*4882a593Smuzhiyunexport CGO_CPPFLAGS ?= "${CPPFLAGS}" 62*4882a593Smuzhiyunexport CGO_CXXFLAGS ?= "${CXXFLAGS}" 63*4882a593Smuzhiyunexport CGO_LDFLAGS ?= "${LDFLAGS}" 64*4882a593Smuzhiyun 65*4882a593SmuzhiyunGO_INSTALL ?= "${GO_IMPORT}/..." 66*4882a593SmuzhiyunGO_INSTALL_FILTEROUT ?= "${GO_IMPORT}/vendor/" 67*4882a593Smuzhiyun 68*4882a593SmuzhiyunB = "${WORKDIR}/build" 69*4882a593Smuzhiyunexport GOPATH = "${B}" 70*4882a593Smuzhiyunexport GOENV = "off" 71*4882a593Smuzhiyunexport GOTMPDIR ?= "${WORKDIR}/build-tmp" 72*4882a593SmuzhiyunGOTMPDIR[vardepvalue] = "" 73*4882a593Smuzhiyun 74*4882a593Smuzhiyunpython go_do_unpack() { 75*4882a593Smuzhiyun src_uri = (d.getVar('SRC_URI') or "").split() 76*4882a593Smuzhiyun if len(src_uri) == 0: 77*4882a593Smuzhiyun return 78*4882a593Smuzhiyun 79*4882a593Smuzhiyun fetcher = bb.fetch2.Fetch(src_uri, d) 80*4882a593Smuzhiyun for url in fetcher.urls: 81*4882a593Smuzhiyun if fetcher.ud[url].type == 'git': 82*4882a593Smuzhiyun if fetcher.ud[url].parm.get('destsuffix') is None: 83*4882a593Smuzhiyun s_dirname = os.path.basename(d.getVar('S')) 84*4882a593Smuzhiyun fetcher.ud[url].parm['destsuffix'] = os.path.join(s_dirname, 'src', d.getVar('GO_IMPORT')) + '/' 85*4882a593Smuzhiyun fetcher.unpack(d.getVar('WORKDIR')) 86*4882a593Smuzhiyun} 87*4882a593Smuzhiyun 88*4882a593Smuzhiyungo_list_packages() { 89*4882a593Smuzhiyun ${GO} list -f '{{.ImportPath}}' ${GOBUILDFLAGS} ${GO_INSTALL} | \ 90*4882a593Smuzhiyun egrep -v '${GO_INSTALL_FILTEROUT}' 91*4882a593Smuzhiyun} 92*4882a593Smuzhiyun 93*4882a593Smuzhiyungo_list_package_tests() { 94*4882a593Smuzhiyun ${GO} list -f '{{.ImportPath}} {{.TestGoFiles}}' ${GOBUILDFLAGS} ${GO_INSTALL} | \ 95*4882a593Smuzhiyun grep -v '\[\]$' | \ 96*4882a593Smuzhiyun egrep -v '${GO_INSTALL_FILTEROUT}' | \ 97*4882a593Smuzhiyun awk '{ print $1 }' 98*4882a593Smuzhiyun} 99*4882a593Smuzhiyun 100*4882a593Smuzhiyungo_do_configure() { 101*4882a593Smuzhiyun ln -snf ${S}/src ${B}/ 102*4882a593Smuzhiyun} 103*4882a593Smuzhiyundo_configure[dirs] =+ "${GOTMPDIR}" 104*4882a593Smuzhiyun 105*4882a593Smuzhiyungo_do_compile() { 106*4882a593Smuzhiyun export TMPDIR="${GOTMPDIR}" 107*4882a593Smuzhiyun if [ -n "${GO_INSTALL}" ]; then 108*4882a593Smuzhiyun if [ -n "${GO_LINKSHARED}" ]; then 109*4882a593Smuzhiyun ${GO} install ${GOBUILDFLAGS} `go_list_packages` 110*4882a593Smuzhiyun rm -rf ${B}/bin 111*4882a593Smuzhiyun fi 112*4882a593Smuzhiyun ${GO} install ${GO_LINKSHARED} ${GOBUILDFLAGS} `go_list_packages` 113*4882a593Smuzhiyun fi 114*4882a593Smuzhiyun} 115*4882a593Smuzhiyundo_compile[dirs] =+ "${GOTMPDIR}" 116*4882a593Smuzhiyundo_compile[cleandirs] = "${B}/bin ${B}/pkg" 117*4882a593Smuzhiyun 118*4882a593Smuzhiyungo_do_install() { 119*4882a593Smuzhiyun install -d ${D}${libdir}/go/src/${GO_IMPORT} 120*4882a593Smuzhiyun tar -C ${S}/src/${GO_IMPORT} -cf - --exclude-vcs --exclude '*.test' --exclude 'testdata' . | \ 121*4882a593Smuzhiyun tar -C ${D}${libdir}/go/src/${GO_IMPORT} --no-same-owner -xf - 122*4882a593Smuzhiyun tar -C ${B} -cf - --exclude-vcs --exclude '*.test' --exclude 'testdata' pkg | \ 123*4882a593Smuzhiyun tar -C ${D}${libdir}/go --no-same-owner -xf - 124*4882a593Smuzhiyun 125*4882a593Smuzhiyun if [ -n "`ls ${B}/${GO_BUILD_BINDIR}/`" ]; then 126*4882a593Smuzhiyun install -d ${D}${bindir} 127*4882a593Smuzhiyun install -m 0755 ${B}/${GO_BUILD_BINDIR}/* ${D}${bindir}/ 128*4882a593Smuzhiyun fi 129*4882a593Smuzhiyun} 130*4882a593Smuzhiyun 131*4882a593Smuzhiyungo_stage_testdata() { 132*4882a593Smuzhiyun oldwd="$PWD" 133*4882a593Smuzhiyun cd ${S}/src 134*4882a593Smuzhiyun find ${GO_IMPORT} -depth -type d -name testdata | while read d; do 135*4882a593Smuzhiyun if echo "$d" | grep -q '/vendor/'; then 136*4882a593Smuzhiyun continue 137*4882a593Smuzhiyun fi 138*4882a593Smuzhiyun parent=`dirname $d` 139*4882a593Smuzhiyun install -d ${D}${PTEST_PATH}/$parent 140*4882a593Smuzhiyun cp --preserve=mode,timestamps -R $d ${D}${PTEST_PATH}/$parent/ 141*4882a593Smuzhiyun done 142*4882a593Smuzhiyun cd "$oldwd" 143*4882a593Smuzhiyun} 144*4882a593Smuzhiyun 145*4882a593SmuzhiyunEXPORT_FUNCTIONS do_unpack do_configure do_compile do_install 146*4882a593Smuzhiyun 147*4882a593SmuzhiyunFILES:${PN}-dev = "${libdir}/go/src" 148*4882a593SmuzhiyunFILES:${PN}-staticdev = "${libdir}/go/pkg" 149*4882a593Smuzhiyun 150*4882a593SmuzhiyunINSANE_SKIP:${PN} += "ldflags" 151*4882a593Smuzhiyun 152*4882a593Smuzhiyun# Add -buildmode=pie to GOBUILDFLAGS to satisfy "textrel" QA checking, but mips 153*4882a593Smuzhiyun# doesn't support -buildmode=pie, so skip the QA checking for mips/rv32 and its 154*4882a593Smuzhiyun# variants. 155*4882a593Smuzhiyunpython() { 156*4882a593Smuzhiyun if 'mips' in d.getVar('TARGET_ARCH') or 'riscv32' in d.getVar('TARGET_ARCH'): 157*4882a593Smuzhiyun d.appendVar('INSANE_SKIP:%s' % d.getVar('PN'), " textrel") 158*4882a593Smuzhiyun else: 159*4882a593Smuzhiyun d.appendVar('GOBUILDFLAGS', ' -buildmode=pie') 160*4882a593Smuzhiyun} 161