.lpbuild: basics of new deb packaging (RM #244)

git-svn-id: svn://ultimatepp.org/upp/trunk@4472 f0d560ea-af0d-0410-9eb7-867de7ffcac7
This commit is contained in:
dolik 2012-01-26 20:15:10 +00:00
parent b2f2cc2a8c
commit 6050e5d0e2
23 changed files with 1329 additions and 0 deletions

30
uppbox/lpbuild2/Makefile Normal file
View file

@ -0,0 +1,30 @@
build: ide ide-nogtk umk
ifneq (,$(filter parallel=%,$(DEB_BUILD_OPTIONS)))
JOBS=-j$(patsubst parallel=%,%,$(filter parallel=%,$(DEB_BUILD_OPTIONS)))
else
JOBS=
endif
ide:
sed -i -e 's/IDE_VERSION[ \t]*"\([0-9]*\)[^"]*"/IDE_VERSION "\1-'$(SERIES)-$(ARCH)'"/' $(CURDIR)/uppsrc/ide/version.h
$(MAKE) -f mkfile $(JOBS) PKG=ide $(compiler) "NESTS=uppsrc" "FLAGS=GUI MT GCC SHARED" BINEXT= "BINPREFIX="
#cp /usr/bin/theide $@
ide-nogtk:
sed -i -e 's/IDE_VERSION[ \t]*"\([0-9]*\)[^"]*"/IDE_VERSION "\1-'$(SERIES)-$(ARCH)'-nogtk"/' $(CURDIR)/uppsrc/ide/version.h
$(MAKE) -f mkfile $(JOBS) PKG=ide $(compiler) "NESTS=uppsrc" "FLAGS=GUI MT NOGTK GCC SHARED" BINEXT=-nogtk "BINPREFIX="
#cp /usr/bin/theide $@
umk:
$(MAKE) -f mkfile $(JOBS) PKG=umk $(compiler) "NESTS=uppsrc" "FLAGS=GCC SHARED" BINEXT= "BINPREFIX="
#cp /usr/bin/theide $@
install:
# this is just a trick to rename files
install -D ide $(DESTDIR)/theide
install -D ide-nogtk $(DESTDIR)/nogtk/theide
install -D uppsrc/ide/theide-48.png $(DESTDIR)/theide.png
clean:
rm -f ide ide-nogtk umk

View file

@ -0,0 +1,4 @@
Copyright © 1999-2012 Ultimate++ team (http://ultimatepp.org)
Authors: Mirek Fídler, Koldo Ramirez, Tomáš Rylek, Daniel Kos
License: BSD (please see /usr/share/common-licenses/BSD).

View file

@ -0,0 +1 @@
5

View file

@ -0,0 +1,57 @@
Source: upp
Section: devel
Priority: optional
Maintainer: Jan Dolinar <dolik.rce@seznam.cz>
Standards-Version: 3.8.4
Build-Depends: g++ (= 4.1) | g++ (>= 4.3), debhelper, libx11-dev (>= 1.0.0), libxft-dev (>= 2.1.8), libpng12-dev (>= 1.2.8), libgtk2.0-dev (>= 2.8.17), libnotify-dev
Homepage: http://www.ultimatepp.org
Package: upp
Architecture: all
Depends: theide, g++ (= 4.1) | g++ (>= 4.3), libx11-dev (>= 1.0.0), libxft-dev (>= 2.1.8), libpng12-dev (>= 1.2.8), libgtk2.0-dev (>= 2.8.17), libnotify-dev
Description: C++ library for cross-platform development
Ultimate++ is a radical and innovative GUI toolkit whose number one priority
is programmer productivity. C++ is a great programming language but
C++ programmers are sometimes hampered by the lack of effective libraries.
U++ libraries enable genuine productivity gains with shorter development
times and greatly reduced application source code size.
Package: theide
Architecture: any
Depends: ${shlibs:Depends}
Replaces: upp (<= 2332)
Description: IDE (not only) for Ultimate++ framework
TheIDE introduces modular concepts to C++ programming. It features
BLITZ-build technology to speedup C++ rebuilds up to 4 times, Visual
designers for U++ libraries, Topic++ system for documenting code
and creating rich text resources for applications (like help and code
documentation) and Assist++ - a powerful C++ code analyzer that provides
features like code completion, navigation and transformation.
Package: theide-nogtk
Architecture: any
Depends: ${shlibs:Depends}
Provides: theide
Replaces: theide, upp (<=2332)
Conflicts: theide
Description: IDE (not only) for Ultimate++ framework [nogtk build]
TheIDE introduces modular concepts to C++ programming. It features
BLITZ-build technology to speedup C++ rebuilds up to 4 times, Visual
designers for Ultimate++ libraries, Topic++ system for documenting code
and creating rich text resources for applications (like help and code
documentation) and Assist++ - a powerful C++ code analyzer that provides
features like code completion, navigation and transformation.
.
This package contains TheIDE built with simpler look to reduce
package dependencies.
Package: umk
Architecture: any
Depends: ${shlibs:Depends}
Provides: theide
Replaces: theide, upp (<=2332)
Conflicts: theide
Description: Command line builder for Ultimate++ projects
For those who need to build U++ packages from scripts or in minimalistic
environments, umk utility provides simple building solution. It fully supports
all the build-related features provided by TheIDE, without the actual IDE.

View file

@ -0,0 +1 @@
usr/share/upp

4
uppbox/lpbuild2/debian/rules Executable file
View file

@ -0,0 +1,4 @@
#!/usr/bin/make -f
%:
dh $@

View file

@ -0,0 +1 @@
3.0 (quilt)

View file

@ -0,0 +1,6 @@
debian/tmp/nogtk/theide usr/bin
umk usr/bin
theide.1 usr/share/man1
theide.desktop usr/share/applications
debian/tmp/theide.png usr/share/pixmaps
copyright usr/share/doc/theide-nogtk

View file

@ -0,0 +1,74 @@
#!/bin/sh
# postinst script for upp
#
# see: dh_installdeb(1)
set -e
# summary of how this script can be called:
# * <postinst> `configure' <most-recently-configured-version>
# * <old-postinst> `abort-upgrade' <new version>
# * <conflictor's-postinst> `abort-remove' `in-favour' <package>
# <new-version>
# * <postinst> `abort-remove'
# * <deconfigured's-postinst> `abort-deconfigure' `in-favour'
# <failed-install-package> <version> `removing'
# <conflicting-package> <version>
# for details, see http://www.debian.org/doc/debian-policy/ or
# the debian-policy package
create_bm(){
echo "Configuring build method $2 for $1"
cat > "/usr/share/upp/$2.bm" << EOF
BUILDER = "GCC";
COMPILER = "$1";
DEBUG_INFO = "2";
DEBUG_BLITZ = "1";
DEBUG_LINKMODE = "1";
DEBUG_OPTIONS = "-O0";
DEBUG_FLAGS = "";
RELEASE_BLITZ = "0";
RELEASE_LINKMODE = "1";
RELEASE_OPTIONS = "-O3 -ffunction-sections -fdata-sections";
RELEASE_SIZE_OPTIONS = "-Os -finline-limit=20 -ffunction-sections -fdata-sections";
RELEASE_FLAGS = "";
RELEASE_LINK = "-Wl,--gc-sections";
DEBUGGER = "gdb";
PATH = "";
INCLUDE = "/usr/include/freetype2;/usr/include/gtk-2.0;/usr/include/glib-2.0;/usr/lib/glib-2.0/include;/usr/lib/gtk-2.0/include;/usr/include/cairo;/usr/include/pango-1.0;/usr/include/atk-1.0;/usr/include/gdk-pixbuf-2.0;/usr/lib/i386-linux-gnu/glib-2.0/include;/usr/lib/x86_64-linux-gnu/glib-2.0/include;/usr/lib/i386-linux-gnu/gtk-2.0/include;/usr/lib/x86_64-linux-gnu/gtk-2.0/include;/usr/include/gtk-3.0/gdk"
LIB = "/usr/X11R6/lib";
REMOTE_HOST = "";
REMOTE_OS = "";
REMOTE_TRANSFER = "";
REMOTE_MAP = "";
LINKMODE_LOCK = "0";
EOF
chmod 644 /usr/share/upp/$2.bm
}
case "$1" in
configure)
[ "`which g++ 2>/dev/null`" ] && create_bm "g++" "GCC" || true
[ "`which clang++ 2>/dev/null`" ] && create_bm "clang++" "CLANG" || true
for v in `seq 9 -1 3` 1 0; do
[ "`which g++-4.$v 2>/dev/null`" ] && create_bm "g++-4.$v" "GCC4.$v" || true
done
[ "`ls /usr/share/upp/*.bm`" ] || create_bm "g++" "GCC"
;;
abort-upgrade|abort-remove|abort-deconfigure)
rm -f /usr/share/upp/*.bm
;;
*)
echo "postinst called with unknown argument \`$1'" >&2
exit 1
;;
esac
# dh_installdeb will replace this with shell code automatically
# generated by other debhelper scripts.
#DEBHELPER#
exit 0

View file

@ -0,0 +1,39 @@
#!/bin/sh
# prerm script for upp
#
# see: dh_installdeb(1)
set -e
# summary of how this script can be called:
# * <prerm> `remove'
# * <old-prerm> `upgrade' <new-version>
# * <new-prerm> `failed-upgrade' <old-version>
# * <conflictor's-prerm> `remove' `in-favour' <package> <new-version>
# * <deconfigured's-prerm> `deconfigure' `in-favour'
# <package-being-installed> <version> `removing'
# <conflicting-package> <version>
# for details, see http://www.debian.org/doc/debian-policy/ or
# the debian-policy package
case "$1" in
remove|upgrade|deconfigure)
rm -f /usr/share/upp/*.bm
;;
failed-upgrade)
;;
*)
echo "prerm called with unknown argument \`$1'" >&2
exit 1
;;
esac
# dh_installdeb will replace this with shell code automatically
# generated by other debhelper scripts.
#DEBHELPER#
exit 0

View file

@ -0,0 +1,6 @@
debian/tmp/theide usr/bin
umk usr/bin
theide.1 usr/share/man1
theide.desktop usr/share/applications
debian/tmp/theide.png usr/share/pixmaps
copyright usr/share/doc/theide

View file

@ -0,0 +1,74 @@
#!/bin/sh
# postinst script for upp
#
# see: dh_installdeb(1)
set -e
# summary of how this script can be called:
# * <postinst> `configure' <most-recently-configured-version>
# * <old-postinst> `abort-upgrade' <new version>
# * <conflictor's-postinst> `abort-remove' `in-favour' <package>
# <new-version>
# * <postinst> `abort-remove'
# * <deconfigured's-postinst> `abort-deconfigure' `in-favour'
# <failed-install-package> <version> `removing'
# <conflicting-package> <version>
# for details, see http://www.debian.org/doc/debian-policy/ or
# the debian-policy package
create_bm(){
echo "Configuring build method $2 for $1"
cat > "/usr/share/upp/$2.bm" << EOF
BUILDER = "GCC";
COMPILER = "$1";
DEBUG_INFO = "2";
DEBUG_BLITZ = "1";
DEBUG_LINKMODE = "1";
DEBUG_OPTIONS = "-O0";
DEBUG_FLAGS = "";
RELEASE_BLITZ = "0";
RELEASE_LINKMODE = "1";
RELEASE_OPTIONS = "-O3 -ffunction-sections -fdata-sections";
RELEASE_SIZE_OPTIONS = "-Os -finline-limit=20 -ffunction-sections -fdata-sections";
RELEASE_FLAGS = "";
RELEASE_LINK = "-Wl,--gc-sections";
DEBUGGER = "gdb";
PATH = "";
INCLUDE = "/usr/include/freetype2;/usr/include/gtk-2.0;/usr/include/glib-2.0;/usr/lib/glib-2.0/include;/usr/lib/gtk-2.0/include;/usr/include/cairo;/usr/include/pango-1.0;/usr/include/atk-1.0;/usr/include/gdk-pixbuf-2.0;/usr/lib/i386-linux-gnu/glib-2.0/include;/usr/lib/x86_64-linux-gnu/glib-2.0/include;/usr/lib/i386-linux-gnu/gtk-2.0/include;/usr/lib/x86_64-linux-gnu/gtk-2.0/include;/usr/include/gtk-3.0/gdk"
LIB = "/usr/X11R6/lib";
REMOTE_HOST = "";
REMOTE_OS = "";
REMOTE_TRANSFER = "";
REMOTE_MAP = "";
LINKMODE_LOCK = "0";
EOF
chmod 644 /usr/share/upp/$2.bm
}
case "$1" in
configure)
[ "`which g++ 2>/dev/null`" ] && create_bm "g++" "GCC" || true
[ "`which clang++ 2>/dev/null`" ] && create_bm "clang++" "CLANG" || true
for v in `seq 9 -1 3` 1 0; do
[ "`which g++-4.$v 2>/dev/null`" ] && create_bm "g++-4.$v" "GCC4.$v" || true
done
[ "`ls /usr/share/upp/*.bm`" ] || create_bm "g++" "GCC"
;;
abort-upgrade|abort-remove|abort-deconfigure)
rm -f /usr/share/upp/*.bm
;;
*)
echo "postinst called with unknown argument \`$1'" >&2
exit 1
;;
esac
# dh_installdeb will replace this with shell code automatically
# generated by other debhelper scripts.
#DEBHELPER#
exit 0

View file

@ -0,0 +1,39 @@
#!/bin/sh
# prerm script for upp
#
# see: dh_installdeb(1)
set -e
# summary of how this script can be called:
# * <prerm> `remove'
# * <old-prerm> `upgrade' <new-version>
# * <new-prerm> `failed-upgrade' <old-version>
# * <conflictor's-prerm> `remove' `in-favour' <package> <new-version>
# * <deconfigured's-prerm> `deconfigure' `in-favour'
# <package-being-installed> <version> `removing'
# <conflicting-package> <version>
# for details, see http://www.debian.org/doc/debian-policy/ or
# the debian-policy package
case "$1" in
remove|upgrade|deconfigure)
rm -f /usr/share/upp/*.bm
;;
failed-upgrade)
;;
*)
echo "prerm called with unknown argument \`$1'" >&2
exit 1
;;
esac
# dh_installdeb will replace this with shell code automatically
# generated by other debhelper scripts.
#DEBHELPER#
exit 0

View file

@ -0,0 +1,2 @@
umk usr/bin
copyright usr/share/doc/umk

View file

@ -0,0 +1,74 @@
#!/bin/sh
# postinst script for upp
#
# see: dh_installdeb(1)
set -e
# summary of how this script can be called:
# * <postinst> `configure' <most-recently-configured-version>
# * <old-postinst> `abort-upgrade' <new version>
# * <conflictor's-postinst> `abort-remove' `in-favour' <package>
# <new-version>
# * <postinst> `abort-remove'
# * <deconfigured's-postinst> `abort-deconfigure' `in-favour'
# <failed-install-package> <version> `removing'
# <conflicting-package> <version>
# for details, see http://www.debian.org/doc/debian-policy/ or
# the debian-policy package
create_bm(){
echo "Configuring build method $2 for $1"
cat > "/usr/share/upp/$2.bm" << EOF
BUILDER = "GCC";
COMPILER = "$1";
DEBUG_INFO = "2";
DEBUG_BLITZ = "1";
DEBUG_LINKMODE = "1";
DEBUG_OPTIONS = "-O0";
DEBUG_FLAGS = "";
RELEASE_BLITZ = "0";
RELEASE_LINKMODE = "1";
RELEASE_OPTIONS = "-O3 -ffunction-sections -fdata-sections";
RELEASE_SIZE_OPTIONS = "-Os -finline-limit=20 -ffunction-sections -fdata-sections";
RELEASE_FLAGS = "";
RELEASE_LINK = "-Wl,--gc-sections";
DEBUGGER = "gdb";
PATH = "";
INCLUDE = "/usr/include/freetype2;/usr/include/gtk-2.0;/usr/include/glib-2.0;/usr/lib/glib-2.0/include;/usr/lib/gtk-2.0/include;/usr/include/cairo;/usr/include/pango-1.0;/usr/include/atk-1.0;/usr/include/gdk-pixbuf-2.0;/usr/lib/i386-linux-gnu/glib-2.0/include;/usr/lib/x86_64-linux-gnu/glib-2.0/include;/usr/lib/i386-linux-gnu/gtk-2.0/include;/usr/lib/x86_64-linux-gnu/gtk-2.0/include;/usr/include/gtk-3.0/gdk"
LIB = "/usr/X11R6/lib";
REMOTE_HOST = "";
REMOTE_OS = "";
REMOTE_TRANSFER = "";
REMOTE_MAP = "";
LINKMODE_LOCK = "0";
EOF
chmod 644 /usr/share/upp/$2.bm
}
case "$1" in
configure)
[ "`which g++ 2>/dev/null`" ] && create_bm "g++" "GCC" || true
[ "`which clang++ 2>/dev/null`" ] && create_bm "clang++" "CLANG" || true
for v in `seq 9 -1 3` 1 0; do
[ "`which g++-4.$v 2>/dev/null`" ] && create_bm "g++-4.$v" "GCC4.$v" || true
done
[ "`ls /usr/share/upp/*.bm`" ] || create_bm "g++" "GCC"
;;
abort-upgrade|abort-remove|abort-deconfigure)
rm -f /usr/share/upp/*.bm
;;
*)
echo "postinst called with unknown argument \`$1'" >&2
exit 1
;;
esac
# dh_installdeb will replace this with shell code automatically
# generated by other debhelper scripts.
#DEBHELPER#
exit 0

View file

@ -0,0 +1,39 @@
#!/bin/sh
# prerm script for upp
#
# see: dh_installdeb(1)
set -e
# summary of how this script can be called:
# * <prerm> `remove'
# * <old-prerm> `upgrade' <new-version>
# * <new-prerm> `failed-upgrade' <old-version>
# * <conflictor's-prerm> `remove' `in-favour' <package> <new-version>
# * <deconfigured's-prerm> `deconfigure' `in-favour'
# <package-being-installed> <version> `removing'
# <conflicting-package> <version>
# for details, see http://www.debian.org/doc/debian-policy/ or
# the debian-policy package
case "$1" in
remove|upgrade|deconfigure)
rm -f /usr/share/upp/*.bm
;;
failed-upgrade)
;;
*)
echo "prerm called with unknown argument \`$1'" >&2
exit 1
;;
esac
# dh_installdeb will replace this with shell code automatically
# generated by other debhelper scripts.
#DEBHELPER#
exit 0

View file

@ -0,0 +1,2 @@
uppsrc usr/share/upp/uppsrc
copyright usr/share/doc/upp

View file

@ -0,0 +1,7 @@
version=3
# nightly builds
http://code.google.com/p/upp-mirror/downloads/list?can=1 .*/upp-x11-src-(.*)\.tar\.gz
# stable release
#http://sf.net/upp/upp-x11-src-(.*)\.tar\.gz

