Author: stkn Date: Mon Jul 3 21:59:14 2006 New Revision: 1744 Added: freeswitch/branches/stkn/fsxs.in (contents, props changed) Log: Add initial version of fsxs, integration into autotools pending Added: freeswitch/branches/stkn/fsxs.in ============================================================================== --- (empty file) +++ freeswitch/branches/stkn/fsxs.in Mon Jul 3 21:59:14 2006 @@ -0,0 +1,306 @@ +#!/usr/bin/perl +# +# FreeSwitch fsxs +# +# (C) 2006 Stefan Knoblich <stkn@netdomination.org> + +use strict; + +# +# @FOO@ will be replaced by the freeswitch build process +# +my %vars = ( + CC => '@CC@', + LD => '@LD@', + MKDIR => '@MKINSTALLDIR@', + INSTALL => '@INSTALL@', + LIBS => '@LIBS@', + CFLAGS => '@CFLAGS@', + LDFLAGS => '@LDFLAGS@', + SOLINK => '@SOLINK@', + APR_CFLAGS => '@APR_CFLAGS@', + APR_LIBS => '@APR_LIBS@', + + MODULES_DIR => '@MODULES_DIR@' + LIB_DIR => '@LIB_DIR@', + BIN_DIR => '@BIN_DIR@', + DB_DIR => '@DB_DIR@', + CFG_DIR => '@CFG_DIR@', + PREFIX => '@PREFIX@' +); + +## example +#my %vars = ( +# CC => 'gcc', +# LD => 'gcc', +# MKDIR => 'mkdir -p', +# INSTALL => 'install', +# LIBS => '-lfreeswitch', +# CFLAGS => '-O2 -march=athlon-xp -pipe -ggdb3 -I/opt/freeswitch/include -I/opt/freeswitch/include/apr-1 -I/opt/freeswitch/include/apr-util-1', +# LDFLAGS => '-L/opt/freeswitch/lib', +# SOLINK => '-shared -Xlinker -x', +# APR_CFLAGS => '-pthread -DLINUX=2 -D_REENTRANT -D_GNU_SOURCE -D_LARGEFILE64_SOURCE', +# APR_LIBS => '', +# +# MODULES_DIR => '/opt/freeswitch/mod', +# LIB_DIR => '/opt/freeswitch/lib', +# BIN_DIR => '/opt/freeswitch/bin', +# DB_DIR => '/opt/freeswitch/db', +# CFG_DIR => '/opt/freeswitch/conf', +# PREFIX => '/opt/freeswitch' +#); + +# +# Misc variables +# +my @files = (); + +my $command; +my $target; + +my $needs_target = 1; +my $debug = 0; + +# +# functions +# + +sub do_exec { + my $retval = system( "@_ >/dev/null" ); + if( $retval ) { + exit $retval; + } +} + +sub fsxs_usage { + print "FreeSwitch fsxs\n(C) 2006 Stefan Knoblich <stkn@netdomination.org>\n"; + print "\n"; + print "Usage:\n"; + print "\t$0 compile [options] <file1 ...>\n"; + print "\t$0 link [options] <target> <file1 ...>\n"; + print "\t$0 build [options] <target> <file1 ...>\n"; + print "\t$0 install [options] <file1 ...>\n"; + print "\t$0 show <var1 ...>\n\n"; + print "Command description:\n"; + print "\tcompile: Compile source file(s) into object file(s)\n"; + print "\tlink: Create module from object file(s)\n"; + print "\tbuild: Build module from source file(s) (compile + link)\n"; + print "\tinstall: Install module(s) into freeswitch module directory\n"; + print "\tshow: Show defined variable(s)\n"; + print "\n"; + + print "Options:\n"; + print "\t--add-cflags Append custom cflags [compile, build]\n"; + print "\t--set-cflags Override cflags [compile, build]\n"; + print "\n"; + print "\t--add-ldflags Append custom ldflags [link, build]\n"; + print "\t--set-ldflags Override ldflags [link, build]\n"; + print "\t--add-libs Append additional libs [link, build]\n"; + print "\t--set-libs Override libs [link, build]\n"; + print "\n"; + print "\t--destdir Installation prefix [install]\n"; + print "\n"; + + print "Examples:\n"; + print "\t$0 compile --add-cflags=\"-DFOO=1 -DBAR\" mod_test.c mod_test2.c\n\n"; + print "\t$0 link --add-ldflags=\"-ltest\" mod_test.so mod_test.o mod_test2.o\n\n"; + print "\t$0 build --add-cflags=\"-DFOO\" --add-ldflags=\"-ltest\" mod_test.so mod_test.c mod_test2.c\n\n"; + exit 1; +} + +sub fsxs_compile { + my $cc_cmd; + + $cc_cmd = "$vars{CC}"; + if( defined( $vars{APR_CFLAGS} ) && $vars{APR_CFLAGS} ) { + $cc_cmd = $cc_cmd . " $vars{APR_CFLAGS}" + } + $cc_cmd = $cc_cmd . " $vars{CFLAGS} -c -o"; + + foreach( @_ ) { + chomp( $_ ); + + # replace file extension + my $outfile = $_; + $outfile =~ s/\.(cpp|cc|c)$/.o/; + + print "CC\t$_\n"; + if( $debug ) { + print "$cc_cmd $outfile $_\n" + } + do_exec( "$cc_cmd $outfile $_" ); + } +} + +sub fsxs_link { + my $target = shift; + my @objs = @_; + my $ld_cmd; + + $ld_cmd = "$vars{LD}"; + if( defined( $vars{APR_LIBS} ) && $vars{APR_LIBS} ) { + $ld_cmd = $ld_cmd . " $vars{APR_LIBS}" + } + $ld_cmd = $ld_cmd . " $vars{LDFLAGS} $vars{SOLINK} -o"; + + print "LD\t$target\t[@objs]\n"; + if( $debug ) { + print "$ld_cmd $target @objs $vars{LIBS}\n" + } + do_exec( "$ld_cmd $target @objs $vars{LIBS}" ); +} + +sub fsxs_install { + my @files = @_; + my $destination = $vars{DESTDIR} . $vars{MODULES_DIR}; + + # check if destination exists, create if it doesn't + if( ! -e $destination ) { + if( $debug ) { + print "$vars{MKDIR} $destination\n"; + } + do_exec( "$vars{MKDIR} $destination" ); + } + if( $debug ) { + print "$vars{INSTALL} -m644 @files $destination\n"; + } + do_exec( "$vars{INSTALL} -m644 @files $destination" ); +} + +sub fsxs_show { + my @varlist = @_; + + if( $#varlist < 0 ) { + # none requested, show all variables with names + my $key; + foreach $key ( keys %vars ) { + print "$key: $vars{$key}\n"; + } + } + elsif( $#varlist > 0 ) { + # more than one requested, show with name + foreach( @varlist ) { + if( defined $vars{$_} ) { + print "$_: $vars{$_}\n"; + } + } + } else { + # show only one variable, without name + if( defined $vars{$varlist[0]} ) { + print "$vars{$varlist[0]}\n"; + } + } +} + +# +# main part +# +if( $#ARGV < 0 ) { + fsxs_usage; +} +chomp( $command = shift @ARGV ); + +if( $command =~ /^install|build|link|compile|show$/ ) { + + if( $command =~ /^show|compile|install$/ ) { + $needs_target = 0; + } +} +else { + print STDERR "Unknown command: $command\n"; + fsxs_usage; +} + +# parse environment variables +if( defined $ENV{DEBUG} && $ENV{DEBUG} ) { + $debug = 1; +} + +# parse arguments +foreach(@ARGV) { + chomp( $_ ); + + if( $command ne 'show' ) + { + if( /^\--add-cflags=(.*)$/ ) { + $vars{CFLAGS} = "$vars{CFLAGS} $1"; + } + elsif( /^\--set-cflags=(.*)$/ ) { + $vars{CFLAGS} = "$1"; + } + elsif( /^\--add-ldflags=(.*)$/ ) { + $vars{LDFLAGS} = "$vars{LDFLAGS} $1"; + } + elsif( /^\--set-ldflags=(.*)$/ ) { + $vars{LDFLAGS} = "$1"; + } + elsif( /^\--add-libs=(.*)$/ ) { + $vars{LIBS} = "$vars{LIBS} $1"; + } + elsif( /^\--set-libs=(.*)$/ ) { + $vars{LIBS} = "$1"; + } + elsif( /^\--destdir=(.*)$/ ) { + $vars{DESTDIR} = "$1"; + } + elsif( /^\--debug$/ ) { + $debug = 1; + } + elsif( /^(DESTDIR|CFLAGS|CC|LDFLAGS|LD|LIBS)=(.*)$/ ) { + if( $debug ) { + print "Overriding $1 (new value: $2)\n"; + } + $vars{$1} = "$2"; + } + elsif( /^([^\-]+.*)$/ ) { + if( $needs_target ) { + $target = "$1"; + $needs_target = 0; + } else { + push(@files, "$1"); + } + } + } else { + # show command has different parameter handling + if( /^\--(.*)$/ ) { + push( @files, uc "$1" ); + } + elsif( /^([^\-]+.*)$/ ) { + push( @files, uc "$1" ); + } + } +} + +# +# execute commands +# +if( $command eq 'link' ) { + fsxs_link( $target, @files ); +} +elsif( $command eq 'compile' ) { + fsxs_compile( @files ); +} +elsif( $command eq 'build' ) { + my @objs = (); + + fsxs_compile( @files ); + + foreach( @files ) { + chomp( $_ ); + $_ =~ s/\.(cpp|cc|c)$/.o/; + push( @objs, "$_" ); + } + + fsxs_link( $target, @objs ); +} +elsif( $command eq 'show' ) { + fsxs_show( @files ); +} +elsif( $command eq 'install' ) { + fsxs_install( @files ); +} +else { + fsxs_usage; +} + +exit 0;
participants (1)
-
Freeswitch SVN