diff options
Diffstat (limited to 'tmake/bin')
-rw-r--r-- | tmake/bin/progen.bat | 266 | ||||
-rwxr-xr-x | tmake/bin/tmake | 415 | ||||
-rw-r--r-- | tmake/bin/tmake.bat | 1093 |
3 files changed, 289 insertions, 1485 deletions
diff --git a/tmake/bin/progen.bat b/tmake/bin/progen.bat deleted file mode 100644 index 54475ee..0000000 --- a/tmake/bin/progen.bat +++ /dev/null @@ -1,266 +0,0 @@ -@rem = '--*-PERL-*--'; -@rem = ' -@echo off -rem setlocal -set ARGS= -:loop -if .%1==. goto endloop -set ARGS=%ARGS% %1 -shift -goto loop -:endloop -rem ***** This assumes PERL is in the PATH ***** -perl.exe -S progen.bat %ARGS% -goto endofperl -@rem '; -#!/usr/bin/perl -############################################################################ -# $Id$ -# -# Generates a tmake project file. -# -# Copyright (C) 1996-1998 by Troll Tech AS. All rights reserved. -# -# Permission to use, copy, modify, and distribute this software and its -# documentation for any purpose and without fee is hereby granted, provided -# that this copyright notice appears in all copies. -# No representations are made about the suitability of this software for any -# purpose. It is provided "as is" without express or implied warranty. -# -############################################################################ - -# Default project settings -$project{"TEMPLATE"} = "app"; -$project{"CONFIG"} = "qt warn_on release"; - -@project_extra = (); - -while ( @ARGV ) { # parse command line args - $_ = shift @ARGV; - if ( s/^-// ) { - if ( /^o(.*)/ ) { - $outfile = ($1 eq "") ? shift @ARGV : $1; - ($outfile eq "-") && ($outfile = ""); - } elsif ( /^n(.*)/ ) { - $project{"TARGET"} = ($1 eq "") ? shift @ARGV : $1; - } elsif ( /^t(.*)/ ) { - $project{"TEMPLATE"} = ($1 eq "") ? shift @ARGV : $1; - $project{"TEMPLATE"} =~ s/\.t$//i; - } elsif ( /lower/ ) { - $tolower = 1; - } else { - &progen_usage; - } - } elsif ( /^\s*(?:[\w\-]+:)?\w+\s*[\+\-\*\/]?=/ ) { # project override - push( @project_extra, $_ ); - } else { - push (@files, $_ ); - } -} - -$outfile eq "" || open(STDOUT,">" . $outfile) || - &progen_error("Can't create \"$outfile\""); - -if ( ! @files ) { - @files = &find_files(".",".*",1); -} - -if ( $tolower ) { - foreach $f ( @files ) { - $f =~ tr/A-Z/a-z/; - } -} - -@hdr = sort grep(/\.(h|hh|hpp|hxx)$/i,@files); -@src = sort grep(/\.(c|cpp|cc|cxx)$/i && ! /moc_/i,@files); - -# Remove source files that are included by other source files -foreach $f ( @src ) { - $srcdict{$f} = 1; -} -foreach $f ( @src ) { - if ( open(F,"< $f") ) { - while ( <F> ) { - if ( /^\s*#\s*include\s+\"([^\"]*)\"/ ) { - $srcdict{$1} = 0; - } - } - } -} -foreach $f( @src ) { - $srcdict{$f} && (push(@src2,$f)); -} -@src = @src2; - -$project{"HEADERS"} = join(" ",sort @hdr); -$project{"SOURCES"} = join(" ",sort @src); - -foreach $p ( @project_extra ) { - if ( $p =~ /^\s*((?:[\w\-]+:)?\w+)\s*([\+\-\*\/])?=\s*(.*)/ ) { - if ( $project{$1} ne "" ) { - Project($p); - } - } -} - -$project{"HEADERS"} =~ s/\s+/ \\\n\t\t /g; -$project{"SOURCES"} =~ s/\s+/ \\\n\t\t /g; - -print "TEMPLATE\t= " . $project{"TEMPLATE"} . "\n"; -print "CONFIG\t\t= " . $project{"CONFIG"} . "\n"; -print "HEADERS\t\t= " . $project{"HEADERS"} . "\n"; -print "SOURCES\t\t= " . $project{"SOURCES"} . "\n"; -if ( $project{"TARGET"} ne "" ) { - print "TARGET\t\t= " . $project{"TARGET"} . "\n"; -} - -foreach ( @project_extra ) { - if ( /^\s*((?:[\w\-]+:)?\w+)\s*([\+\-\*\/])?=\s*(.*)/ ) { - if ( $project{$1} eq "" ) { - $t = $1; - if ( length($t) < 8 ) { - $t .= "\t\t"; - } elsif ( length($t) < 16 ) { - $t .= "\t"; - } else { - $t .= " "; - } - print "$t$2= $3\n"; - } - } -} - -exit 0; - - -# -# progen_usage() -# -# Prints a message about program usage and exits -# - -sub progen_usage { - print STDERR "Usage:\n progen [options] [files]\n"; - print STDERR "Options:\n"; - print STDERR " -lower Lower-case letters filenames (useful for non-Unix)\n"; - print STDERR " -n name Specify a project name (= TARGET)\n"; - print STDERR " -o file Write output to \"file\"\n"; - print STDERR " -t file Specify a template file other than qtapp\n"; - exit 1; -} - - -# -# progen_error(msg) -# -# Prints the message and exits -# - -sub progen_error { - my($msg) = @_; - print STDERR "progen error: " . $msg . "\n"; - exit 1; -} - - -# -# Finds files. -# -# Examples: -# find_files("/usr","\.cpp$",1) - finds .cpp files in /usr and below -# find_files("/tmp","^#",0) - finds #* files in /tmp -# - -sub find_files { - my($dir,$match,$descend) = @_; - my($file,$p,@files); - local(*D); - $dir =~ s=\\=/=g; - ($dir eq "") && ($dir = "."); - if ( opendir(D,$dir) ) { - if ( $dir eq "." ) { - $dir = ""; - } else { - ($dir =~ /\/$/) || ($dir .= "/"); - } - foreach $file ( readdir(D) ) { - next if ( $file =~ /^\.\.?$/ ); - $p = $dir . $file; - ($file =~ /$match/i) && (push @files, $p); - if ( $descend && -d $p && ! -l $p ) { - push @files, &find_files($p,$match,$descend); - } - } - closedir(D); - } - return @files; -} - - -# -# strip_project_val(tag) -# -# Strips white space from project value strings. -# - -sub strip_project_val { - my($v) = @_; - $v =~ s/^\s+//; # trim white space - $v =~ s/\s+$//; - return $v; -} - - -# -# Project(strings) -# -# This is a powerful function for setting or reading project variables. -# Returns the resulting project variables (joined with space between). -# -# This is a slightly modified version of the Project function in tmake. - -sub Project { - my @settings = @_; - my($r,$t,$s,$v,$p,$c); - $r = ""; - foreach ( @settings ) { - $v = $_; - if ( $v =~ s/^\s*((?:[\w\-]+:)?\w+)\s*(\+=|\*=|\-=|\/=|=)\s*// ) { - $t = $1; - $s = $2; - $v = strip_project_val($v); - $p = $project{$t}; - if ( $s eq "=" ) { # set variable - $p = $v; - } elsif ( $s eq "+=" ) { # append - if ( $p eq "" ) { - $p = $v; - } else { - $p .= " " . $v; - } - } elsif ( $s eq "*=" ) { # append if not contained - if ( !($p =~ /(?:^|\s)\Q$v\E(?:\s|$)/) ) { - if ( $p eq "" ) { - $p = $v; - } else { - $p .= " " . $v; - } - } - } elsif ( $s eq "-=" ) { # subtract - $p =~ s/$v//g; - } elsif ( $s eq "/=" ) { # sed - $cmd = '$p =~ ' . $v; - eval $cmd; - } - $project{$t} = strip_project_val($p); - } else { - $p = strip_project_val($project{$v}); - } - if ( $p ne "" ) { - $r = ($r eq "") ? $p : ($r . " " . $p); - } - } - return $r; -} -__END__ -:endofperl diff --git a/tmake/bin/tmake b/tmake/bin/tmake index 2d7e6a7..457467a 100755 --- a/tmake/bin/tmake +++ b/tmake/bin/tmake @@ -29,51 +29,89 @@ # ############################################################################ +$TMAKE_VERSION = "1.3"; + if ($] < 5.0) { &tmake_error("This program requires perl version 5 or newer"); } -$cpp_ext = "cpp"; -$obj_ext = "o"; -$moc_aware = 0; -$moc_pre = "moc_"; -$moc_ext = "moc"; -$moc_cmd = '$(MOC)'; -$linebreak = "\\"; -$dir_sep = "/"; -$is_unix = 1; -$really_unix = &check_unix(); -$guess_os = 1; -$depend_path = ""; -$nodepend = 0; -$output_count = 0; - -$template_name = ""; -$project_name = ""; -$outfile = ""; -@project_extra = (); -@project_files = (); -@eval_expr = (); -$eval_done = 0; +$cpp_ext = "cpp"; +$moc_aware = 0; +$moc_pre = "moc_"; +$moc_ext = "moc"; +$moc_cmd = '$(MOC)'; +$linebreak = "\\"; +$really_unix = &check_unix(); +$is_unix = $really_unix; +$dir_sep = $is_unix ? "/" : "\\"; +$obj_ext = $is_unix ? "o" : "obj"; +$depend_path = ""; +$nodepend = 0; +$output_count = 0; +$notrim_whitespace = 0; +$read_tmakeconf = 0; + +$template_name = ""; +$project_name = ""; +$outfile = ""; +%project = (); +$eval_quit = 0; + +$project{"TMAKEPATH"} = $ENV{"TMAKEPATH"} . ";" . $ENV{"HOME"} . "/.tmake/"; while ( @ARGV ) { # parse command line args $_ = shift @ARGV; if ( s/^-// ) { if ( /^e(.*)/ ) { - push( @eval_expr, ($1 eq "") ? shift @ARGV : $1); + if ( ! $read_tmakeconf ) { + $read_tmakeconf = 1; + &ScanProject( &find_template("tmake.conf") ); + } + $text = ""; + eval( ($1 eq "") ? shift @ARGV : $1 ); + die $@ if $@; + print $text . "\n" if ($text ne ""); + $eval_quit = 1; } elsif ( /^t(.*)/ ) { $template_name = ($1 eq "") ? shift @ARGV : $1; } elsif ( /^o(.*)/ ) { $outfile = ($1 eq "") ? shift @ARGV : $1; ($outfile eq "-") && ($outfile = ""); + if ( $outfile ne "" ) { + open(STDOUT,">" . fix_path($outfile)) || + &tmake_error("Can't create \"$outfile\""); + } } elsif ( /^p(.*)/ ) { - push( @project_files, ($1 eq "") ? shift @ARGV : $1); + # + # The -p option is obsolete and will be removed in the next + # tmake release. + # + &tmake_warning( "-p option obsolete, instead use \"tmake file1.pro file2.pro ...\""); + my($pf) = ($1 eq "") ? shift @ARGV : $1; + if ( ! $read_tmakeconf ) { + $read_tmakeconf = 1; + &ScanProject( &find_template("tmake.conf") ); + } + if ( ! ($pf =~ /\.pro$/i) && -f fix_path($pf . ".pro") ) { + $pf .= ".pro"; + } + if ( $project_name eq "" ) { + $project_name = $pf; + $project{"PROJECT"} = $project_name; + $project{"PROJECT"} =~ s/\.pro$//i; + $project{"TARGET"} = $project{"PROJECT"}; + } + if ( !&ScanProject($pf) ) { + &tmake_error("Can't open project file \"$pf\""); + } } elsif ( /^unix$/ ) { - $guess_os = 0; $is_unix = 1; + $dir_sep = "/"; + $obj_ext = "o"; } elsif ( /^win32$/ ) { - $guess_os = 0; $is_unix = 0; + $dir_sep = "\\"; + $obj_ext = "obj"; } elsif ( /^nodepend$/ ) { $nodepend = 1; # don't generate dependencies } elsif ( /^v$/ ) { @@ -81,66 +119,46 @@ while ( @ARGV ) { # parse command line args } else { &tmake_usage(); } - } elsif ( /^\s*(?:[\w\-]+:)?\w+\s*[\+\-\*\/]?=/ ) { # project override - push( @project_extra, $_ ); + } elsif ( /^\s*((?:[^:\s]*?:)?)(\w+)\s*(\+=|\*=|\-=|\/=|=)/ ) { + if ( ! $read_tmakeconf && ! (/^\s*TMAKEPATH/) ) { + $read_tmakeconf = 1; + &ScanProject( &find_template("tmake.conf") ); + } + Project( $_ ); # manual project setting } else { - $project_name && - &tmake_error("You can only specify one project file"); - $project_name = $_; + my($pf) = $_; + if ( ! $read_tmakeconf ) { + $read_tmakeconf = 1; + &ScanProject( &find_template("tmake.conf") ); + } + if ( ! ($pf =~ /\.pro$/i) && -f fix_path($pf . ".pro") ) { + $pf .= ".pro"; + } + if ( $project_name eq "" ) { + $project_name = $pf; + $project{"PROJECT"} = $project_name; + $project{"PROJECT"} =~ s/\.pro$//i; + $project{"TARGET"} = $project{"PROJECT"}; + } + if ( !&ScanProject($pf) ) { + &tmake_error("Can't open project file \"$pf\""); + } } } -($project_name ne "") || &tmake_usage(); +&tmake_verb("Version $TMAKE_VERSION (runtime environment: " . + ($really_unix ? "Unix" : "Win32") . ")\n" ); -if ( $guess_os && ! check_unix() ) { # probably non-Unix, - $is_unix = 0; - &tmake_verb("Win32 detected"); -} -if ( ! $is_unix ) { - $obj_ext = "obj"; - $dir_sep = "\\"; -} -$outfile eq "" || open(STDOUT,">" . fix_path($outfile)) || - &tmake_error("Can't create \"$outfile\""); - -%project = (); -&ScanProject( &find_template("tmake.conf") ); -&tmake_verb("Reading the project file $project_name"); -if ( ! ($project_name =~ /\.pro$/i) && -f fix_path($project_name . ".pro") ) { - $project_name .= ".pro"; -} -$project{"PROJECT"} = $project_name; -$project{"PROJECT"} =~ s/\.pro$//i; -$project{"TARGET"} = $project{"PROJECT"}; - -unshift(@project_files,$project_name); -foreach ( @project_files ) { - if ( ! ($_ =~ /\.pro$/i) && -f fix_path($_ . ".pro") ) { - $_ .= ".pro"; - } - if ( !&ScanProject($_) ) { - &tmake_error("Can't open project file \"$_\""); - } +if ( $eval_quit ) { + &tmake_verb("Done!"); + exit 0; } -&Project( @project_extra ); +($project_name eq "") && &tmake_usage(); if ( $template_name eq "" ) { $template_name = $project{"TEMPLATE"} ? $project{"TEMPLATE"} : "default.t"; } - -foreach ( @eval_expr ) { - $text = ""; - eval( $_ ); - die $@ if $@; - print $text . "\n" if ($text ne ""); - $eval_done = 1; -} -if ( $eval_done ) { - &tmake_verb("Done!"); - exit 0; -} - $template_name = &find_template($template_name); &IncludeTemplate($template_name); &tmake_verb("Done!"); @@ -159,12 +177,11 @@ exit 0; # finished! # sub tmake_usage { - print STDERR "Usage:\n tmake [options] project-file\n"; + print STDERR "Usage:\n tmake [options] project-files\n"; print STDERR "Options:\n"; print STDERR " -e expr Evaluate expression, ignore template file\n"; print STDERR " -nodepend Don't generate dependency information\n"; print STDERR " -o file Write output to file\n"; - print STDERR " -p project Load additional project file\n"; print STDERR " -t file Specify a template file\n"; print STDERR " -unix Create output for Unix (auto detects)\n"; print STDERR " -v Verbose/debug mode\n"; @@ -187,6 +204,18 @@ sub tmake_error { # +# tmake_warning(msg) +# +# Prints the warning message +# + +sub tmake_warning { + my($msg) = @_; + print STDERR "tmake warning: " . $msg . "\n"; +} + + +# # tmake_verb() # # Prints a verbose message @@ -207,10 +236,14 @@ sub tmake_verb { sub check_unix { my($r); $r = 0; - if ( -f "/bin/uname" || -f "/usr/bin/uname" ) { + if ( -f "/bin/uname" ) { $r = 1; (-f "\\bin\\uname") && ($r = 0); } + if ( -f "/usr/bin/uname" ) { + $r = 1; + (-f "\\usr\\bin\\uname") && ($r = 0); + } return $r; } @@ -232,8 +265,9 @@ sub find_template { } else { $tb = $template_base . ";"; } - $d = ";" . $tb . $ENV{"TMAKEPATH"} . ";" . $ENV{"HOME"} . "/.tmake/"; - @dirs = &split_path( $d ); + $d = $tb . $project{"TMAKEPATH"}; + @dirs = (""); + push @dirs, &split_path( $d ); $filename .= ".t" unless ($filename =~ /\.\w+$/); for $d ( @dirs ) { $p = $d . $filename; @@ -267,9 +301,15 @@ sub StdInit { $stdinit_done = 1; if ( defined($project{"OBJECTS_DIR"}) ) { $project{"OBJECTS_DIR"} = FixPath($project{"OBJECTS_DIR"}); + &mkdirp($project{"OBJECTS_DIR"},0777); } if ( defined($project{"MOC_DIR"}) ) { $project{"MOC_DIR"} = FixPath($project{"MOC_DIR"}); + &mkdirp($project{"MOC_DIR"},0777); + } + if ( defined($project{"DESTDIR"}) ) { + $project{"DESTDIR"} = FixPath($project{"DESTDIR"}); + &mkdirp($project{"DESTDIR"},0777); } $project{"OBJECTS"} = &Objects($project{"SOURCES"}); if ( $moc_aware ) { @@ -347,18 +387,16 @@ sub Now { # -# expand_project_val(tag) +# expand_project_var(var) # # Internal function for Project(). # Expands a project value string. # -sub expand_project_val { +sub expand_project_var { my($v) = @_; my($c); return "" if !defined($v); - $v =~ s/^\s+//; # trim white space - $v =~ s/\s+$//; $c = 0; while ( $c < 100 ) { # expand $$ if ( $v =~ s/(\$\$\w+)/\035/ ) { @@ -415,27 +453,33 @@ sub expand_project_val { sub Project { my @settings = @_; - my($r,$if_tag,$t,$s,$v,$p,$c); + my($r,$if_var,$t,$s,$v,$p,$c); $r = ""; foreach ( @settings ) { $v = $_; - if ( $v =~ s/^\s*((?:[^:]*?:)?)(\w+)\s*(\+=|\*=|\-=|\/=|=)\s*// ) { - $if_tag = $1; - if ( $if_tag ne "" ) { - chop $if_tag; - if ( $if_tag eq "unix" ) { + if ( $v =~ s/^\s*((?:[^:\s]*?:)?)(\w+)\s*(\+=|\*=|\-=|\/=|=)// ) { + $if_var = $1; + if ( $if_var ne "" ) { + chop $if_var; + if ( $if_var eq "unix" ) { return "" if !$is_unix; - } elsif ( $if_tag eq "win32" ) { + } elsif ( $if_var eq "win32" ) { return "" if $is_unix; - } elsif ( ($if_tag ne $tmake_platform) && !Config($if_tag) ) { + } elsif ( ($if_var ne $tmake_platform) && !Config($if_var) ) { return ""; } } $t = $2; $s = $3; - $v = expand_project_val($v); + if ( ! $notrim_whitespace ) { + $v =~ s/^\s+//; # trim white space + $v =~ s/\s+$//; + } + $v = expand_project_var($v); $p = $project{$t}; - if ( $s eq "=" ) { # set variable + if ( $s ne "=" && $v eq "" ) { + # nothing to append, subtract or sed + } elsif ( $s eq "=" ) { # set variable $p = $v; } elsif ( $s eq "+=" ) { # append if ( $p eq "" ) { @@ -457,9 +501,9 @@ sub Project { $cmd = '$p =~ ' . $v; eval $cmd; } - $project{$t} = expand_project_val($p); + $project{$t} = expand_project_var($p); } else { - $p = expand_project_val($project{$v}); + $p = expand_project_var($project{$v}); } if ( $p ne "" ) { $r = ($r eq "") ? $p : ($r . " " . $p); @@ -480,7 +524,7 @@ sub Project { sub Substitute { my($subst) = @_; - $text = expand_project_val($subst); + $text = expand_project_var($subst); return $text; } @@ -494,28 +538,50 @@ sub Substitute { sub ScanProject { my($file) = @_; - my($tag,$var,@v,$more,$line); + my($var,$val,@v,$more,$line,$endmark); - $tag = ""; + $var = ""; $line = 0; open(TMP,fix_path($file)) || return 0; + &tmake_verb("Reading the project file $file"); while ( <TMP> ) { $line++; s/\#.*//; # strip comment s/^\s+//; # strip white space s/\s+$//; - if ( /^\s*((?:(?:[^:]*?:)?)\w+\s*(\+|\-|\*|\/)?=)/ ) { - $tag = $1; # tag also contains the ".=" + if ( /^\s*((?:(?:[^:\s]*?:)?)\w+\s*(\+|\-|\*|\/)?=)/ ) { + $var = $1; # var also contains the ".=" s/^.*?=\s*//; + if ( /^\<\<(.*)$/ ) { + $endmark = $1; + $val = ""; + while ( <TMP> ) { + $line++; + if ( /^\Q$endmark\E$/ ) { + $endmark = ""; + last; + } + $val .= $_; + } + if ( $endmark ne "" ) { + tmake_error("$file:$line: End marker $endmark not found"); + } + chop $val if ( $val ne "" ); + $notrim_whitespace++; + Project( $var . $val ); + $notrim_whitespace--; + $var = ""; + $_ = ""; + } } - if ( $tag ne "" ) { + if ( $var ne "" ) { $more = ( $_ =~ s/\s*\\\s*$// ); # more if \ at end of line push( @v, split( /\s+/, $_ ) ); if ( ! $more ) { - $var = join(" ",@v); - Project( $tag . $var ); - $tag = ""; + $val = join(" ",@v); + Project( $var . $val ); + $var = ""; @v = (); } } elsif ( $_ ne "" ) { @@ -523,6 +589,7 @@ sub ScanProject { } } close(TMP); + &tmake_verb("Done reading the project file $file"); return 1; } @@ -601,15 +668,15 @@ sub IncludeTemplate { # -# Expand(tag) - appends to $text +# Expand(var) - appends to $text # # Expands a list of $project{} variables with a space character between them. # sub Expand { - my @tags = @_; + my @vars = @_; my($t); - $t = Project(@tags); + $t = Project(@vars); if ( $text eq "" ) { $text = $t; } elsif ( $t ne "" ) { @@ -620,13 +687,13 @@ sub Expand { # -# ExpandGlue(tag,prepend,glue,append) - appends to $text +# ExpandGlue(var,prepend,glue,append) - appends to $text # -# Expands a $project{} tag, splits on whitespace +# Expands a $project{} variable, splits on whitespace # and joins with $glue. $prepend is put at the start # of the string and $append is put at the end of the # string. The resulting string becomes "" if the project -# tag is empty or not defined. +# var is empty or not defined. # # Example: # @@ -640,9 +707,9 @@ sub Expand { # sub ExpandGlue { - my($tag,$prepend,$glue,$append) = @_; + my($var,$prepend,$glue,$append) = @_; my($t,$v); - $v = Project($tag); + $v = Project($var); if ( $v eq "" ) { $t = ""; } else { @@ -658,14 +725,67 @@ sub ExpandGlue { # -# ExpandList(tag) - sets $text. +# ExpandList(var) - sets $text. # # Suitable for expanding HEADERS = ... etc. in a Makefile # sub ExpandList { - my($tag) = @_; - return ExpandGlue($tag,""," ${linebreak}\n\t\t",""); + my($var) = @_; + return ExpandGlue($var,""," ${linebreak}\n\t\t",""); +} + + +# +# ExpandPath(var,prepend,glue,append) - appends to $text +# +# Expands a $project{} variable, splits on either ';' or +# whitespace and joins with $glue. $prepend is put at the +# start of the string and $append is put at the end of the +# string. The resulting string becomes "" if the project +# variable is empty or not defined. +# +# If the variable contains at least one semicolon or tmake +# is running on Windows, the resulting items are put in +# double-quotes. +# +# Example: +# +# The project file defines: +# INCLUDEPATH = "C:\qt\include;c:\program files\msdev\include +# +# ExpandGlue("INCLUDEPATH","-I","-I","") +# +# The result: +# $text = -I"c:\qt\include" -I"c:\program files\msdev\include" +# + +sub ExpandPath { + my($var,$prepend,$glue,$append) = @_; + my($t,$v); + my($s); + $v = Project($var); + if ( $v eq "" ) { + $t = ""; + } else { + if ( $v =~ /;/ || !$is_unix ) { + $prepend .= '"'; + $glue = '"' . $glue . '"'; + $append = '"' . $append; + } + + if ( $v =~ /;/ ) { + $t = $prepend . join($glue,split(/;+/,$v)) . $append; + } else { + $t = $prepend . join($glue,split(/\s+/,$v)) . $append; + } + } + if ( $text eq "" ) { + $text = $t; + } elsif ( $t ne "" ) { + $text .= " " . $t; + } + return $text; } @@ -859,11 +979,18 @@ sub AddIncludePath { return; } $project{"INCLUDEPATH"} = "" if !defined($project{"INCLUDEPATH"}); + if ( !defined($project{"INCPATH_SEP"}) ) { + if ( $project{"INCLUDEPATH"} =~ /;/ ) { + $project{"INCPATH_SEP"} = ";"; + } else { + $project{"INCPATH_SEP"} = " "; + } + } $p = $project{"INCLUDEPATH"}; $p = ($p && $path) ? ($p . ";" . $path) : ($p . $path); $project{"INCLUDEPATH"} = $p; - $p = join(" ",&split_path($p)); - $p =~ s=[\\/](\s|$)= =g; + $p = join($project{"INCPATH_SEP"},&split_path($p)); + $p =~ s=[\\/]($project{"INCPATH_SEP"}|$)=$project{"INCPATH_SEP"}=g; $project{"INCPATH"} = $p; } @@ -887,7 +1014,7 @@ sub FindHighestLibVersion { $highest = ""; @files = find_files($dir,"${name}.*\.lib"); for $f ( @files ) { - if ( $f =~ /(\d+)\.lib/ ) { + if ( $f =~ /(\d+)\.lib/i ) { $v = $1; if ( $highest eq "" || $v > $highest ) { $highest = $v; @@ -971,7 +1098,7 @@ sub make_depend { @cur_dep_path = @dep_path; if ( $file =~ /(.*[\/\\])/ ) { $dep_curdir = $1; - splice( @cur_dep_path, 0, 0, $dep_curdir ); + push @cur_dep_path, $dep_curdir; } else { $dep_curdir = ""; } @@ -1032,7 +1159,7 @@ sub canonical_dep { sub scan_dep { my($file) = @_; my($dir,$path,$found,@allincs,@includes,%incs); - $path = ($file eq $dep_file) ? $file : $dep_curdir . $file; + $path = $file; @includes = (); return @includes if $file =~ /\.$moc_ext$/; # avoid .moc files if ( ! (-f fix_path($path)) ) { @@ -1072,13 +1199,24 @@ sub scan_dep { sub split_path { my($p) = @_; - return "" if !defined($p); + my($s,@d); + @d = (); + return @d if !defined($p) || $p eq ""; $p =~ s=:=;=g if $is_unix; $p =~ s=[/\\]+=/=g; - $p =~ s=([^/:]);=$1/;=g; - $p =~ s=([^:;/])$=$1/=; - $p =~ s=/=$dir_sep=g unless $is_unix; - return split(/;/,$p); + if ( !($p =~ /;/) ) { + $p =~ s/\s+/;/g; + } + $p =~ s/\s*;\s*/;/g; + while( $p =~ /(?:(?:[^\"\;][^\;]*;*)|(?:\"[^\"]*\";*))/g ) { + $s = $&; + $s =~ s=\"==g; + $s =~ s=[\s\;]+$==g; + $s =~ s=([^/:])$=$1/=g; + $s =~ s=/=$dir_sep=g unless $is_unix; + push @d, $s; + } + return @d; } @@ -1097,3 +1235,28 @@ sub fix_path { } return $p; } + + +# +# mkdirp(filename,mode) - Internal for StdInit() +# +# Creates the directory specified by $filename, with permissions +# specified by mode (as modified by umask). Recursively calls +# mkdir, similar to 'mkdir -p'. +# + +sub mkdirp { + my($filename,$mode) = @_; + if ( $filename =~ /\$\(\w+\)/ ) { # ignore "$(something)" + return 0; + } + $filename =~ s-[\\:/]+-/-g; + if ( -d $filename ) { + return 1; + } + $filename =~ m-^((.*)/)?(.*)-; + if ( defined($2) && ! mkdirp($2,$mode) ) { + return 0; + } + return mkdir($filename,$mode); +} diff --git a/tmake/bin/tmake.bat b/tmake/bin/tmake.bat deleted file mode 100644 index 6fbd6b2..0000000 --- a/tmake/bin/tmake.bat +++ /dev/null @@ -1,1093 +0,0 @@ -@rem = '--*-PERL-*--'; -@rem = ' -@echo off -rem setlocal -set ARGS= -:loop -if .%1==. goto endloop -set ARGS=%ARGS% %1 -shift -goto loop -:endloop -rem ***** This assumes PERL is in the PATH ***** -perl.exe -S tmake.bat %ARGS% -goto endofperl -@rem '; -#!/usr/bin/perl -############################################################################ -# $Id$ -# -# Creates a Makefile from a template and a project file. -# -# Copyright (C) 1996-1998 by Troll Tech AS. All rights reserved. -# -# Permission to use, copy, modify, and distribute this software and its -# documentation for any purpose and without fee is hereby granted, provided -# that this copyright notice appears in all copies. -# No representations are made about the suitability of this software for any -# purpose. It is provided "as is" without express or implied warranty. -# -# -# Some important, global variables in tmake: -# cpp_ext C++ extension added to moc output (.cpp) -# obj_ext Object file extension (.o on Unix, .obj otherwise) -# moc_aware Will scan for files containing Qt signals/slots -# moc_pre Moc prefix for generated moc file: x.h -> moc_x.cpp -# moc_ext Moc extension for generated moc file: x.cpp -> x.moc -# moc_cmd The moc command in your makefile, $(MOC) -# linebreak Line break character (\) -# dir_sep Directory separator (/ on Unix, \ on Windows) -# is_unix Autodetected. If not Unix, assume Windows (Win32). -# -# If you need to customize any of these settings, do it before -# calling StdInit() in the template file. -# -############################################################################ - -if ($] < 5.0) { - &tmake_error("This program requires perl version 5 or newer"); -} - -$cpp_ext = "cpp"; -$obj_ext = "o"; -$moc_aware = 0; -$moc_pre = "moc_"; -$moc_ext = "moc"; -$moc_cmd = '$(MOC)'; -$linebreak = "\\"; -$dir_sep = "/"; -$is_unix = 1; -$really_unix = &check_unix(); -$guess_os = 1; -$depend_path = ""; -$nodepend = 0; -$output_count = 0; - -$template_name = ""; -$project_name = ""; -$outfile = ""; -@project_extra = (); -@project_files = (); -@eval_expr = (); -$eval_done = 0; - -while ( @ARGV ) { # parse command line args - $_ = shift @ARGV; - if ( s/^-// ) { - if ( /^e(.*)/ ) { - push( @eval_expr, ($1 eq "") ? shift @ARGV : $1); - } elsif ( /^t(.*)/ ) { - $template_name = ($1 eq "") ? shift @ARGV : $1; - } elsif ( /^o(.*)/ ) { - $outfile = ($1 eq "") ? shift @ARGV : $1; - ($outfile eq "-") && ($outfile = ""); - } elsif ( /^p(.*)/ ) { - push( @project_files, ($1 eq "") ? shift @ARGV : $1); - } elsif ( /^unix$/ ) { - $guess_os = 0; - $is_unix = 1; - } elsif ( /^win32$/ ) { - $guess_os = 0; - $is_unix = 0; - } elsif ( /^nodepend$/ ) { - $nodepend = 1; # don't generate dependencies - } elsif ( /^v$/ ) { - $verbose = 1; - } else { - &tmake_usage(); - } - } elsif ( /^\s*(?:[\w\-]+:)?\w+\s*[\+\-\*\/]?=/ ) { # project override - push( @project_extra, $_ ); - } else { - $project_name && - &tmake_error("You can only specify one project file"); - $project_name = $_; - } -} - -($project_name ne "") || &tmake_usage(); - -if ( $guess_os && ! check_unix() ) { # probably non-Unix, - $is_unix = 0; - &tmake_verb("Win32 detected"); -} -if ( ! $is_unix ) { - $obj_ext = "obj"; - $dir_sep = "\\"; -} -$outfile eq "" || open(STDOUT,">" . fix_path($outfile)) || - &tmake_error("Can't create \"$outfile\""); - -%project = (); -&ScanProject( &find_template("tmake.conf") ); -&tmake_verb("Reading the project file $project_name"); -if ( ! ($project_name =~ /\.pro$/i) && -f fix_path($project_name . ".pro") ) { - $project_name .= ".pro"; -} -$project{"PROJECT"} = $project_name; -$project{"PROJECT"} =~ s/\.pro$//i; -$project{"TARGET"} = $project{"PROJECT"}; - -unshift(@project_files,$project_name); -foreach ( @project_files ) { - if ( ! ($_ =~ /\.pro$/i) && -f fix_path($_ . ".pro") ) { - $_ .= ".pro"; - } - if ( !&ScanProject($_) ) { - &tmake_error("Can't open project file \"$_\""); - } -} -&Project( @project_extra ); - -if ( $template_name eq "" ) { - $template_name = $project{"TEMPLATE"} ? - $project{"TEMPLATE"} : "default.t"; -} - -foreach ( @eval_expr ) { - $text = ""; - eval( $_ ); - die $@ if $@; - print $text . "\n" if ($text ne ""); - $eval_done = 1; -} -if ( $eval_done ) { - &tmake_verb("Done!"); - exit 0; -} - -$template_name = &find_template($template_name); -&IncludeTemplate($template_name); -&tmake_verb("Done!"); -exit 0; # finished! - - - -############################################################################## -# Subroutines from here -############################################################################## - -# -# tmake_usage() -# -# Prints a message about program usage and exits -# - -sub tmake_usage { - print STDERR "Usage:\n tmake [options] project-file\n"; - print STDERR "Options:\n"; - print STDERR " -e expr Evaluate expression, ignore template file\n"; - print STDERR " -nodepend Don't generate dependency information\n"; - print STDERR " -o file Write output to file\n"; - print STDERR " -p project Load additional project file\n"; - print STDERR " -t file Specify a template file\n"; - print STDERR " -unix Create output for Unix (auto detects)\n"; - print STDERR " -v Verbose/debug mode\n"; - print STDERR " -win32 Create output for Win32 (auto detects)\n"; - exit 1; -} - - -# -# tmake_error(msg) -# -# Prints the message and exits -# - -sub tmake_error { - my($msg) = @_; - print STDERR "tmake error: " . $msg . "\n"; - exit 1; -} - - -# -# tmake_verb() -# -# Prints a verbose message -# - -sub tmake_verb { - my($msg) = @_; - $verbose && print STDERR "tmake: " . $msg . "\n"; -} - - -# -# check_unix() -# -# Returns 1 if this is a Unix, 0 otherwise. -# - -sub check_unix { - my($r); - $r = 0; - if ( -f "/bin/uname" ) { - $r = 1; - (-f "\\bin\\uname") && ($r = 0); - } - return $r; -} - - -# -# find_template(filename) -# -# Looks for the template file. -# 1. search the current directory -# 2. search the directories in TMAKEPATH -# 3. search in $HOME/.tmake -# - -sub find_template { - my($filename) = @_; - my($tb,$d,$p,@dirs); - $tb = ($template_base eq "") ? "" : $template_base . ";"; - $d = ";" . $tb . $ENV{"TMAKEPATH"} . ";" . $ENV{"HOME"} . "/.tmake/"; - @dirs = &split_path( $d ); - $filename .= ".t" unless ($filename =~ /\.\w+$/); - for $d ( @dirs ) { - $p = $d . $filename; - if ( -f fix_path($p) ) { - if ( $filename eq "tmake.conf" ) { - $tmake_platform = $d; - $tmake_platform =~ s-.*[/\\]([^/\\]*)[/\\]-$1-; - &tmake_verb("Detected platform $tmake_platform"); - } - return $p; - } - return ($d . $filename) if ( -f fix_path($d . $filename) ); - } - &tmake_error("Template file " . $filename . " not found"); -} - - -############################################################################## -# User functions -############################################################################## - -# -# StdInit() -# -# Standard initialization -# - -sub StdInit { - my($p); - return if $stdinit_done; - $stdinit_done = 1; - if ( defined($project{"OBJECTS_DIR"}) ) { - $project{"OBJECTS_DIR"} = FixPath($project{"OBJECTS_DIR"}); - } - if ( defined($project{"MOC_DIR"}) ) { - $project{"MOC_DIR"} = FixPath($project{"MOC_DIR"}); - } - $project{"OBJECTS"} = &Objects($project{"SOURCES"}); - if ( $moc_aware ) { - $project{"_HDRMOC"} = &list_moc($project{"HEADERS"},$moc_pre,$cpp_ext); - $project{"_SRCMOC"} = &list_moc($project{"SOURCES"},"",$moc_ext); - $project{"OBJMOC"} = &Objects($project{"_HDRMOC"}); - $p = $project{"_HDRMOC"} . " " . $project{"_SRCMOC"}; - $p =~ s/(^\s+|\s+$)//g; - $project{"SRCMOC"} = $p; - } - &AddIncludePath(""); -} - - -sub FixPath { - my($p) = @_; - if ( $p eq "." ) { $p = ""; } - elsif ( length($p) > 0 ) { - $p .= $dir_sep; - $p =~ s-[\\/]+-${dir_sep}-g; - } - return $p; -} - - -# -# Config(name) -# -# Returns true if the project variable CONFIG contains the -# configuration name. -# - -sub Config { - my($name) = @_; - return $project{"CONFIG"} =~ /\b$name\b/; -} - - -# -# DisableOutput() -# -# Disables tmake output. Must be restored by calling a corresponding -# EnableOutput(). -# - -sub DisableOutput { - $output_count++; -} - - -# -# EnableOutput() -# -# Enables tmake output again after DisableOutput() has been called. -# - -sub EnableOutput { - $output_count--; -} - - -# -# Now() - sets $text -# -# Sets $text to the current date and time. -# - -sub Now { - my($sec,$min,$hour,$mday,$mon,$year); - ($sec,$min,$hour,$mday,$mon,$year) = localtime(time()); - $text = sprintf("%02d:%02d, %4d/%02d/%02d", - $hour, $min, 1900+$year, 1+$mon, $mday); -} - - -# -# expand_project_val(tag) -# -# Internal function for Project(). -# Expands a project value string. -# - -sub expand_project_val { - my($v) = @_; - my($c); - $v =~ s/^\s+//; # trim white space - $v =~ s/\s+$//; - $c = 0; - while ( $c < 100 ) { # expand $$ - if ( $v =~ s/(\$\$\w+)/\035/ ) { - $_ = $1; - s/\$\$//g; - $v =~ s/\035/$project{$_}/g; - $c++; - } else { - $c = 100; - } - } - return $v; -} - - -# -# Project(strings) -# -# This is a powerful function for setting or reading project variables. -# Returns the resulting project variables (joined with space between). -# -# Get a project variable: -# $s = Project("TEMPLATE"); -> $s = "TEMPLATE" -# -# Set a project variable: -# Project("TEMPLATE = lib"); -> TEMPLATE = lib -# Project("CONFIG =";) -> CONFIG empty -# -# Append to a project variable: -# Project("CONFIG = qt"); -> CONFIG = qt -# Project("CONFIG += debug"); -> CONFIG = qt debug -# -# Append to a project variable if it does not contain the value already: -# Project("CONFIG = qt release"); -> CONFIG = qt release -# Project("CONFIG *= qt"); -> CONFIG = qt release -# Project("CONFIG *= opengl"); -> CONFIG = qt release opengl -# -# Subtract from a project variable: -# Project("THINGS = abc xyz"); -> THINGS = abc xyz -# Project("THINGS -= abc"); -> THINGS = xyz -# -# Search/replace on a project variable: -# Project("CONFIG = tq opengl"); -> CONFIG = tq opengl -# Project("CONFIG /= s/tq/qt/"); -> CONFIG = qt opengl -# -# The operations can be performed on several project variables at a time. -# -# Project("TEMPLATE = app", "CONFIG *= opengl", "THINGS += klm"); -# - -sub Project { - my @settings = @_; - my($r,$if_tag,$t,$s,$v,$p,$c); - $r = ""; - foreach ( @settings ) { - $v = $_; - if ( $v =~ s/^\s*([\w\-]+:)?(\w+)\s*(\+=|\*=|\-=|\/=|=)\s*// ) { - $if_tag = $1; - if ( $if_tag ne "" ) { - chop $if_tag; - if ( $if_tag eq "unix" ) { - return "" if !$is_unix; - } elsif ( $if_tag eq "win32" ) { - return "" if $is_unix; - } elsif ( ($if_tag ne $tmake_platform) && !Config($if_tag) ) { - return ""; - } - } - $t = $2; - $s = $3; - $v = expand_project_val($v); - $p = $project{$t}; - if ( $s eq "=" ) { # set variable - $p = $v; - } elsif ( $s eq "+=" ) { # append - if ( $p eq "" ) { - $p = $v; - } else { - $p .= " " . $v; - } - } elsif ( $s eq "*=" ) { # append if not contained - if ( !($p =~ /(?:^|\s)\Q$v\E(?:\s|$)/) ) { - if ( $p eq "" ) { - $p = $v; - } else { - $p .= " " . $v; - } - } - } elsif ( $s eq "-=" ) { # subtract - $p =~ s/$v//g; - } elsif ( $s eq "/=" ) { # sed - $cmd = '$p =~ ' . $v; - eval $cmd; - } - $project{$t} = expand_project_val($p); - } else { - $p = expand_project_val($project{$v}); - } - if ( $p ne "" ) { - $r = ($r eq "") ? $p : ($r . " " . $p); - } - } - return $r; -} - - -# -# Substitute(string) -# -# This function substitutes project variables in a text. -# -# Example: -# Substitute('The project name is "$$PROJECT"') -# - -sub Substitute { - my($subst) = @_; - $text = expand_project_val($subst); - return $text; -} - - -# -# ScanProject(file) -# -# Scans a project file. Inserts project variables into the global -# associative project array. -# - -sub ScanProject { - my($file) = @_; - my($tag,$var,@v,$more,$line); - - $tag = ""; - $line = 0; - open(TMP,fix_path($file)) || return 0; - - while ( <TMP> ) { - $line++; - s/\#.*//; # strip comment - s/^\s+//; # strip white space - s/\s+$//; - if ( /^\s*((?:[\w\-]+:)?\w+\s*(\+|\-|\*|\/)?=)/ ) { - $tag = $1; # tag also contains the ".=" - s/^.*?=\s*//; - } - if ( $tag ne "" ) { - $more = ( $_ =~ s/\s*\\\s*$// ); # more if \ at end of line - push( @v, split( /\s+/, $_ ) ); - if ( ! $more ) { - $var = join(" ",@v); - Project( $tag . $var ); - $tag = ""; - @v = (); - } - } elsif ( $_ ne "" ) { - tmake_error("$file:$line: Syntax error"); - } - } - close(TMP); - return 1; -} - - -# -# IncludeTemplate(template_name) -# -# Includes and processes a template file. -# -# Below, we read the template file and executes any perl code found. -# Perl code comes after "#$". The variable $text contains the text -# to replace the perl code that was executed. -# Template comments begin with "#!". -# - -sub IncludeTemplate { - my($t_name) = @_; - my($cmd,$cmd_block,$cmd_end,$is_cmd_block,$saveline,$spaceonly); - local($text); - local(*T); - - $t_name = &find_template($t_name); - if ( $tmake_template_dict{$t_name} ) { - &tmake_error("Cyclic template inclusion for $t_name"); - } else { - $tmake_template_dict{$t_name} = 1; - } - $template_base = $t_name; - $template_base =~ s-(.*[/\\]).*-$1-; - &tmake_verb("Reading the template $t_name"); - open(T,fix_path($t_name)) || - &tmake_error("Can't open template file \"$t_name\""); - - while ( <T> ) { - if ( /\#\!/ ) { # tmake comment - s/\s*\#\!.*//; - next if /^$/; - } - if ( /\#\$(\{)?\s*(.*)\n/ ) { # code - $cmd = $2; - $is_cmd_block = ($1 eq "{"); - s/\#\$.*\n//; - if ( $is_cmd_block ) { # code block #${ ... - $saveline = $_; - $cmd_block = $cmd; - $cmd_end = 0; - while ( <T> ) { - $cmd = $_; - $cmd =~ s/\s*\#\!.*//; # tmake comment - if ( $cmd =~ /^\s*\#\$\}/ ) { - $_ = ""; - $cmd_end = 1; - last; - } - $cmd =~ s/^\s*\#(\$)?\s*//; - $cmd_block .= $cmd; - } - $cmd_end || &tmake_error('#$} expected but not found'); - $cmd = $cmd_block; - $_ = $saveline; - } - $spaceonly = /^\s*$/; - $saveline = $_; - &tmake_verb("Evaluate: $cmd"); - $text = ""; - eval $cmd; - die $@ if $@; - next if $spaceonly && ($text =~ /^\s*$/); - print $saveline . $text . "\n" if $output_count <= 0; - } else { # something else - print if $output_count <= 0; - } - } - close( T ); -} - - -# -# Expand(tag) - appends to $text -# -# Expands a list of $project{} variables with a space character between them. -# - -sub Expand { - my @tags = @_; - my($t); - $t = Project(@tags); - if ( $text eq "" ) { - $text = $t; - } elsif ( $t ne "" ) { - $text .= " " . $t; - } - return $text; -} - - -# -# ExpandGlue(tag,prepend,glue,append) - appends to $text -# -# Expands a $project{} tag, splits on whitespace -# and joins with $glue. $prepend is put at the start -# of the string and $append is put at the end of the -# string. The resulting string becomes "" if the project -# tag is empty or not defined. -# -# Example: -# -# The project file defines: -# SOURCES = a b c -# -# ExpandGlue("SOURCES","<","-",">") -# -# The result: -# $text = "<a-b-c>" -# - -sub ExpandGlue { - my($tag,$prepend,$glue,$append) = @_; - my($t,$v); - $v = Project($tag); - if ( $v eq "" ) { - $t = ""; - } else { - $t = $prepend . join($glue,split(/\s+/,$v)) . $append; - } - if ( $text eq "" ) { - $text = $t; - } elsif ( $t ne "" ) { - $text .= " " . $t; - } - return $text; -} - - -# -# ExpandList(tag) - sets $text. -# -# Suitable for expanding HEADERS = ... etc. in a Makefile -# - -sub ExpandList { - my($tag) = @_; - return ExpandGlue($tag,""," ${linebreak}\n\t\t",""); -} - - -# -# TmakeSelf() -# -# Generates makefile rule to regenerate the makefile using tmake. -# - -sub TmakeSelf { - my $a = "tmake $project_name"; - if ( $nodepend ) { - $a .= " -nodepend"; - } - if ( $outfile ) { - $text = "tmake: $outfile\n\n$outfile: $project_name\n\t"; - $a .= " -o $outfile"; - } else { - $text = "tmake:\n\t"; - } - $text .= $a -} - - -# -# Objects(files) -# -# Replaces any extension with .o ($obj_ext). -# - -sub Objects { - local($_) = @_; - my(@a); - @a = split(/\s+/,$_); - foreach ( @a ) { - s-\.\w+$-.${obj_ext}-; - if ( defined($project{"OBJECTS_DIR"}) ) { - s-^.*[\\/]--; - $_ = $project{"OBJECTS_DIR"} . $_; - } - } - return join(" ",@a); -} - - -# -# list_moc(files,prefix,extension) -# -# Scans all files and selects all files that contain Q_OBJECT. -# Insert a prefix before the filename and replaces the filename extention. -# - -sub list_moc { - my($files,$pre,$ext) = @_; - my(@v,@m,@lines,$contents,$n,$f,$t); - @v = split(/\s+/,$files); - undef $/; - foreach $f ( @v ) { - if ( open(TMP,fix_path($f)) ) { - $contents = <TMP>; - close(TMP); - $n = 0; - @lines = split(/\n/,$contents); - grep( /tmake\s+ignore\s+Q_OBJECT/ && $n--, @lines ); - $contents =~ s-/\*.*?\*/--gs; # strip C/C++ comments - $contents =~ s-//.*\n--g; - @lines = split(/\n/,$contents); - grep( /(^|\W)Q_OBJECT(\W|$)/ && $n++, @lines ); - if ( $n > 0 ) { - $t = $f; - $t =~ s-^(.*[/\\])?([^/\\]*?)\.(\w+)$-$1${pre}$2.${ext}-; - if ( defined($project{"MOC_DIR"}) ) { - $t =~ s-^.*[\\/]--; - $t = $project{"MOC_DIR"} . $t; - } - $moc_output{$f} = $t; - $moc_input{$t} = $f; - push(@m,$t); - } - $contents = ""; - } - } - $/ = "\n"; - return join(" ",@m); -} - - -# -# BuildObj(objects,sources) -# -# Builds the object files. -# - -sub BuildObj { - my($obj,$src) = @_; - my(@objv,$srcv,$i,$s,$o,$d,$c); - @objv = split(/\s+/,$obj); - @srcv = split(/\s+/,$src); - for $i ( 0..$#objv ) { - $s = $srcv[$i]; - $o = $objv[$i]; - next if $s eq ""; - $text .= $o . ": " . $s; - if ( $moc_output{$s} ne "" ) { - $text .= " ${linebreak}\n\t\t" . $moc_output{$s}; - } - $d = &make_depend($s); - $text .= " ${linebreak}\n\t\t" . $d if $d ne ""; - if ( defined($project{"OBJECTS_DIR"}) || - !defined($project{"TMAKE_COMPILE_IMP"}) ) { - $c = $project{"TMAKE_COMPILE"}; - $c =~ s/\$src/$s/; - $c =~ s/\$obj/$o/; - $text .= "\n\t$c"; - } - $text .= "\n\n"; - } - chop $text; -} - - -# -# BuildMocObj(objects,sources) -# -# Builds the moc object files. -# - -sub BuildMocObj { - my($obj,$src) = @_; - my(@objv,$srcv,$i,$s,$o,$hdr,$d); - @objv = split(/\s+/,$obj); - @srcv = split(/\s+/,$src); - for $i ( 0..$#objv ) { - $s = $srcv[$i]; - $o = $objv[$i]; - $hdr = $moc_input{$srcv[$i]}; - $text .= $o . ": " . $s . " ${linebreak}\n\t\t" . $hdr; - $d = &make_depend($hdr); - $text .= " ${linebreak}\n\t\t" . $d if $d ne ""; - if ( defined($project{"OBJECTS_DIR"}) || defined($project{"MOC_DIR"})|| - !defined($project{"TMAKE_COMPILE_IMP"}) ) { - $c = $project{"TMAKE_COMPILE"}; - $c =~ s/\$src/$s/; - $c =~ s/\$obj/$o/; - $text .= "\n\t$c"; - } - $text .= "\n\n"; - } - chop $text; -} - - -# -# BuildMocSrc(files) -# -# Builds the moc source files from headers and sources. -# - -sub BuildMocSrc { - my($f) = @_; - my(@v,$m,$o); - @v = split(/\s+/,$f); - foreach $m ( @v ) { - $o = $moc_output{$m}; - if ( $o ne "" ) { - $text .= "$o: $m\n\t$moc_cmd $m -o $o\n\n"; - } - } - chop $text; -} - - -# -# AddIncludePath(path) -# -# Adds path to the current include path, $project{"INCLUDEPATH"}. -# - -sub AddIncludePath { - my($path) = @_; - my($p); - if ( $project{"INCPATH"} && - ($project{"INCPATH"} =~ /(?:^|\s)\Q$path\E(?:\s|$)/) ) { - return; - } - $p = $project{"INCLUDEPATH"}; - $p = ($p && $path) ? ($p . ";" . $path) : ($p . $path); - $project{"INCLUDEPATH"} = $p; - $p = join(" ",&split_path($p)); - $p =~ s=[\\/](\s|$)= =g; - $project{"INCPATH"} = $p; -} - - -# -# FindHighestLibVersion(dir,name) -# -# Returns the newest library version. Scans all the files in the specifies -# directory and returns the highest version number. -# -# Used on Windows only. -# -# Example: -# FindHighestLibVersion("c:\qt\lib","qt") returns "200" if -# the c:\qt\lib directory contains qt141.lib and qt200.lib. -# - -sub FindHighestLibVersion { - my($dir,$name) = @_; - my(@files,$f,$v,$highest); - $highest = ""; - @files = find_files($dir,"${name}.*\.lib"); - for $f ( @files ) { - if ( $f =~ /(\d+)\.lib/ ) { - $v = $1; - if ( $highest eq "" || $v > $highest ) { - $highest = $v; - } - } - } - return $highest; -} - - -# -# Finds files. -# -# Examples: -# find_files("/usr","\.cpp$",1) - finds .cpp files in /usr and below -# find_files("/tmp","^#",0) - finds #* files in /tmp -# - -sub find_files { - my($dir,$match,$descend) = @_; - my($file,$p,@files); - local(*D); - $dir =~ s=\\=/=g; - ($dir eq "") && ($dir = "."); - if ( opendir(D,fix_path($dir)) ) { - if ( $dir eq "." ) { - $dir = ""; - } else { - ($dir =~ /\/$/) || ($dir .= "/"); - } - foreach $file ( readdir(D) ) { - next if ( $file =~ /^\.\.?$/ ); - $p = $dir . $file; - if ( $is_unix ) { - ($file =~ /$match/) && (push @files, $p); - } else { - ($file =~ /$match/i) && (push @files, $p); - } - if ( $descend && -d $p && ! -l $p ) { - push @files, &find_files($p,$match,$descend); - } - } - closedir(D); - } - return @files; -} - - -# -# make_depend(file) -# -# Returns a list of included files. -# Uses the global $depend_path variable. -# - -sub make_depend { - my($file) = @_; - my($i,$count); - if ( $nodepend ) { - return ""; - } - if ( ! $depend_path_fixed ) { - $depend_path_fixed = 1; - $depend_path = $project{"DEPENDPATH"}; - $count = 0; - while ( $count < 100 ) { - if ( $depend_path =~ s/(\$[\{\(]?\w+[\}\)]?)/035/ ) { - $_ = $1; - s/[\$\{\}\(\)]//g; - $depend_path =~ s/035/$ENV{$_}/g; - } else { - $count = 100; - } - } - @dep_path = &split_path($depend_path); - } - @cur_dep_path = @dep_path; - if ( $file =~ /(.*[\/\\])/ ) { - $dep_curdir = $1; - splice( @cur_dep_path, 0, 0, $dep_curdir ); - } else { - $dep_curdir = ""; - } - $dep_file = $file; - &canonical_dep($file); - %dep_dict = (); - $i = &build_dep($file); - chop $i; - $i =~ s=/=$dir_sep=g unless $is_unix; - $i =~ s=([a-zA-Z]):/=//$1/=g if $gnuwin32; - return join(" ${linebreak}\n\t\t",split(/ /,$i) ); -} - -# -# build_dep() - Internal for make_depend() -# - -sub build_dep { - my($file) = @_; - my(@i,$a,$n); - $a = ""; - return $a if !(defined $depend_dict{$file}); - @i = split(/ /,$depend_dict{$file}); - for $n ( @i ) { - if ( !defined($dep_dict{$n}) && defined($full_path{$n}) ) { - $dep_dict{$n} = 1; - $a .= $full_path{$n} . " " . &build_dep($n); - } - } - return $a; -} - -# -# canonical_dep(file) - Internal for make_depend() -# -# Reads the file and all included files recursively. -# %depend_dict associates a file name to a list of included files. -# - -sub canonical_dep { - my($file) = @_; - my(@inc,$i); - @inc = &scan_dep($file); - if ( @inc ) { - $depend_dict{$file} = join(" ",@inc); - for $i ( @inc ) { - &canonical_dep($i) if !defined($depend_dict{$i}); - } - } -} - -# -# scan_dep(file) - Internal for make_depend() -# -# Returns an array of included files. -# - -sub scan_dep { - my($file) = @_; - my($dir,$path,$found,@allincs,@includes,%incs); - $path = ($file eq $dep_file) ? $file : $dep_curdir . $file; - @includes = (); - return @includes if $file =~ /\.$moc_ext$/; # avoid .moc files - if ( ! (-f fix_path($path)) ) { - $found = 0; - for $dir ( @cur_dep_path ) { - $path = $dir . $file; - last if ( $found = (-f fix_path($path)) ); - } - return @includes if ! $found; - } - undef $/; - if ( open(TMP,fix_path($path)) ) { - $full_path{$file} = $path; - $_ = <TMP>; - s-/\*.*?\*/--gs; # strip C/C++ comments - s-//.*\n-\n-g; - @allincs = split(/\n/,$_); - @allincs = grep(/^\s*#\s*include/,@allincs); - foreach ( @allincs ) { # all #include lines - next if !(/^\s*#\s*include\s+[<"]([^>"]*)[>"]/) || defined($incs{$1}); - push(@includes,$1); - $incs{$1} = "1"; - } - close(TMP); - } - $/ = "\n"; - return @includes; -} - - -# -# split_path(path) -# -# Splits a path containing : (Unix) or ; (MSDOS, NT etc.) separators. -# Returns an array. -# - -sub split_path { - my($p) = @_; - $p =~ s=:=;=g if $is_unix; - $p =~ s=[/\\]+=/=g; - $p =~ s=([^/:]);=$1/;=g; - $p =~ s=([^:;/])$=$1/=; - $p =~ s=/=$dir_sep=g unless $is_unix; - return split(/;/,$p); -} - - -# -# fix_path(path) -# -# Converts all '\' to '/' if this really seems to be a Unix box. -# - -sub fix_path { - my($p) = @_; - if ( $really_unix ) { - $p =~ s-\\-/-g; - } else { - $p =~ s-/-\\-g; - } - return $p; -} -__END__ -:endofperl |