34
uppbox/lpbuild2/dput.cfg Normal file
View file

@ -0,0 +1,34 @@
[upp-oneiric]
fqdn = ppa.launchpad.net
method = ftp
incoming = ~dolik-rce/uppnightly/ubuntu/oneiric
login = anonymous
allow_unsigned_uploads = 0
[upp-natty]
fqdn = ppa.launchpad.net
method = ftp
incoming = ~dolik-rce/uppnightly/ubuntu/natty
login = anonymous
allow_unsigned_uploads = 0
[upp-maverick]
fqdn = ppa.launchpad.net
method = ftp
incoming = ~dolik-rce/uppnightly/ubuntu/maverick
login = anonymous
allow_unsigned_uploads = 0
[upp-lucid]
fqdn = ppa.launchpad.net
method = ftp
incoming = ~dolik-rce/uppnightly/ubuntu/lucid
login = anonymous
allow_unsigned_uploads = 0
[upp-karmic]
fqdn = ppa.launchpad.net
method = ftp
incoming = ~dolik-rce/uppnightly/ubuntu/karmic
login = anonymous
allow_unsigned_uploads = 0

67
uppbox/lpbuild2/lpbuild.sh Executable file
View file

@ -0,0 +1,67 @@
#!/bin/sh
# PRODUCTION CONFIGURATION
GPG_PROG="/home/upp/bin/gpg-extpass" # what program to use for signing (here a wrapper that supplies passphrase)
GPG_KEY="0CE4194D" # gpg key fingerprint to use
TMP="~/upp.tmp" # path for temporary files
SRCDIR="~/upp.tmp/u" # where to look for source tarball
## DEBUG CONFIGURATION
#GPG_PROG="/usr/bin/gpg-extpass"
#GPG_KEY="13A907FC"
#TMP="/tmp/upp"
#SRCDIR="/home/h"
set -e
version="$(ls $SRC/upp-x11-src-*.tar.gz | sed '$s/.*upp-x11-src-\([0-9]*\)[.]tar[.]gz/\1/')"
tmp="$TMP/upp-$version"
if [ ! "$version" ]; then
echo "Source tarball not found in $SRC!"
exit 1
elif [ -d "$tmp" ]; then
echo "Version $version was already built once!"
echo " (If you are trying to build it again on purpose,"
echo " delete directory '$tmp' manually)"
exit 1
fi
dists="karmic lucid maverick natty oneiric"
scriptpath="$(cd ${0%/*} 2>/dev/null || true; echo $PWD/${0##*/})"
scriptdir="$(dirname $scriptpath)"
src="$SRCDIR/upp-x11-src-$version.tar.gz"
rm -rf "$TMP"
mkdir -p "$tmp"
cp -r "$scriptdir/debian" "$tmp/debian"
for f in Makefile mkfile copyright theide.1 theide.desktop; do
cp "$scriptdir/$f" "$tmp/$f"
done
[ "$1" = "stable" ] && sed -i '/code.google/s/^/#/;/sf.net/s/^#//;' "$tmp/debian/watch"
ln -s "$src" "$TMP/upp_$version.orig.tar.gz"
cd $tmp
tar -xzf "$TMP/upp_$version.orig.tar.gz"
mv "$tmp/upp-x11-src-$version"/{bazaar,examples,reference,tutorial,uppsrc} "$tmp/"
rm -r "$tmp/upp-x11-src-$version"
set +e
for dist in $dists; do
distver=$version-0~$dist"0"
cat > "debian/changelog" << EOF
upp ($distver) $dist; urgency=low
* Updated to SVN version $version
* See http://www.ultimatepp.org/redmine/projects/upp/repository for complete
and detailed list of changes.
-- Jan Dolinar <dolik.rce@seznam.cz> `date -R`
EOF
[ "$skiporig" ] || dpkg-source --commit . packaging packaging.patch
dpkg-buildpackage -d -S -k$GPG_KEY -m'Jan Dolinar <dolik.rce@seznam.cz>' -sgpg -p$GPG_PROG $skiporig
dput -c "$scriptdir/dput.cfg" "upp-$dist" "../upp_"$distver"_source.changes"
skiporig="-sd"
done

