#
# Populated ${STAGING} using packages
#
# To use it add that line to conf/local.conf:
#
# INHERIT += "packaged-staging"
#
# You also need ipkg-cl and ipkg-make-index installed on your host
# put ipkg-build from org.openembedded.packaged-staging/contrib/ in your $PATH

# BUGS:
# * does not distinguish between -native, -cross and other packages

# TODO:
# * also build a feed for native and cross packages 
# * make package detection a bit smarter (search for compatible archs)
# * make do_clean clean staging as well

# Summary:
# This class will have two modes of operation:
# PSTAGE_MODE = 'repopulate': repopulated staging from scratch for each packages
# PSTAGE_MODE = 'append': append each package to staging (current behaviour)

inherit package

DEPENDS = "stagemanager-native"

DEPLOY_DIR_PSTAGE 	= "${DEPLOY_DIR}/pstage" 

PSTAGE_BUILD_CMD        = "${IPKGBUILDCMD}"
PSTAGE_INSTALL_CMD      = "ipkg-cl install -force-depends -f ${DEPLOY_DIR_PSTAGE}/ipkg.conf -o "
PSTAGE_UPDATE_CMD	= "ipkg-cl update -f ${DEPLOY_DIR_PSTAGE}/ipkg.conf -o "
PSTAGE_LIST_CMD		= "ipkg-cl list_installed -f ${DEPLOY_DIR_PSTAGE}/ipkg.conf -o "
PSTAGE_PKGNAME 		= "staging-${PN}_${PV}-${PR}_${PACKAGE_ARCH}.ipk"
PCROSS_PKGNAME		= "cross-${PN}_${PV}-${PR}_${BUILD_ARCH}.ipk"

SPAWNFILE 		= "${STAGING_DIR}/pkgmaps/${P}-${PR}.spawn"
SPAWNIPK                = "${spawn}"

PSTAGE_TMPDIR_STAGE     = "${TMPDIR}/tmp-staging"
PSTAGE_TMPDIR_CROSS     = "${TMPDIR}/tmp-cross"

STAGING_BASEDIR		= "${STAGING_LIBDIR}/.."

PACKAGEFUNCS += "do_write_ipk_list"

python do_write_ipk_list () {
        import os, sys
        ipkdir = bb.data.getVar('DEPLOY_DIR_IPK', d, 1)
        stagingdir = bb.data.getVar('STAGING_DIR', d, 1)
        tmpdir = bb.data.getVar('TMPDIR', d, 1)
        p = bb.data.getVar('P', d, 1)
        pr = bb.data.getVar('PR', d, 1)

        packages = bb.data.getVar('PACKAGES', d, 1)
        if not packages:
                bb.debug(1, "PACKAGES not defined, nothing to package")
                return

        if packages == []:
                bb.debug(1, "No packages; nothing to do")
                return

        # Generate ipk.conf if it or the stamp doesnt exist
        listfile = os.path.join(stagingdir,"pkgmaps","%s-%s.spawn" %  ( p , pr ))
        os.system('mkdir -p ' + stagingdir + '/pkgmaps')
        if not os.access(listfile, os.R_OK):
                os.system('rm -f ' + listfile)
                f = open(listfile,"w")
                for spawn in packages.split():
                        #check if the packagename has changed due to debian shlib renaming
                        localdata = bb.data.createCopy(d)
                        pkgname = bb.data.getVar('PKG_%s' % spawn, localdata, 1)
                        if not pkgname:
                                pkgname = spawn
                        f.write("%s\n" % pkgname)
                f.close()
}


do_clean_append() {
	"""clear the build and temp directories"""
        stagepkg = bb.data.expand("${DEPLOY_DIR_PSTAGE}/${PSTAGE_PKGNAME}", d)
        if stagepkg == '//': raise bb.build.FuncFailed("wrong DATADIR")
        bb.note("removing " + stagepkg)
        os.system('rm -rf ' + stagepkg)
}


