SUMMARY = "Distribution build manifest"
DESCRIPTION = "The folder /etc/platform-info contains build manifest (SPEC-720)."
LICENSE = "MIT"

# information distributed by the package is machine specific
PACKAGE_ARCH = "${MACHINE_ARCH}"

# dependencies of ${DISTRO_MANIFEST_GENERATOR}
DEPENDS = "coreutils-native bash-native git-native gawk-native sed-native jq-native"

# force a rebuild everytime a build is started
do_compile[nostamp] = "1"

# borrowed to os-release.bb (output format is very close)
python do_compilestep1 () {
   import shutil
   with open(d.expand('${B}/bbinfo-deploy'),'w') as f:
      allkeys=[]
      for field in d.getVar('BUILD_MANIFEST_FIELDS_DEPLOY').split():
         key='DIST_BB_{0}'.format(field)
         allkeys.append(key)
         value=d.getVar(field)
         if value:
            f.write('{0}="{1}"\n'.format(key,value))
      f.write('declare -A BITBAKE_VARS\nBITBAKE_VARS[deploy]="%s"' % ' '.join(allkeys))

   with open(d.expand('${B}/bbinfo-target'),'w') as f:
      allkeys=[]
      for field in d.getVar('BUILD_MANIFEST_FIELDS_TARGET').split():
         key='DIST_BB_{0}'.format(field)
         allkeys.append(key)
         value=d.getVar(field)
         if value:
            f.write('{0}="{1}"\n'.format(key,value))
      f.write('declare -A BITBAKE_VARS\nBITBAKE_VARS[target]="%s"' % ' '.join(allkeys))

   with open(d.expand('${B}/bbinfo-sdk'),'w') as f:
      allkeys=[]
      for field in d.getVar('BUILD_MANIFEST_FIELDS_SDK').split():
         key='DIST_BB_{0}'.format(field)
         allkeys.append(key)
         value=d.getVar(field)
         if value:
            f.write('{0}="{1}"\n'.format(key,value))
      f.write('declare -A BITBAKE_VARS\nBITBAKE_VARS[sdk]="%s"' % ' '.join(allkeys))
}

do_compilestep2 () {
    rc=99
    timestamp=${DATETIME}
    outfile=${B}/build-info
    if [ -x "${DISTRO_MANIFEST_GENERATOR}" -a -f "${DISTRO_SETUP_MANIFEST}" ]; then
		rc=0
		for	format in bash json; do
			if [ "$format" = "json" ]; then
				ext=".json"
			else
				ext=""
			fi
			for mode in deploy target sdk; do
				${DISTRO_MANIFEST_GENERATOR} -m $mode -f $format -t $timestamp -s ${B}/bbinfo-${mode} ${DISTRO_SETUP_MANIFEST} >${outfile}-${mode}${ext}
				rc=$?
				if [ $rc -ne 0 ]; then
					break
				fi
			done
		done
    else
        if [ -z "${DISTRO_MANIFEST_GENERATOR}" ]; then
            echo "The name of the generation script is not defined."
        elif [ ! -f "${DISTRO_MANIFEST_GENERATOR}" ]; then
            echo "Generation script ${DISTRO_MANIFEST_GENERATOR} is missing."
        elif [ ! -x "${DISTRO_MANIFEST_GENERATOR}" ]; then
            echo "Generation script ${DISTRO_MANIFEST_GENERATOR} isn't executable."
        fi
        if [ -z "${DISTRO_SETUP_MANIFEST}" ]; then
            echo "The name of the data file is not defined."
        elif [ ! -f "${DISTRO_SETUP_MANIFEST}" ]; then
            echo "Data file ${DISTRO_SETUP_MANIFEST} is missing."
        fi
	echo "You can try to rerun aglsetup.sh to solve that issue."
	echo "You can also try to source agl-init-build-env instead of oe-init-build-env."
    fi

    if [ "$rc" -ne  0 ]; then
        echo "distro-build-manifest generation failed."
    fi
    return $rc
}

do_compilestep1[vardeps] += " ${BUILD_MANIFEST_FIELDS_DEPLOY}"
do_compilestep1[vardeps] += " ${BUILD_MANIFEST_FIELDS_TARGET}"
do_compilestep1[vardeps] += " ${BUILD_MANIFEST_FIELDS_SDK}"

# avoid errors "ERROR: When reparsing .../distro-build-manifest/distro-build-manifest.bb.do_compile, the basehash value changed from .... to .... . The metadata is not deterministic and this needs to be fixed."
do_compilestep2[vardepsexclude] = "DATETIME"

# combine the two steps
python do_compile() {
   bb.build.exec_func("do_compilestep1",d)
   bb.build.exec_func("do_compilestep2",d)
}

do_install () {
    # install in target dir
    install -d ${D}${sysconfdir}/platform-info
    install -m 0644 build-info-target ${D}${sysconfdir}/platform-info/build
    install -m 0644 build-info-target.json ${D}${sysconfdir}/platform-info/build.json

    # also copy in deploy dir
    install -d ${DEPLOY_DIR_IMAGE}
    install -m 0644 build-info-deploy ${DEPLOY_DIR_IMAGE}/build-info
    install -m 0644 build-info-deploy.json ${DEPLOY_DIR_IMAGE}/build-info.json

    # copy into sdk deploy dir
    install -d ${DEPLOY_DIR}/sdk
    install -m 0644 build-info-sdk ${DEPLOY_DIR}/sdk/${SDK_NAME}.build-info
    install -m 0644 build-info-sdk.json ${DEPLOY_DIR}/sdk/${SDK_NAME}.build-info.json

    # and copy to nativesdk package
    # TODO
}

# list of variables to add to the various manifests
# smalles one is 'target', then 'deploy' and finally 'sdk'
BUILD_MANIFEST_FIELDS_TARGET = "\
    MACHINE_ARCH \
    MACHINEOVERRIDES \
    MACHINE_FEATURES \
    DISTRO_CODENAME \
    DISTRO_FEATURES \
    DISTRO_BRANCH_VERSION_TAG \
    AGLVERSION \
    AGL_BRANCH \
    AGLRELEASETYPE \
"

BUILD_MANIFEST_FIELDS_DEPLOY = "\
    ${BUILD_MANIFEST_FIELDS_TARGET} \
    DISTRO \
    DISTRO_VERSION \
    DISTROOVERRIDES \
    TUNE_FEATURES \
    TUNE_PKGARCH \
    ALL_MULTILIB_PACKAGE_ARCHS \
"

BUILD_MANIFEST_FIELDS_SDK = "\
    ${BUILD_MANIFEST_FIELDS_DEPLOY} \
    HOST_SYS \
    TARGET_SYS \
    TARGET_VENDOR \
    SDK_ARCH \
    SDK_VENDOR \
    SDK_VERSION \
    SDK_OS \
"

# dont exec useless tasks
do_fetch[noexec] = "1"
do_unpack[noexec] = "1"
do_patch[noexec] = "1"
do_configure[noexec] = "1"