576
uppbox/lpbuild2/mkfile Executable file
View file

@ -0,0 +1,576 @@
########################################################################
# __ __ __ ____ __ __ __ __ ____ ___ _ _ #
# ( )( )( ) (_ _)( )( \/ ) ( )(_ _)( _) _( )_ _( )_ #
# )(__)( )(__ )( )( ) ( /__\ )( ) _) (_ _)(_ _) #
# \____/ (____)(__) (__)(_/\/\_)(_)(_)(__) (___) (_) (_) #
# ___ ___ __ __ __ ___ _ _ __ ___ _ _ #
# ( _)( ,) ( ) ( \/ )( _)( \/\/ )/ \ ( ,) ( )/ ) #
# ) _) ) \ /__\ ) ( ) _) \ /( () ) ) \ ) \ #
# (_) (_)\_)(_)(_)(_/\/\_)(___) \/\/ \__/ (_)\_)(_)\_) #
# __ __ __ _ _ ___ ___ __ __ ___ #
# ( \/ ) ( ) ( )/ )( _)( _)( )( ) ( _) #
# ) ( /__\ ) \ ) _) ) _) )( )(__ ) _) #
# (_/\/\_)(_)(_)(_)\_)(___)(_) (__)(____)(___) #
# #
########################################################################
############################## USAGE ###################################
# This makefile is controlled through a set of variables, similar to #
# any other makefile. The prefered way to change them is via command #
# line, e.g.: make "PKG=ide usvn" CC=g++ #
# #
# All of the variables that can control the bahaviour are listed below #
# in DEFAULTS section. Also their default value is shown here. #
# #
# For boolean type of variables, values of y, Y, yes, YES, Yes, true, #
# True, TRUE, T, t, 1, on, On, ON and @ are considered true. Anything #
# else is evaluated as false. #
############################# TARGETS ##################################
# This makefile defines four targets that are meant to be used by user #
# from the command line: #
# #
# all - builds all (default if any packages are selected) #
# help - shows this help (default if no packages are selected) #
# clean - deletes OBJDIR #
# export - exports preparsed Makefile to file EXPORT #
############################# EXAMPLES #################################
# Typical usage: #
# make PKG=ide FLAGS="GUI MT" #
# More complicated usage: #
# make PKG="ide UWord Bombs" FLAGS="GUI GCC NOGTK" VERBOSE=y #
# Building "theide" instead of "ide": #
# make PKG=ide BINPREFIX=bin/the #
# Export makefile with full dependencies: #
# make export PKG=ide FAST=n #
# Show help: #
# make OR make help #
# Simulation mode: #
# make PKG=ide SIMULATE=y #
# Silent mode: #
# make PKG=ide SILENT=y #
# Paralel compilation (3 paralel processes): #
# make PKG=ide JOBS=3 #
############################# DEFAULTS #################################
# List of packages to build (space separated). #
# If empty, this help text will be shown. #
PKG=
# Paths where to look for packages. #
NESTS=bazaar examples reference tutorial uppsrc
# Flags as in TheIDE.
# The only difference is, that if you use SPEED or SIZE flag, then #
# the application will be optimized for Speed or Size, respectively. #
# Flags STATIC and ALLSHARED will determine the linking mode. #
FLAGS=GCC
# Additional include paths for compiler (without leading "-I"). #
INCPATHS:=
# Paths to libraries for linker. #
LIBPATHS:=
# Directory to store intermediate object files #
OBJDIR:= _out
# Extension added to resulting executables #
BINEXT:=
# Prefix for resulting binaries. Usually used with "/" at the end, #
# to specify the directory (hence the name) #
BINPREFIX:=bin/
# ar command #
AR:= ar -src
# C compiler command #
CC:= c++
# C++ compiler command #
CXX:=$(CC)
# Options for C compiler #
CFLAGS:=
# Options for C++ compiler #
CXXFLAGS:=
# Options for linker #
LDFLAGS:=-Wl,--gc-sections -Wl,-s -Wl,-O,2
# Additional options for speed optimization #
SPEEDFLAGS:=-O3 -ffunction-sections -fdata-sections
# Additional options for size optimization #
SIZEFLAGS:=-Os -finline-limit=20 -ffunction-sections -fdata-sections
# Platform flag, added to FLAGS #
PLATFORM:=$(shell uname | tr a-z A-Z) POSIX
# Suppress all messagges #
SILENT:=
# Print each executed command #
VERBOSE:=
# Print each executed command, prepended with "SIMULATE: ", without #
# actually executing it. #
SIMULATE:=
# Do not make full dependency scan (using gcc -M switch). #
# This saves a lot of time and usually doesn't make any harm. #
# FAST mode must by turned on only if you modified include files (*.h, #
# *.lay, ...) without modifying the *.c/cpp files that include them. #
FAST:=y
# Add flags from based on mainconfig section (not implemented yet) #
USEMAINCFG:=
# Number of parallel jobs to use (like "make -jN" option). #
# The JOBS variable must be used instead of -j option (as -j would not #
# work as expected). Default value is the number of cores (if it is #
# possible to detect) or 1. #
JOBS:=$(shell echo /sys/devices/system/cpu/cpu[0-9] | wc -w || echo 1)
# External parser to use instead of the contained one. Also used #
# for manipulation with the internal parser (see update-parser, #
# and export-parser targets in this Makefile for details). #
PARSER:=
# Exported makefile (used only with export target) #
# If multiple packages are being exported, each produces additional #
# Makefile, which name is EXPORT.package_name #
EXPORT:=Makefile.export
# Awk binary. Used only for export. #
AWK:=awk
########################################################################
# HELP END
ifeq ($(filter 3.8%, $(MAKE_VERSION)), )
$(error This Makefile only supports GNU make version 3.80 and newer)
endif
# no need to parse dependencies just to clean up or to read help etc.
ifeq ($(MAKECMDGOALS),clean)
skip-parse:=y
endif
ifeq ($(MAKECMDGOALS),help)
skip-parse:=y
endif
ifeq ($(MAKECMDGOALS),export)
skip-parse:=y
endif
ifeq ($(PKG),)
skip-parse:=y
endif
# Determine the name of this Makefile
filename:=$(word $(words $(MAKEFILE_LIST)),$(MAKEFILE_LIST))
# Helper functions to put variables on cmdline
pass-var= "$1=$$($1)"
export-var= "$1=$($1)"
# list of user variables to pass to child processes
cmdline-vars=NESTS FLAGS INCPATHS LIBPATHS OBJDIR BINEXT BINPREFIX AR CC CXX\
CFLAGS CXXFLAGS LDFLAGS SPEEDFLAGS SIZEFLAGS PLATFORM\
SILENT VERBOSE SIMULATE FAST USEMAINCFG
L:=(
R:=)
CONFIRM=y Y yes YES Yes true True T TRUE t 1 on On ON @
confirm=$(filter $(strip $1),$(CONFIRM))
# verbose/silent/fast mode switches
S:=$(call confirm,$(SILENT))
M:=$(if $(call confirm,$(VERBOSE)),,@)
M:=$(if $(call confirm,$(SIMULATE)),@echo SIMULATE: ,$M)
F:=$(call confirm,$(FAST))
# echo a string if silent mode is not on
echo=$(if $S,,@echo $1)
ifneq ($(skip-parse),y)
flags:=$(sort $(FLAGS) $(PLATFORM))
CINC:=$(foreach d,$(NESTS) $(INCPATHS), -I$d) -I/usr/include/freetype2 -I/usr/include/gtk-2.0 -I/usr/local/include/gtk-2.0 -I/usr/include/glib-2.0 -I/usr/local/include/glib-2.0 -I/usr/lib/glib-2.0/include -I/usr/local/lib/glib-2.0/include -I/usr/lib/gtk-2.0/include -I/usr/local/lib/gtk-2.0/include -I/usr/include/cairo -I/usr/include/pango-1.0 -I/usr/include/atk-1.0 -I/usr/X11R6/include -I/usr/X11R6/include/freetype2 -I/usr/X11R6/include/gtk-2.0 -I/usr/X11R6/include/glib-2.0 -I/usr/X11R6/lib/glib-2.0/include -I/usr/X11R6/lib/gtk-2.0/include -I/usr/X11R6/include/cairo -I/usr/X11R6/include/pango-1.0 -I/usr/X11R6/include/atk-1.0 -I/usr/local/include/cairo -I/usr/local/include/pango-1.0 -I/usr/local/include/atk-1.0 -I/usr/local/include -I/usr/local/include/libpng -I/usr/include/gdk-pixbuf-2.0 -I/usr/lib/i386-linux-gnu/glib-2.0/include -I/usr/lib/x86_64-linux-gnu/glib-2.0/include -I/usr/lib/i386-linux-gnu/gtk-2.0/include -I/usr/lib/x86_64-linux-gnu/gtk-2.0/include -I/usr/include/gtk-3.0/gdk
LIBPATH:=$(foreach d,$(LIBPATHS), -L$d) -L/usr/X11R6/lib -L/usr/lib -L/usr/local/lib
needed-dirs:=
begin-group:=-Wl,--start-group
end-group:=-Wl,--end-group
# MacOsX specific things
ifeq ($(filter $(PLATFORM),DARWIN),DARWIN)
begin-group:=
end-group:=
endif
# Return true, if package $2 is to be compiled with flag $1
has-flag=$(filter $1,$2)
#Join array with "_"
concatenate=$(strip $(if $1,$(if $(filter $(words $1),1),$1,\
$(firstword $1)_$(call concatenate,$(wordlist 2,$(words $1),$1)))))
# Return output directory for .o files, based on pkg name and flags
objdir=$(OBJDIR)/$1/$(call concatenate,$($1_FLAGS))
# prepare output directories targets
define create-dir
needed-dirs+= $1
$1:
$(call echo," Creating directory $1 ...")
$Mmkdir -p $1
endef
needs-dir=$(if $(filter $(needed-dirs),$1),,$(eval $(call create-dir,$1))) $1
# get dependencies recursively
get-deps=$(strip $(foreach p,$($1_USES),$(call get-deps,$p)) $1)
# Compiler commands
compiler-cpp=$(CXX) -c -x c++ $(CXXFLAGS)
compiler-c=$(CC) -c -x c $(CFLAGS)
analyze-info=$(if $S,, Analyzing $1 dependencies ...)
includes-fetcher-c=$(info $(analyze-info))$(CC) -M -x c $(CXXFLAGS)
includes-fetcher-cpp=$(info $(analyze-info))$(CC) -M -x c++ $(CFLAGS)
# file counting utilities for progress reports
C:=$(OBJDIR)/.make_counter
incrementor:=while ! ln -s -T '$C' '$C_lock' 2>/dev/null;do true; done; echo -n $$$$(($$$$(cat '$C')+1))>'$C';cat '$C'; rm $C_lock;
counter-beg:=c=0; for f in
counter-end:=; do [ -e $$f ] && c=$$(($$c+1)); done; echo $$c;
# general target scheme (args:{deps,target,pkg,lang,flags}
define compile
$2: $(if $F,$($3_NEST)/$1,$(dir $2)$(shell $(includes-fetcher-$4) $5 $(CINC) $($3_MACRO) $($3_NEST)/$1 |tr -d '\\\\' | sed 's/^[^:]*://')) | $(call needs-dir,$(dir $2))
$(call echo," Compiling $1 $Lflags $(strip $($3_FLAGS))$R ["`$(incrementor)`"/$(file-num)] ...")
$M$(compiler-$4) $5 $(CINC) $($3_MACRO) $($3_NEST)/$1 -o $2
$(EMPTYLINE)
endef
#compile .cpp/.c/.icpp into .o/.io
compile-cpp=$(call compile,$1,$2,$3,cpp,)
compile-c=$(call compile,$1,$2,$3,c,)
compile-icpp=$(call compile,$1,$2,$3,cpp,)
# ditto with speed optimization
compile-cpp-speed=$(call compile,$1,$2,$3,cpp,$(SPEEDFLAGS))
compile-c-speed=$(call compile,$1,$2,$3,c,$(SPEEDFLAGS))
compile-icpp-speed=$(call compile,$1,$2,$3,cpp,$(SPEEDFLAGS))
# ditto with size optimization
compile-cpp-size=$(call compile,$1,$2,$3,cpp,$(SIZEFLAGS))
compile-c-size=$(call compile,$1,$2,$3,c,$(SIZEFLAGS))
compile-icpp-size=$(call compile,$1,$2,$3,cpp,$(SIZEFLAGS))
# call appropriate compile functions for all files
define compile-all
$(if $(call has-flag,SPEED,$($1_FLAGS)),\
$(foreach f,$($1_FILES_CPP) $($1_FILES_CPP_SPEED) $($1_FILES_CPP_SIZE),$(call compile-cpp-speed,$1/$f,$($1_OBJDIR)/$(basename $f).o,$1))\
$(foreach f,$($1_FILES_C) $($1_FILES_C_SPEED) $($1_FILES_C_SIZE),$(call compile-c-speed,$1/$f,$($1_OBJDIR)/$(basename $f).o,$1))\
$(foreach f,$($1_FILES_ICPP) $($1_FILES_ICPP_SPEED) $($1_FILES_ICPP_SIZE),$(call compile-icpp-speed,$1/$f,$($1_OBJDIR)/$(basename $f).io,$1))\
,$(if $(call has-flag,SIZE,$($1_FLAGS)),\
$(foreach f,$($1_FILES_CPP) $($1_FILES_CPP_SPEED) $($1_FILES_CPP_SIZE),$(call compile-cpp-size,$1/$f,$($1_OBJDIR)/$(basename $f).o,$1))\
$(foreach f,$($1_FILES_C) $($1_FILES_C_SPEED) $($1_FILES_C_SIZE),$(call compile-c-size,$1/$f,$($1_OBJDIR)/$(basename $f).o,$1))\
$(foreach f,$($1_FILES_ICPP) $($1_FILES_ICPP_SPEED) $($1_FILES_ICPP_SIZE),$(call compile-icpp-size,$1/$f,$($1_OBJDIR)/$(basename $f).io,$1))\
,\
$(foreach f,$($1_FILES_CPP),$(call compile-cpp,$1/$f,$($1_OBJDIR)/$(basename $f).o,$1))\
$(foreach f,$($1_FILES_C),$(call compile-c,$1/$f,$($1_OBJDIR)/$(basename $f).o,$1))\
$(foreach f,$($1_FILES_ICPP),$(call compile-icpp,$1/$f,$($1_OBJDIR)/$(basename $f).io,$1))\
$(foreach f,$($1_FILES_CPP_SPEED),$(call compile-cpp-speed,$1/$f,$($1_OBJDIR)/$(basename $f).o,$1))\
$(foreach f,$($1_FILES_C_SPEED),$(call compile-c-speed,$1/$f,$($1_OBJDIR)/$(basename $f).o,$1))\
$(foreach f,$($1_FILES_ICPP_SPEED),$(call compile-icpp-speed,$1/$f,$($1_OBJDIR)/$(basename $f).io,$1))\
$(foreach f,$($1_FILES_CPP_SIZE),$(call compile-cpp-size,$1/$f,$($1_OBJDIR)/$(basename $f).o,$1))\
$(foreach f,$($1_FILES_C_SIZE),$(call compile-c-size,$1/$f,$($1_OBJDIR)/$(basename $f).o,$1))\
$(foreach f,$($1_FILES_ICPP_SIZE),$(call compile-icpp-size,$1/$f,$($1_OBJDIR)/$(basename $f).io,$1))\
))
endef
ifeq ($(single-package),y)
# prepare some variables neccesary early in the build process
define prep
$(eval $1_FLAGS:=$(sort $($1_FLAGS) $(if $($1_SPEED),SPEED,$(if $($1_SIZE),SIZE,))))
$1_MACRO:=$(foreach f,$($1_FLAGS), -Dflag$f)
$1_OBJDIR:=$(call objdir,$1)
endef
# compile all .c/cpp files in package $1 and create .a
define build
$(eval $1_OBJFILES:=$(foreach f,$($1_FILES_CPP) $($1_FILES_CPP_SPEED) $($1_FILES_CPP_SIZE) $($1_FILES_C) $($1_FILES_C_SPEED) $($1_FILES_C_SIZE),$($1_OBJDIR)/$(basename $f).o))
$(eval $1_IOBJFILES:=$(foreach f,$($1_FILES_ICPP) $($1_FILES_ICPP_SPEED) $($1_FILES_ICPP_SIZE),$($1_OBJDIR)/$(basename $f).io))
$($1_OBJDIR)/$(notdir $1.a): $($1_OBJFILES)
$(call echo," Creating archive $$@ ...")
$M$(AR) $$@ $($1_OBJFILES)
$(eval $(call compile-all,$1))
endef
# create target to link libraries into executable
define link
$(eval ARCHIVES:=$(strip $(foreach u,$(ALLDEPS),$($u_IOBJFILES)) $(foreach u,$(ALLDEPS_),$($u_OBJDIR)/$(notdir $u.a))))
$(eval ALLLIBS:=$(sort $(foreach u,$(ALLDEPS_),$(foreach l,$($u_LIBS), -l$l))))
$(shell mkdir -p $(OBJDIR);rm -f $C_lock; echo -n `$(counter-beg) $(sort $(IOBJFILES) $(foreach u,$(ALLDEPS),$($u_OBJFILES))) $(counter-end)` > '$C')
$(BINPREFIX)$1$(BINEXT): $(ARCHIVES) $(call needs-dir,$(dir $(BINPREFIX)))
$(call echo," Linking $$@ ...")
$M$(CXX) -o $$@ $(if $(call has-flag,ALLSHARED,$($1_FLAGS)),-shared,$(if $(call has-flag,STATIC,$1),-static,)) $(LIBPATH) $(LDFLAGS) $(begin-group) $(ARCHIVES) $(ALLLIBS) $(end-group)
endef
endif # single-package
# call make to parse, compile and build package $1
define make-pkg
.PHONY: $1
$1:
$(if $(call confirm,$(SIMULATE)),@echo -n "SIMULATE: ";,)
$(if $(call confirm,$(SIMULATE)),,$M)+-\
$(MAKE) -Rrf $(filename) $(if $(JOBS),-j$(JOBS) ,)--no-p PKG=$1 single-package=y $(foreach v,$(cmdline-vars),$(call pass-var,$v))
endef
.PHONY: default
default: all
# create targets for the main tasks
define main-targets
.PHONY: all start export
all: $(if $(single-package),start $(BINPREFIX)$(PKG)$(BINEXT),$(PKG))
$(call echo,"$(if $(single-package), Package $(PKG),Everything) done.")
start:
$(call echo," Building package $(PKG)$(if $($(PKG)_DESC), [$($(PKG)_DESC)],) ($(file-num) files in $(words $(ALLDEPS)) packages, flags: $($(PKG)_FLAGS))")
endef
endif # if skip-parse
# create target to export makefile for package $1
define export-pkg
export_$1:
$(if $(call confirm,$(SIMULATE)),@echo -n "SIMULATE: ";,)
$(if $(call confirm,$(SIMULATE)),,$M)+-\
$(MAKE) -rRf $(filename) --no-p single-package=y "EXPORT=$(EXPORT).$(subst /,_,$1)" PKG=$1 $(foreach v,$(cmdline-vars),$(call pass-var,$v)) export
endef
# create targets for help, clean up, export and developper targets
define additional-targets
.PHONY: help clean
help:
@sed '/HELP.END/{s/.*//;q;}' $(filename)
clean:
$(call echo,Deleting $(OBJDIR))
$M rm -rf $(OBJDIR) || true
#For developers:
# print the parser to stdout (usage: make export-parser)
print-parser:
@sed -n 's/^#://p;' $(filename)
# print the parser to PARSER (usage: make export-parser PARSER=parser.sh)
export-parser:
@sed -n 's/^#://p;' $(filename) > $(PARSER)
# load $(PARSER) into this Makefile (usage: make update-parser PARSER=parser.new > Makefile.new)
update-parser:
@sed -n '/^#:/!s/.*/&/p;' $(filename)
@sed 's/.*/#:&/;' $(PARSER)
endef
#create export target
ifeq ($(words $(strip $(PKG))),1)
define export-targets
export:
$(call echo," Exporting makefile for package $(PKG) to $(EXPORT) ...")
$Mecho ".PHONY:default" > $(EXPORT)
$Mecho "default: all" >> $(EXPORT)
$M$(MAKE) -RrpqBf $(filename) default "PKG=$(PKG)" single-package=y exporting=y $(foreach v,$(cmdline-vars),$(call export-var,$v)) \
|sed -n '/^. Files/,$$$${/^[\x23]/!{/.c[p]*:$$$$/!H}};$$$${g;p;}'\
>> '$(EXPORT)'
# |sed -n '/^. Files/,$$$${/^[\x23]/!{/:$$$$/!H}};$$$${g;p;}'\
endef
else
define export-targets
export: $(foreach p,$(PKG),$(eval $(call export-pkg,$p)) export_$p)
$(call echo,"Exporting control makefile to $(EXPORT)")
$Mecho -n all:>'$(EXPORT)'
$Mecho -n "$(foreach p,$(PKG),\n $M+-$(MAKE) --no-p -f $(EXPORT).$(subst /,_,$p);)">>'$(EXPORT)'
endef
endif
# clean-out the default rules SUFFIXES, we manage everything based on upp files
.SUFFIXES:
ifneq ($(skip-parse),y)
ifeq ($(single-package),y)
# Parse the upp files
JOBS:=$(strip $(JOBS))
ifeq ($(JOBS),1)
$(if $S,,$(info Using 1 parallel job ...))
else
$(if $S,,$(info Using $(JOBS) parallel jobs ...))
endif
$(if $S,,$(info Parsing package files needed for $(PKG) ...))
ifeq ($(PARSER),)
$(eval $(shell sed -n 's/^#://p;' $(filename) | sh -s '$(PKG)' '$(NESTS)' '$(flags)'))
else
$(eval $(shell sh $(PARSER) '$(PKG)' '$(NESTS)' '$(flags)'))
endif
$(eval $(PKG)_FLAGS+=MAIN)
$(eval ALLDEPS_:=$(call get-deps,$(PKG)))
$(eval ALLDEPS:=$(sort $(ALLDEPS_)))
$(eval file-num:=$(words $(foreach p,$(ALLDEPS),$($p_FILES_CPP) $($p_FILES_ICPP) $($p_FILES_C) $($p_FILES_CPP_SPEED) $($p_FILES_ICPP_SPEED) $($p_FILES_C_SPEED) $($p_FILES_CPP_SIZE) $($p_FILES_ICPP_SIZE) $($p_FILES_C_SIZE))))
$(foreach p,$(ALLDEPS),$(eval $(call prep,$p)))
endif # single-package
# Call link on main package and create all directories
# and build targets needed for current task
# OR
# run makefile for each package from $(PKG)
$(if $(single-package),\
$(foreach p,$(ALLDEPS),$(eval $(call build,$p)))\
$(eval $(call link,$(PKG))),\
$(foreach p,$(PKG),$(eval $(call make-pkg,$p))))
endif # not skip-parse
$(eval $(main-targets))
ifneq ($(exporting),y)
$(eval $(additional-targets))
$(eval $(export-targets))
endif
# Everything marked with '#:' is a shell script used to parse .upp files
#:NESTS="$2"
#:FLAGS="$3"
#:
#:# GENERAL FUNCTIONS
#:FindUpp(){
#: pkg=`/bin/echo "$1" | sed -e 's|.*/||;'`
#: for n in $NESTS
#: do
#: if [ -f "$n/$1/$pkg.upp" ]
#: then
#: FILE="$n/$1/$pkg.upp"
#: NEST="$n"
#: return
#: fi
#: done
#:}
#:PrintFiles() {
#: local files="$1"
#: shift
#: local s
#: while [ "x" != "x$1" ]
#: do
#: s=$s"/[.]"$2"\$/ {s/[.]"$2"\$/."$3"/;s|\"||g;s|^[ ]*||g;s|[ ]*\$||g;s|.*|\$(eval "$PKG"_"$1"+=&)|p;};"
#: shift 3
#: done
#: /bin/echo "$files" | sed -n -e "$s"
#:}
#:Pop(){
#: /bin/echo "$1"
#:}
#:Shift(){
#: shift
#: /bin/echo "$@"
#:}
#:
#:# SED PARSERS
#:# WARNING: Don't try to fix the ugly looking syntax of sed scripts - it is
#:# neccesary to make it work with BSD sed!
#:#
#:# Parser for booleans
#:p="/^description/! {"
#:# change (..(..)..) to (..[..]..)
#:p=$p"
#::a;
#:s/(\(.*\)(\([^()]*\))\(.*\))/(\1[\2]\3)/
#:t a;
#:"
#:# change (...) to ([...])
#:p=$p"s/(\(.*\))/([\1])/g;"
#:# delete spaces on left ...
#:p=$p":b;
#:s/\[\([^ ]*\)[ ][ ]*\([&|]\)\(.*\)\]/[\1\2\3]/;"
#:# ... and right side of operator
#:p=$p"s/\[\([^ ]*\)\([&|]\)[ ][ ]*\(.*\)\]/[\1\2\3]/;
#:t b;
#:"
#:# insert implicit &
#:p=$p":c;
#:s/\[\([a-zA-Z0-9_!&|]*\)[ ][ ]*\(.*\)\]/[\1\&\2]/;
#:t c;
#:"
#:# place {} around flags
#:p=$p"s/\([![&|]\)\([a-zA-Z0-9_][a-zA-Z0-9_]*\)/\1{\2}/g;"
#:# evalualte flags
#:p=$p"s/{\([^{}]*\)}/{\$(call has-flag,\1,$FLAGS)}/g;"
#:# evaluate negations
#:p=$p":d;
#:s/!{\([^{}]*\)}/{\$(if \1,,T)}/g;"
#:# evaluate ANDs
#:p=$p"s/{\([^{}]*\)}&{\([^{}]*\)}/{\$(call and,\1,\2)}/g;"
#:# evaluate ORs
#:p=$p"s/{\([^{}]*\)}|{\([^{}]*\)}/{\$(call or,\1,\2)}/g;"
#:# remove [] around already evaluated statements
#:p=$p"s/\[\({[^{}]*}\)\]/\1/g;
#:t d;
#:"
#:p=$p"s/({\([^{}]*\)})\(.*\)/\$(if \1,\2,)/g;
#:}"
#:
#:# File list parser
#:# strip quotes
#:f="s/\"//g;"
#:# remove separators
#:f=$f"s/,[ ]*[^,]*separator[ ]*,/,/g;"
#:# file.cpp optimize_xyz -> file.cpp_xyz
#:f=$f"s/,[ ]*\([^ ,]*\)[ ]*optimize_/,\1_/g;"
#:# drop modificators (charset, readonly, highlight, tabsize, font, ...)
#:f=$f"s/,[ ]*\([^ ,][^ ,]*\)[^,]*/,\1/g;"
#:# convert \ -> / and print
#:f=$f's/\\/\//g;p;'
#:
#:# Simple sections parser
#:# note: charset and blitz are ignored
#:Simples() {
#: /bin/echo "$2" | sed -n -e '
#: /^library[ ]*/ {s/^library[ ]*//;'"s|\"||g;s|^[ ]*||g;s|[ ]*\$||g;s|.*|\$(eval $1"_"LIBS+=&)|;p;};"'
#: /^link[ ]*/ {s/^link[ ]*//;'"s|\"||g;s|^[ ]*||g;s|[ ]*\$||g;s|.*|\$(eval $1"_"LINK+=&)|;p;};"'
#: /^acceptflags[ ]*/ {s/^acceptflags[ ]*//;'"s|\"||g;s|^[ ]*||g;s|[ ]*\$||g;s|.*|\$(eval $1"_"ACCEPT+=&)|;p;};"'
#: /^mainconfig[ ]*/ {s/^mainconfig[ ]*//;'"s|\"||g;s|^[ ]*||g;s|[ ]*\$||g;s|.*|\$(eval $1"_"CFG+=&)|;p;};"'
#: /^target[ ]*/ {s/^target[ ]*//;'"s|\"||g;s|^[ ]*||g;s|[ ]*\$||g;s|.*|\$(eval $1"_"TARGET+=&)|;p;};"'
#: /^include[ ]*/ {s/^include[ ]*//;'"s|\"||g;s|^[ ]*||g;s|[ ]*\$||g;s|.*|\$(eval $1"_"INC+=&)|;p;};"'
#: /^options[ ]*/ {s/^options[ ]*//;'"s|\"||g;s|^[ ]*||g;s|[ ]*\$||g;s|.*|\$(eval $1"_"OPTS+=&)|;p;};"'
#: /^flags[ ]*/ {s/^flags[ ]*//;'"s|\"||g;s|^[ ]*||g;s|[ ]*\$||g;s|.*|\$(eval $1"_"FLAGS+=&)|;p;};"
#:}
#:
#:# THE MAIN PARSER FUNCTION
#:Parse(){
#: PKG="$1"
#: FindUpp "$PKG"
#: /bin/echo '$(eval '$package'_NEST:='$NEST')'
#: /bin/echo '$(eval '$package'_FLAGS+='$FLAGS')'
#:
#: if [ -z "$FILE" ]
#: then
#: /bin/echo "ERROR: Package $PKG not found!"
#: exit 1
#: fi
#: # get the .upp contents, parse the boolean expresions and translate them to the language of make
#: UPP=`cat $FILE | tr "\n\r;" " \n" | sed -e "s/^[ ]*//g;s/[ ]*\$//g;s/[ ][ ]*/ /g; $p"`
#:# FILE SECTION PARSER
#: FILES=`/bin/echo "$UPP" | sed -n -e '/^'file'[ ]*/ {s/^'file'[ ]*//;s/.*/, & ,/;'"$f}" | tr "," "\n";`
#: PrintFiles "$FILES" \
#: FILES_CPP cpp cpp \
#: FILES_CPP_SPEED cpp_speed cpp \
#: FILES_CPP_SIZE cpp_size cpp \
#: FILES_ICPP icpp icpp \
#: FILES_ICPP_SPEED icpp_speed icpp \
#: FILES_ICPP_SIZE icpp_size icpp \
#: FILES_C c c \
#: FILES_C_SPEED c_speed c \
#: FILES_C_SIZE c_size c
#:# DESCRIPTION SECTION PARSER
#: /bin/echo "$UPP" | sed -n -e '/^'description'[ ]*/{s/^'description'[ ]*//;s/^"\(.*\)"$/\1/;s/\\[^ ]*$//;'"s|\"||g;s|^[ ]*||g;s|[ ]*\$||g;s|.*|\$(eval "$PKG"_DESC=&)|p;}"
#:# USES SECTION PARSER
#: USES=$( /bin/echo "$UPP" | sed -n -e '/^'uses'[ ]*/{s/^'uses'[ ]*//;s/\\/\//g;/^\$/!s/[ ]*,[ ]*/ /g;p;}' )
#: /bin/echo "$USES" | sed -e "s|\"||g;s|^[ ]*||g;s|[ ]*\$||g;s|.*|\$(eval "$PKG"_USES+=&)|;"
#:# GLOBAL OPTIMIZATION FLAGS PARSER
#: /bin/echo "$UPP" | sed -n -e 's|^optimize_speed[ ]*|$(eval '"$PKG"'_SPEED=T)|p;
#: s|^optimize_size[ ]*|$(eval '"$PKG"'_SIZE=T)|p;'
#:# SIMPLE SECTIONS PARSERS
#: Simples "$PKG" "$UPP"
#:}
#:
#:# MAIN LOOP
#:NEEDED="$1"
#:PARSED=""
#:while [ -n "$NEEDED" ]
#:do
#: package=`Pop $NEEDED`
#: NEEDED=`Shift $NEEDED`
#: Parse $package;
#: PARSED="$PARSED $package"
#: uses=$( /bin/echo "$USES" | sed -e 's/\\/\//g;/^\$(/{s/.*, \([^, ]*\),[)]*$/\1/;}' )
#: for dep in $uses
#: do
#: if [ -z "`/bin/echo " $NEEDED $PARSED " | grep " $dep "`" ]
#: then
#: NEEDED="$NEEDED $dep"
#: fi
#: done
#:done;
#:#
#:/bin/echo '$(eval PARSED:='"$PARSED"')'

