-rw-r--r-- | Makefile | 26 | ||||
-rw-r--r-- | Vars.make | 63 | ||||
-rwxr-xr-x | scripts/mkipkg | 371 |
3 files changed, 451 insertions, 9 deletions
@@ -1,18 +1,13 @@ #!/usr/bin/make -f -ifndef QTDIR -$(error QTDIR not set) -endif -export OPIEDIR:=$(shell pwd) -export TOPDIR:=$(OPIEDIR) -export QMAKE:=$(OPIEDIR)/qmake/qmake +export TOPDIR:=$(shell pwd) -export QMAKESPECSDIR=$(OPIEDIR)/mkspecs +include $(TOPDIR)/Vars.make noconfig_targets := xconfig menuconfig config oldconfig randconfig \ defconfig allyesconfig allnoconfig allmodconfig \ clean-configs configs += $(TOPDIR)/core/applets/config.in $(TOPDIR)/core/apps/config.in $(TOPDIR)/core/multimedia/config.in $(TOPDIR)/core/pim/config.in $(TOPDIR)/core/pim/today/plugins/config.in $(TOPDIR)/core/settings/config.in $(TOPDIR)/development/config.in $(TOPDIR)/inputmethods/config.in $(TOPDIR)/libopie/ofileselector/config.in $(TOPDIR)/libopie/pim/config.in $(TOPDIR)/libsql/config.in $(TOPDIR)/noncore/applets/config.in $(TOPDIR)/noncore/apps/opie-console/test/config.in $(TOPDIR)/noncore/apps/config.in $(TOPDIR)/noncore/comm/config.in $(TOPDIR)/noncore/decorations/config.in $(TOPDIR)/noncore/games/config.in $(TOPDIR)/noncore/graphics/config.in $(TOPDIR)/noncore/multimedia/config.in $(TOPDIR)/noncore/net/config.in $(TOPDIR)/noncore/net/opietooth/config.in $(TOPDIR)/noncore/settings/config.in $(TOPDIR)/noncore/styles/config.in $(TOPDIR)/noncore/tools/calc2/config.in $(TOPDIR)/noncore/tools/config.in $(TOPDIR)/noncore/todayplugins/config.in # $(TOPDIR)/.config depends on .depends.cfgs, as it depends on $(configs) @@ -21,25 +16,39 @@ configs += $(TOPDIR)/core/applets/config.in $(TOPDIR)/core/apps/config.in $(TOPD # everything else depends on .depends, to ensure the dependencies are # intact. # # NOTE: The order in which things happen in this makefile is # -critical-. Do not rearrange this! all : $(TOPDIR)/.config +STRIP=arm-linux-strip + +ipks: $(OPIEDIR)/scripts/subst $(OPIEDIR)/scripts/filesubst FORCE + @find $(OPIEDIR)/ -type f -name \*.control | ( for ctrl in `cat`; do \ + prerm=`echo $$ctrl|sed -e 's,\.control$$,.prerm,'`; \ + preinst=`echo $$ctrl|sed -e 's,\.control$$,.preinst,'`; \ + postrm=`echo $$ctrl|sed -e 's,\.control$$,.postrm,'`; \ + postinst=`echo $$ctrl|sed -e 's,\.control$$,.postinst,'`; \ + echo "Building ipk of $$ctrl"; \ + cd $(OPIEDIR); $(OPIEDIR)/scripts/mkipkg --subst=$(OPIEDIR)/scripts/subst --filesubst=$(OPIEDIR)/scripts/filesubst --control=$$ctrl --prerm=$$prerm --preinst=$$preinst --postrm=$$postrm --postinst=$$postinst --strip=$(STRIP) $(OPIEDIR); \ + done ) + $(TOPDIR)/.config : $(TOPDIR)/.depends.cfgs all menuconfig xconfig oldconfig config randconfig allyesconfig allnoconfig defconfig : $(TOPDIR)/.depends.cfgs clean-configs : @echo "Wiping generated config.in files..." @-rm -f $(configs) --include $(TOPDIR)/.depends.cfgs +ifneq ($(wildcard $(TOPDIR)/.depends.cfgs),) + include $(TOPDIR)/.depends.cfgs +endif all menuconfig xconfig oldconfig config randconfig allyesconfig allnoconfig defconfig : $(configs) $(TOPDIR)/.config: $(TOPDIR)/.depends.cfgs $(configs) $(call descend,scripts/kconfig,conf) @if [ ! -e $@ ]; then \ cp $(TOPDIR)/def-configs/opie $@; \ fi; @@ -87,17 +96,16 @@ defconfig : export ifeq ($(filter $(noconfig_targets),$(MAKECMDGOALS)),) export include-config := 1 -include $(TOPDIR)/.config -include $(TOPDIR)/.depends - endif -include $(TOPDIR)/.config.cmd SUBDIRS = $(subdir-y) export QMAKESPEC=$(QMAKESPECSDIR)/$(patsubst "%",%,$(CONFIG_SPECFILE)) diff --git a/Vars.make b/Vars.make new file mode 100644 index 0000000..eac5cea --- a/dev/null +++ b/Vars.make @@ -0,0 +1,63 @@ +ifndef QTDIR +$(error QTDIR not set) +endif + +prefix=/opt/QtPalmtop + +ifeq ($(OPIEDIR),) + export OPIEDIR:=$(TOPDIR) +endif +ifeq ($(IPK_DIR),) + export IPK_DIR:=$(OPIEDIR) +endif + +export QMAKE:=$(OPIEDIR)/qmake/qmake +export QMAKESPECSDIR=$(OPIEDIR)/mkspecs + +ifeq ($(QPE_VERSION),) + VERSION_MAJ:=$(shell echo $$(sed -n -e 's/.*QPE_VERSION "\([0-9]*\)\..*\..*".*/\1/p' <$(OPIEDIR)/library/version.h)) + VERSION_MIN:=$(shell echo $$(sed -n -e 's/.*QPE_VERSION ".*\.\([0-9]*\)\..*".*/\1/p' <$(OPIEDIR)/library/version.h)) + VERSION_PAT:=$(shell echo $$(sed -n -e 's/.*QPE_VERSION ".*\..*\.\([0-9]*\).*/\1/p' <$(OPIEDIR)/library/version.h)) + QPE_VERSION:=$(VERSION_MAJ).$(VERSION_MIN).$(VERSION_PAT) + + ifeq ($(QPE_VERSION),..) + QPE_VERSION=0.9.3 + endif +endif +export QPE_VERSION + +SUB_VERSION=$(shell echo $$(sed -n -e 's,.*SUB_VERSION \"\(.*\)\".*,\1,p' <$(OPIEDIR)/library/version.h)) +ifeq ($(VERSION_CVS),) + VERSION_CVS:=$(shell date +%Y%m%d) +endif +ifneq ($(filter %snapshot",$(shell cat $(OPIEDIR)/library/version.h|grep QPE_VERSION)),) + SUB_VERSION:=$(VERSION_CVS) +endif +export SUB_VERSION + +ifeq ($(QTE_REVISION),) + QTE_REVISION=4 +endif +export QTE_REVISION + +export DEB_VERSION=2.0 + +ifeq ($(QTE_BASEVERSION),) + ifneq ($(shell ls $(QTDIR)/include/qglobal.h 2>/dev/null),) + QTE_BASEVERSION:=$(shell cat $(QTDIR)/include/qglobal.h|grep '^\#define QT_VERSION'|grep -v STR|sed -e 's/\#define QT_VERSION\t*//; s/.*\([0-9]\)\([0-9]\)\([0-9]\).*/\1.\2.\3/;') + else + QTE_BASEVERSION=2.3.5 + endif +endif +export QTE_BASEVERSION + +ifeq ($(QTE_VERSION),) + ifneq ($(shell ls $(QTDIR)/include/qglobal.h 2>/dev/null),) + QTE_VERSION:=$(shell cat $(QTDIR)/include/qglobal.h|grep '^\#define QT_VERSION_STR'|sed -e 's/\#define QT_VERSION_STR\t*//;' -e 's/.*"\([^"]*\)".*/\1/;') + else + QTE_VERSION=2.3.5 + endif +endif +export QTE_VERSION + +export PATH:=$(OPIEDIR)/scripts:$(PATH) diff --git a/scripts/mkipkg b/scripts/mkipkg new file mode 100755 index 0000000..54651af --- a/dev/null +++ b/scripts/mkipkg @@ -0,0 +1,371 @@ +#!/bin/sh +# vim: et sw=4 + +# TODO: srcdir!=builddir + +usage() +{ + echo "usage: $self --destdir=[destination installation directory]" + echo "usage: $self [destination installation directory]" + exit 1 +} + +self=mkipkg +destdir= +strip=strip +control= +builddir= +srcdir= +prefix= +preinst= +postinst= +prerm= +postrm= +mkfsjffs2= +ipkgbuild=ipkg-build +buildversion= +subst= +user=root +group=root +filesubst= + +oldpwd= + +for option +do + case "$option" in + -*=*) + arg=`echo "$option" | sed 's/[-_a-zA-Z0-9]*=//'` + ;; + esac + + case "$option" in + --destdir=*) + destdir=$arg + ;; + --strip=*) + strip=$arg + ;; + --control=*) + control=$arg + ;; + --preinst=*) + preinst=$arg + ;; + --postinst=*) + postinst=$arg + ;; + --prerm=*) + prerm=$arg + ;; + --postrm=*) + postrm=$arg + ;; + --builddir=*) + builddir=$arg + ;; + --srcdir=*) + srcdir=$arg + ;; + --prefix=*) + prefix=$arg + ;; + --mkfsjffs2=*) + mkfsjffs2=$arg + ;; + --ipkgbuild=*) + ipkgbuild=$arg + ;; + --buildversion=*) + buildversion=$arg + ;; + --subst=*) + subst=$arg + ;; + --user=*) + user=$arg + ;; + --group=*) + group=$arg + ;; + --filesubst=*) + filesubst=$arg + ;; + --classic) + classic=-c + ;; + -*) + usage + ;; + *) + destdir=$option + ;; + esac +done + +if [ -z "$control" ]; then + control=$destdir/CONTROL/control +fi +if [ -z "$prerm" ]; then + prerm=$destdir/CONTROL/prerm +fi +if [ -z "$postrm" ]; then + postrm=$destdir/CONTROL/postrm +fi +if [ -z "$preinst" ]; then + preinst=$destdir/CONTROL/preinst +fi +if [ -z "$postinst" ]; then + postinst=$destdir/CONTROL/postinst +fi + +# remove leading slash from prefix (to fix globbing) +if [ -n "$prefix" ]; then + prefix=`echo $prefix | sed -e "s,/\(.*\),\\1,"` +fi + +if [ -z "$destdir" ]; then + usage +fi + +if [ ! -r $control ]; then + echo "$self: cannot find $control, exiting..." + exit 1 +fi + +if [ -z "`which $ipkgbuild 2>/dev/null`" ]; then + echo "$self: cannot find ipkg-build, exiting..." + exit 1 +fi + +findFile() +{ + local path= + if [ $# = 1 ]; then + find $1 -type f -o -type b -o -type c -o -type l -o -type d + else + find . -type f -o -type b -o -type c -o -type l -o -type d | \ + sed -e "s,\./\(.*\),\\1,g" + fi + +} + +_pushd() { oldpwd=`pwd`; cd $1; } +_popd() { cd $oldpwd; } + +setVar() +{ + eval "$1='$2'" +} + +expandMaskToList() +{ + local _list=`echo $1` + local _tmpFileList= + for f in $_list; do + if [ -d $f ]; then + find="`findFile $f`" + if [ -z "$find" ]; then + find="$f" + fi + f="$f `findFile $f`" + fi + _tmpFileList=$f" $_tmpFileList" + done + setVar $2 "$_tmpFileList" +} + +createFileList() +{ + local excludeMask + local includeMask + if (cat $1|grep -q ^FileExcludeMask); then + excludemaskpresent=1 + excludeMask=$(eval echo '"'$(sed -n -e "s,^FileExcludeMask: *,,p" $1)'"') + fi + if (cat $1|grep -q ^FileIncludeMask); then + includemaskpresent=1 + includeMask=$(eval echo '"'$(sed -n -e "s,^FileIncludeMask: *,,p" $1)'"') + else + if (cat $1|grep -q ^Files:); then + includemaskpresent=1 + includeMask=$(eval echo '"'$(sed -n -e "s,^Files: *,,p" $1)'"') + fi + fi + + excludeMask="$excludeMask CONTROL/* usr/share/* CVS/* SCCS/*" + + if [ $includemaskpresent == 1 ]; then + if [ -z "$includeMask" ]; then + setVar $2 "" + return 0 + fi + _pushd $destdir + expandMaskToList "$includeMask" _fileList + _popd + else + _fileList=`cd $destdir && findFile` + fi + + _excludeList= + if [ -n "$excludeMask" ]; then + _pushd $destdir + expandMaskToList "$excludeMask" _excludeList + _popd + fi + + local realFileList= + local missing=0 + for file in $_fileList; do + local containedInList=0 + for i in $_excludeList; do + if [ $file = $i ]; then + containedInList=1 + fi + done + if [ $containedInList = 0 ]; then + if [ ! -e $file ]; then +# echo "$self: $file not found" + missing=1 + fi + realFileList=$file" $realFileList" + fi + done + + if [ $missing = 1 ]; then + return 1 + fi + + setVar $2 "$realFileList" +} + +stripFile() +{ + if [ -f $1 -a -x $1 ]; then + $strip --strip-all $1 + fi +} + +substFile() +{ + local oldfile=$1 + + if [ ! -e $2 ]; then return 1; fi + + if [ -e $oldfile ]; then + newfile=./`echo $1|sed -f $2|sed -e's,^/,,g'` + olddir=./`dirname $1` + newdir=`dirname $newfile` + + if [ "$newdir" = "$olddir" ]; then + return 0 + fi + + mkdir -p $newdir + mv $1 $newfile + rmdir -p $olddir 2>/dev/null + fi +} + +stripFiles() +{ + for f in $1; do + stripFile $f + done +} + +substFiles() +{ + for f in $1; do + substFile $f + done +} + +substAndStripFiles() +{ + for f in $1; do + stripFile $f + substFile $f $2 + done +} + +installScript() +{ + if [ -n "$1" -a -f "$1" ]; then + destfile=`basename $1` + if [ -n "$subst" ]; then + sed -f $subst < $1 > $ctrldir/$destfile + else + cat $1 > $ctrldir/$destfile + fi + chmod +x $ctrldir/$destfile + fi +} + +tempDir=/tmp/`basename $self`.$$ +mkdir -p $tempDir +if [ $? != 0 ]; then + echo "$self: cannot create $tempDir, exiting..." + exit 1 +fi + +cd $destdir; createFileList $control ipkgFileList +if [ "$?" != "0" ]; then + echo "$self: ERROR: missing files, not building $control" + exit 1 +fi + +( cd $destdir && tar cf - $ipkgFileList 2>/dev/null ) | \ +( cd $tempDir && tar xf - 2>/dev/null ) + +if [ -z "$filesubst" ]; then + ( cd $tempDir && stripFiles "$ipkgFileList" ) +else + if ! (echo $filesubst|grep -q '^/'); then + filesubst="$oldpwd/$filesubst" + fi + ( cd $tempDir && substAndStripFiles "$ipkgFileList" $filesubst ) +fi + +path="`echo "$PATH" | sed -e "s/\:/ /g"`" +if [ -z "$mkfsjffs2" ]; then + for i in $path; do + if [ -x "$i/mkfs.jffs2" ]; then + mkfsjffs2="$i/mkfs.jffs2" + break + fi + done +fi + +if [ -z "$mkfsjffs2" ]; then + echo "$self: WARNING: no mkjfs.jffs2 found in path. Falling back to using du" + echo "for size calculation. mkfs.jffs2 is recommended for size calculation" + echo "as it calculates the real package size on the compressed file system," + echo "in contrast to du calculating the uncompressed size!" + buildsize=`du -h -s $tempDir | awk '{print $1}'` +else + buildsize=`$mkfsjffs2 -r $tempDir | wc -c` +fi + +ctrldir=$tempDir/CONTROL + +mkdir -p $ctrldir + +if [ ! -e $subst ] || [ -z "$subst" ]; then + cat $control | egrep -v '^(FileIncludeMask|FileExcludeMask|Files):' > $ctrldir/control +else + sed -f $subst < $control | egrep -v '^(FileIncludeMask|FileExcludeMask|Files):' > $ctrldir/control +fi + +if [ "$buildsize" != "0" ]; then + echo "Installed-Size: $buildsize" >> $ctrldir/control +fi + +installScript $preinst +installScript $postinst +installScript $prerm +installScript $posrm + +$ipkgbuild $classic -o $user -g $group $tempDir + +rm -rf $tempDir |