do_stage_prepend() {

	stage-manager -p ${STAGING_DIR} -c ${DEPLOY_DIR_PSTAGE}/staging-stamp-cache -u

	stage-manager -p ${CROSS_DIR} -c ${DEPLOY_DIR_PSTAGE}/cross-stamp-cache -u

	if [ ! -e ${STAGING_BASEDIR} ]; then
		mkdir -p ${STAGING_BASEDIR}
	fi

	if [ ! -e ${DEPLOY_DIR_PSTAGE} ]; then
		mkdir -p ${DEPLOY_DIR_PSTAGE}
	fi

	if [ -e ${STAGING_BASEDIR}/usr ]; then
	        oenote "${STAGING_BASEDIR}/usr already present, leaving it alone"
	else
		oenote "${STAGING_BASEDIR}/usr not present, symlinking it"
		ln -s ${STAGING_BASEDIR}/ ${STAGING_BASEDIR}/usr
	fi

	#assemble appropriate ipkg.conf
	if [ -e ${DEPLOY_DIR_PSTAGE}/ipkg.conf ]; then
	        rm ${DEPLOY_DIR_PSTAGE}/ipkg.conf
	fi

	ipkgarchs="${BUILD_ARCH} all any noarch ${TARGET_ARCH} ${PACKAGE_ARCHS} ${PACKAGE_EXTRA_ARCHS} ${MACHINE}"
	priority=1
	for arch in $ipkgarchs; do
		echo "arch $arch $priority" >> ${DEPLOY_DIR_PSTAGE}/ipkg.conf
		priority=$(expr $priority + 5)
	done
	echo "src oe file:${DEPLOY_DIR_IPK}" >> ${DEPLOY_DIR_PSTAGE}/ipkg.conf 
	export OLD_PWD=`pwd`
	cd ${DEPLOY_DIR_IPK} && rm *${BUILD_ARCH}.ipk -f ; ipkg-make-index -p Packages . ; cd ${OLD_PWD}
	${PSTAGE_UPDATE_CMD} ${STAGING_BASEDIR}

	#check for generated packages
	if [ -e ${SPAWNFILE} ]; then
        	oenote "List of spawned packages found: ${P}.spawn"
        	for spawn in `cat ${SPAWNFILE} | grep -v locale | grep -v dbg | grep -v gconv | grep -v charmap` ; do \
			if [ -e ${DEPLOY_DIR_IPK}/${spawn}_* ]; then
               	 		${PSTAGE_INSTALL_CMD} ${STAGING_BASEDIR} ${spawn}          
				# clean up .la files to avoid having references to the builddirs in the binaries
				for lafile in ${STAGING_LIBDIR}/*.la ; do \
					sed -i s:installed=yes:installed=no:g ${lafile} || true
				done

				#fix up linker script to poin to staging
				if [ -e ${STAGING_LIBDIR}/libc.so ]; then
					sed -i s:\ /lib:\ ${STAGING_LIBDIR}:g ${STAGING_LIBDIR}/libc.so
					sed -i s:\ /usr/lib:\ ${STAGING_LIBDIR}:g ${STAGING_LIBDIR}/libc.so
				fi
			else
				oenote "${spawn} not found, probably empty package"
			fi
        	done
        	exit 0
	else
		oenote "Spawn file not found!"
	fi

        if [ -e ${DEPLOY_DIR_PSTAGE}/${PCROSS_PKGNAME} ]; then
                oenote "Cross stuff already packaged, using that instead"
                ${PSTAGE_INSTALL_CMD} ${CROSS_DIR}  ${DEPLOY_DIR_PSTAGE}/${PCROSS_PKGNAME}
        fi

	if [ -e ${DEPLOY_DIR_PSTAGE}/${PSTAGE_PKGNAME} ]; then
		oenote "Staging stuff already packaged, using that instead"
		${PSTAGE_INSTALL_CMD} ${STAGING_DIR}  ${DEPLOY_DIR_PSTAGE}/${PSTAGE_PKGNAME}
		exit 0      
	fi


	mkdir -p ${STAGING_BINDIR}
	mkdir -p ${STAGING_LIBDIR}
	mkdir -p ${STAGING_INCDIR}
	mkdir -p ${STAGING_DATADIR}/aclocal
}

do_stage_append() {

	mkdir -p ${DEPLOY_DIR_PSTAGE}

	# list the packages currently installed in staging
	${PSTAGE_LIST_CMD} ${STAGING_DIR} | awk '{print $1}' > ${DEPLOY_DIR_PSTAGE}/installed-staging_list         
	${PSTAGE_LIST_CMD} ${CROSS_DIR} | awk '{print $1}' > ${DEPLOY_DIR_PSTAGE}/installed-cross_list

	set +e
	rm -rf ${PSTAGE_TMPDIR_STAGE}
	stage-manager -p ${STAGING_DIR} -c ${DEPLOY_DIR_PSTAGE}/staging-stamp-cache -u -d ${PSTAGE_TMPDIR_STAGE}
	rc=$?
	set -e

	if [ $rc == 5 ]; then

		#make a package for staging
		mkdir -p ${PSTAGE_TMPDIR_STAGE}/CONTROL

		echo "Package: staging-${PN}"           >  ${PSTAGE_TMPDIR_STAGE}/CONTROL/control
		echo "Version: ${PV}-${PR}"             >> ${PSTAGE_TMPDIR_STAGE}/CONTROL/control
		echo "Description: ${DESCRIPTION}"      >> ${PSTAGE_TMPDIR_STAGE}/CONTROL/control
		echo "Section: ${SECTION}"              >> ${PSTAGE_TMPDIR_STAGE}/CONTROL/control
		echo "Priority: Optional"               >> ${PSTAGE_TMPDIR_STAGE}/CONTROL/control
		echo "Maintainer: ${MAINTAINER}"        >> ${PSTAGE_TMPDIR_STAGE}/CONTROL/control
		echo "Architecture: ${PACKAGE_ARCH}"    >> ${PSTAGE_TMPDIR_STAGE}/CONTROL/control
		echo "Source: ${SRC_URI}"               >> ${PSTAGE_TMPDIR_STAGE}/CONTROL/control

	        ${PSTAGE_BUILD_CMD} ${PSTAGE_TMPDIR_STAGE} ${DEPLOY_DIR_PSTAGE}

		${PSTAGE_INSTALL_CMD} ${STAGING_DIR} ${DEPLOY_DIR_PSTAGE}/${PSTAGE_PKGNAME}
	fi

	set +e
	rm -rf ${PSTAGE_TMPDIR_CROSS}
	stage-manager -p ${CROSS_DIR} -c ${DEPLOY_DIR_PSTAGE}/cross-stamp-cache -u -d ${PSTAGE_TMPDIR_CROSS}
	rc=$?
	set -e

	if [ $rc == 5 ]; then

		#make a package for cross
	        mkdir -p ${PSTAGE_TMPDIR_CROSS}/CONTROL

	        echo "Package: cross-${PN}"           	>  ${PSTAGE_TMPDIR_CROSS}/CONTROL/control
	        echo "Version: ${PV}-${PR}"             >> ${PSTAGE_TMPDIR_CROSS}/CONTROL/control
	        echo "Description: ${DESCRIPTION}"      >> ${PSTAGE_TMPDIR_CROSS}/CONTROL/control
	        echo "Section: ${SECTION}"              >> ${PSTAGE_TMPDIR_CROSS}/CONTROL/control
	        echo "Priority: Optional"               >> ${PSTAGE_TMPDIR_CROSS}/CONTROL/control
	        echo "Maintainer: ${MAINTAINER}"        >> ${PSTAGE_TMPDIR_CROSS}/CONTROL/control
	        echo "Architecture: ${BUILD_ARCH}"    	>> ${PSTAGE_TMPDIR_CROSS}/CONTROL/control
	        echo "Source: ${SRC_URI}"               >> ${PSTAGE_TMPDIR_CROSS}/CONTROL/control
	
		${PSTAGE_BUILD_CMD} ${PSTAGE_TMPDIR_CROSS} ${DEPLOY_DIR_PSTAGE}

		${PSTAGE_INSTALL_CMD} ${CROSS_DIR} ${DEPLOY_DIR_PSTAGE}/${PCROSS_PKGNAME}
	fi
}