180
uppbox/lpbuild2/theide.1 Normal file
View file

@ -0,0 +1,180 @@
.\" Process this file with command
.\" groff -man -Tascii theide.1
.\"
.TH THEIDE 1 TheIDE " " TheIDE
.SH NAME
theide \(hy A good integrated development environment,
designed for developing large C++ applications.
.SH SYNOPSIS
.B theide
.br
.BI "theide " "assembly package"
.br
.BI "theide " "assembly package build_method"
.RB "[" \-options "] [" >FLAG [ ,FLAG ]...]
.RI [ out ]
.LP
The first method starts TheIDE with a Package selection dialog,
the second method directly opens
.IR package " from " assembly
and third one allows you to build or export specified project according
to the supplied parameters. The last method does not open TheIde
but causes it to work in console mode.
.SH DESCRIPTION
TheIDE
is U++ integrated development environment which introduces modular
concepts to C++ programming. It features
.I BLITZ-build
technology to speedup C++ rebuilds up to 4 times, visual designers
for U++ libraries,
.I Topic++
system for documenting code and creating rich text
resources for applications (like help and code documentation)
and
.I Assist++
\(hy a powerful C++ code analyzer that provides features
like code completion, navigation and transformation.
TheIDE integrates with compiler and debugger
.RB "(by default " gcc "(1) and " gdb (1))
and can also be used to develop non-U++ applications.
.SH OPTIONS
.IP assembly
Selects in which assembly to look for package. It must be configured
in file
.I ~/.upp/theide/assembly.var
.
.IP package
Selects which package to use. The package must exist in selected assembly.
.IP build_method
Selects build method. It must be configured in file
.I ~/.upp/theide/build_method.bm
.
.LP
.IP FLAGs
Specify witch flags should be set up. This works the same way as inside
TheIDE. The FLAGs must be separated by commas and first and prepended
with ">" character. Please note, that ">" has special meaning in most
shells and therefore you must either escape it or enclose in quotation
marks.
.LP
Parameter
.B options
must always form single string, e.g. "\-arvs".
Please note, that some options are mutually exclusive. Don't use them
together unless you want to be surprised by the results.
.SS General options:
.RS
.IP a
Rebuild all. Cleans caches before doing anything.
.IP b
Use BLITZ.
.IP e
If building fails, stop with message box.
.IP l
Be silent.
.IP v
Be verbose.
.IP m
Create a map file.
.RE
.SS Output mode:
.RS
.IP r
Release mode.
.IP 1
Release mode \(hy optimize for size.
.IP 2
Release mode \(hy optimize for speed.
.LP
These options are mutually exclusive. If more of them is used then last
one is used. If none is used, Debug mode is assumed.
.RE
.SS Linking mode:
.RS
.IP s
Use shared libraries.
.IP S
Use shared libraries and build as shared libraries.
.LP
These options are mutually exclusive. If more of them is used then last
one is used. If none is specified, static linking is used.
.RE
.SS Exporting:
.RS
.IP x
Export files necessary to build project to the directory
.I out
.IP X
Export all files in project to directory
.I out
.IP M
Create makefile in file
.I out
.IP xM,XM
If you mix M with x or X, Makefile is exported to directory
.I out
.LP
Options x and X are mutually exclusive. The last specified is used.
.RE
.SH FILES
.I ~/.upp/theide/*.var
.RS
The assembly specifications.
.RE
.I ~/.upp/theide/*.bm
.RS
The build methods configurations.
.RE
.I ~/.upp/theide/theide.cfg
.RS
Main configuration file.
.RE
.I ~/.upp/theide/ide.colors
.RS
Configuration of colors used in TheIDE.
.RE
.I ~/.upp/theide/ide.key
.RS
Configuration of key bindings in TheIDE.
.RE
.LP
.IP NOTE:
None of these files is meant to be edited by hand. They can be created
and/or modified from within TheIDE. This is strongly recommended
since it is easier and safer.
.SH EXAMPLES
.B "theide examples UWord"
.RS
Opens UWord (an example implementation of text proccesor) in TheIDE.
.RE
.LP
.B theide examples AddressBook GCC \-vasb ">GUI,MT" /tmp/ab
.RS
Builds application AddressBook with verbose output, using
.BR gcc (1)
in debug mode, with GUI and multithreading support, links it using
shared libraries and places it in /tmp/ab.
.RE
.LP
.B theide uppsrc ide \-2sx ">GUI,MT" /tmp/ide
.RS
Exports Makefile and all the files needed to build TheIDE itself
(with speed optimizations) into the directory /tmp/ide/.
.RE
.SH BUGS
If you find any bugs, please contact the developpers on our forums (
.I http://www.ultimatepp.org/forum
) or file a bug on projects SourceForge page (
.I http://sourceforge.net/projects/upp
).
.SH AUTHORS
Mirek Fidler, Koldo Ramirez, Tomas Rylek, Daniel Kos
.SH DOCUMENTATION
Full documentation is accesible from within TheIDE
and also online on
.I http://ultimatepp.org
.

View file

@ -0,0 +1,12 @@
[Desktop Entry]
Version=1.0
Name=TheIDE
GenericName=TheIDE
Comment=IDE for cross-platform C++ development
MimeType=application/x-upp;
Exec=theide
Icon=theide.png
Terminal=false
Type=Application
Categories=Development;IDE;GUIDesigner;
StartupNotify=false