#!/bin/sh # save the program name progname=$0 # need to know common directories srcdir="@srcdir@" top_srcdir="@top_srcdir@" top_builddir=".." prefix="@prefix@" # need to know some file and library location gtkxconfig="$top_builddir/gtk+/gtk+.xconfig" libgimp="$top_builddir/libgimp/libgimp.la" libgimpui="$top_builddir/libgimp/libgimpui.la" libgtk="$top_builddir/gtk+/gtk/libgtk.la" libgdk="$top_builddir/gtk+/gdk/libgdk.la" libglib="$top_builddir/gtk+/glib/libglib.la" # print out a usage summary and exit usage () { cat <" -h Display this help message and exit. --help -s Specify a source file or files. If --source a source file is not specified the name of the source file will be determined from the name of the plugin. For example, the plugin "blur" would have the source file "blur.c" associated with it. -v Print out messages saying what is happening --verbose at each step of the build process. -n Print out commands that would be executed --nothing but don't actually execute them. -e Print the build environment and exit. --environment = Set the build environment variable tp have the value . -= Append to the build environment variable . += Prepend to the build environment variable EOF exit 0 } # initialize various variable to blank plugin= sources= verbose= environment= nothing= prev= # loop over the options for option do # if the previous option takes an argument # we take care of setting the appropriate variable # here if test -n "$prev"; then eval "$prev=\"\$$prev \$option\"" prev= continue fi case "$option" in -h|--help) usage ;; -s|--source) prev="sources" ;; -v|--verbose) verbose="true" ;; -e|--environment) environment="true" ;; -n|--nothing) nothing="true" ;; *=*) # if the option was of the form [-+]= # then we want to evaluate the argument as it # is intended to set an environment variable. # this would fairly simple, except for having to # deal with the [-+] symbols that can be prepended. # these have to be stripped off and converted into # the corresponding "post_" and "pre_" strings # respectively. opt=`echo "$option" | sed 's/=[_a-zA-Z0-9]*//'` arg=`echo "$option" | sed 's/[-+_a-zA-Z0-9]*=//'` case "$opt" in -*) opt=`echo "$opt" | sed 's/-//'` opt="post_$opt" ;; +*) opt=`echo "$opt" | sed 's/+//'` opt="pre_$opt" ;; esac eval "$opt=\$arg" ;; *) if test -z "$plugin"; then plugin="$option" else usage fi ;; esac done # get build environment variables if test ! -f $gtkxconfig; then echo "error: could not find \"$gtkxconfig\"" fi # extract the X flags from the gtk+.xconfig file X_CFLAGS=`grep X_CFLAGS $gtkxconfig | sed 's/X_CFLAGS[ \t]*=[ \t]*//'` X_LDFLAGS=`grep X_LDFLAGS $gtkxconfig | sed 's/X_LDFLAGS[ \t]*=[ \t]*//'` X_LIBS=`grep X_LIBS $gtkxconfig | sed 's/X_LIBS[ \t]*=[ \t]*//'` # we only set environment variables if they aren't already defined CC=${CC:-"$pre_CC @CC@ $post_CC"} LIBTOOL=${LIBTOOL:-"$pre_LIBTOOL $top_builddir/libtool $post_LIBTOOL"} CFLAGS=${CFLAGS:-"$pre_CFLAGS @CFLAGS@ $post_CFLAGS"} INCLUDES=${INCLUDES:-"$pre_INCLUDES $X_CFLAGS -I$top_srcdir -I$top_srcdir/gtk+ -I/usr/local/include $post_INCLUDES"} DEFS=${DEFS:-"$pre_DEFS @DEFS@ -I. -I$srcdir -I.. $post_defs"} CPPFLAGS=${CPPFLAGS:-"$pre_CPPFLAGS @CPPFLAGS@ $post_CPPFLAGS"} LDFLAGS=${LDFLAGS:-"$pre_LDFLAGS @LDFLAGS@ $post_LDFLAGS"} LDADD=${LDADD:-"$pre_LDADD $X_LDFLAGS -L/usr/local/lib $post_LDADD"} LIBS=${LIBS:-"$pre_LIBS $X_LIBS $libgimp $libgtk $libgdk $libglib -lc -lm $post_LIBS"} COMPILE=${COMPILE:-"$pre_COMPILE $CC $DEFS $INCLUDES $CPPFLAGS $CFLAGS $post_COMPILE"} LINK=${LINK:-"$pre_LINK $LIBTOOL --mode=link $CC $LDFLAGS -o $plugin $post_LINK"} # print out the environment and exit if the user specified us to do so if test -n "$environment"; then echo CC = $CC echo LIBTOOL = $LIBTOOL echo CFLAGS = $CFLAGS echo INCLUDES = $INCLUDES echo DEFS = $DEFS echo CPPFLAGS = $CPPFLAGS echo LDFLAGS = $LDFLAGS echo LDADD = $LDADD echo LIBS = $LIBS echo COMPILE = $COMPILE echo LINK = $LINK exit 0 fi # if a name for a plugin wasn't specified then nothing can be done if test -z "$plugin"; then usage fi # strip off the extension if it is present (we'll add it # back in real soon to determine the name of the source file # to use) plugin=`echo $plugin | sed 's/\.c//'` # if the user didn't specify any sources, then calculate # the source file based on the plugin name if test -z "$sources"; then sources="$plugin.c" fi # show the user what we're doing echo "plugin: $plugin" echo "sources: $sources" # compile the source files. a source file is only compiled # if either a) its object file doesn't exist or b) it is # newer than its object file. objects= for file in $sources; do objfile=`echo "$file" | sed 's/\.c/\.o/'` if test ! -f "$objfile" || test "$file" -nt "$objfile"; then cmd="$COMPILE -c $file" if test -n "$verbose"; then echo $cmd else echo "compiling $file" fi if test -z "$nothing"; then eval "$cmd" fi fi objects="$objects $objfile"; done deps="$objects $libgimp $libgtk $libgdk $libglib" # determine if the plugin needs to be linked with libgimpui. # (most plugins don't). we simply check the sources to see # if they include "gimpui.h" needlibgimpui=`grep gimpui.h $sources` if test -n "needlibgimpui"; then LIBS="$libgimpui $LIBS" deps="$deps $libgimpui" fi # determine if the plugin needs to be linked. if any of the # dependencies (objects or libraries) are newer than the plugin # or the plugin does not exist it will be built. cmd= for file in $deps; do if test ! -f "$plugin" || test "$file" -nt "$plugin"; then cmd="$LINK $objects $LDADD $LIBS" break fi done if test -n "$cmd"; then if test -n "$verbose"; then echo $cmd else echo "linking $plugin" fi if test -z "$nothing"; then eval "$cmd" fi else echo "\`$plugin' is up to date" fi