Kaydet (Commit) fdd2d4f7 authored tarafından Lars Langhans's avatar Lars Langhans

some changes for code generation.

üst 4ac69871
...@@ -20,22 +20,27 @@ my @sMethodNames; ...@@ -20,22 +20,27 @@ my @sMethodNames;
my @sClassNameStack; my @sClassNameStack;
my @sFilenameStack; my @sFilenameStack;
my $sCurrentFilename; my $sCurrentFilename;
my $nNoAdditionalAnyMore = 0;
my $bShowDemo = 1; my $bShowDemo = 1;
my $sSrcExt = ".cxx";
# ------------------------------------------------------------------------------ # ------------------------------------------------------------------------------
sub createFilename sub createFilename
{ {
my $sPackageName = shift; my $sPackageName = shift;
my $sFilename = "$sPackageName.cxx"; my $sFilenameCounter = "$sPackageName$sSrcExt";
while ( -e $sFilename) my $sFilename = "$sPackageName";
my $nCount = 0;
while ( -e $sFilenameCounter)
{ {
$nCount ++; $nCount ++;
$sFilename = "$sPackageName" . "_$nCount"; $sFilename = "$sPackageName" . "_$nCount";
$sFilenameCounter = "$sFilename$sSrcExt";
} }
push(@sFilenameStack, $sFilename); push(@sFilenameStack, $sFilename);
$sCurrentFilename = $sFilename . ".cxx"; $sCurrentFilename = $sFilenameCounter;
return $sFilename; return $sFilenameCounter;
} }
# ------------------------------------------------------------------------------ # ------------------------------------------------------------------------------
...@@ -44,14 +49,13 @@ sub generateNewPackage ...@@ -44,14 +49,13 @@ sub generateNewPackage
my $sPackageName = shift; my $sPackageName = shift;
my $sFilename = createFilename($sPackageName); my $sFilename = createFilename($sPackageName);
open(CPPFILE, ">$sFilename") || die "can't create cxx source file"; open(CPPFILE, ">$sFilename") || die "can't create source file";
print CPPFILE "// autogenerated file with codegen.pl\n"; print CPPFILE "// autogenerated file with codegen.pl\n";
print CPPFILE "\n"; print CPPFILE "\n";
print CPPFILE "#include <cppunit/simpleheader.hxx>\n"; print CPPFILE "#include <cppunit/simpleheader.hxx>\n";
print CPPFILE "\n"; print CPPFILE "\n";
print CPPFILE "namespace $sPackageName\n"; print CPPFILE "namespace $sPackageName\n";
print CPPFILE "{\n"; print CPPFILE "{\n";
} }
# ------------------------------------------------------------------------------ # ------------------------------------------------------------------------------
...@@ -61,6 +65,7 @@ sub generateNewClass ...@@ -61,6 +65,7 @@ sub generateNewClass
print CPPFILE "\n"; print CPPFILE "\n";
print CPPFILE "class $sClassName : public CppUnit::TestFixture\n"; print CPPFILE "class $sClassName : public CppUnit::TestFixture\n";
print CPPFILE "{\n"; print CPPFILE "{\n";
print CPPFILE "public:\n";
} }
# ------------------------------------------------------------------------------ # ------------------------------------------------------------------------------
sub closeMethods sub closeMethods
...@@ -184,18 +189,25 @@ sub closePackage ...@@ -184,18 +189,25 @@ sub closePackage
print CPPFILE "} // namespace $sCurrentPackage\n"; print CPPFILE "} // namespace $sCurrentPackage\n";
print CPPFILE "\n"; print CPPFILE "\n";
print CPPFILE " print CPPFILE "
// ----------------------------------------------------------------------------- // -----------------------------------------------------------------------------
// this macro creates an empty function, which will called by the RegisterAllFunctions() // this macro creates an empty function, which will called by the RegisterAllFunctions()
// to let the user the possibility to also register some functions by hand. // to let the user the possibility to also register some functions by hand.
NOADDITIONAL;
"; ";
# if the variable nNoAdditionalAnyMore is set to one, we insert a remark before
# the macro NOADDITIONAL; to prevent us from linker problems.
if ($nNoAdditionalAnyMore == 1)
{
print CPPFILE "// ";
}
print CPPFILE "NOADDITIONAL;\n";
print CPPFILE "\n"; print CPPFILE "\n";
close(CPPFILE); close(CPPFILE);
push(@sPackageStack, $sCurrentPackage); $nNoAdditionalAnyMore = 1;
$sCurrentPackage = ""; $sCurrentPackage = "";
} }
...@@ -220,6 +232,7 @@ sub walkThroughJobFile ...@@ -220,6 +232,7 @@ sub walkThroughJobFile
open(FILE, $filename) || die "can't open $filename\n"; open(FILE, $filename) || die "can't open $filename\n";
print "start jobfile interpreter.\n";
while($line = <FILE>) while($line = <FILE>)
{ {
chomp($line); chomp($line);
...@@ -238,11 +251,27 @@ sub walkThroughJobFile ...@@ -238,11 +251,27 @@ sub walkThroughJobFile
if ($line =~ /^\w+/) # must start with a word character if ($line =~ /^\w+/) # must start with a word character
{ {
# print "$line\n"; # print "$line\n";
my ($sPackageName, $sClassName, $sMethodName); my $sPackageName = "";
($sPackageName, $sClassName, $sMethodName) = split(/\./, $line); my $sClassName = "";
my $sMethodName = "";
my @names;
@names = split(/\./, $line);
if (exists $names[0])
{
$sPackageName = $names[0];
}
if (exists $names[1])
{
$sClassName = $names[1];
}
if (exists $names[2])
{
$sMethodName = $names[2];
}
if ($sClassName =~ /^$/) if ($sClassName =~ /^$/)
{ {
print "error: in $line, no class name exist.\n"; print "error: in $line, no class name exist. Build no code.\n";
} }
# test if it also works without methods # test if it also works without methods
# elsif ($sMethodName =~ /^$/) # elsif ($sMethodName =~ /^$/)
...@@ -253,10 +282,10 @@ sub walkThroughJobFile ...@@ -253,10 +282,10 @@ sub walkThroughJobFile
{ {
if ($sMethodName =~ /^$/) if ($sMethodName =~ /^$/)
{ {
print "warning: in $line, no method name exist, create only on pseudo member function.\n"; print "warning: in $line, no method name exist, create only one member function.\n";
} }
print "$sPackageName :: $sClassName :: $sMethodName\n"; print "build code for: ${sPackageName}.${sClassName}.${sMethodName}\n";
if ($sCurrentPackage ne $sPackageName) if ($sCurrentPackage ne $sPackageName)
{ {
...@@ -285,20 +314,126 @@ sub walkThroughJobFile ...@@ -285,20 +314,126 @@ sub walkThroughJobFile
closePackage(); closePackage();
close(FILE); close(FILE);
# generate makefile print "done.\n\nThe following files are created:\n";
generateMakefileEntry("test");
foreach $sFilename (@sFilenameStack)
{
print " ${sFilename}${sSrcExt}\n";
}
print "\n";
} }
# ------------------------------------------------------------------------------ # ------------------------------------------------------------------------------
sub generateMakefileEntry sub checkMakefileNumber
{ {
my $sTargetName = shift; my $sTargetName = shift;
# This function gives back the lowest number for SHL\dTARGET
open(MAKEFILE, "makefile.mk") || return -1;
my $line;
my $nNumber; my $nNumber;
$nNumber = 1; my @aNumbers;
my $i;
for($i = 1;$i < 10;$i++)
{
$aNumbers[$i] = 0;
}
my $nReplacePos = -1;
while($line = <MAKEFILE>)
{
chomp($line);
if ($line =~ /^SHL(\d)TARGET/)
{
$aNumbers[$1] = 1;
$line =~ /^SHL(\d)TARGET=\s*(\S+)\s*/;
open(MAKEFILE, ">makefile.add") || die "can't open makefile.add"; print "Target: $2\n";
if ($sTargetName eq $2)
{
print "info: Targetname already exist.\n";
$nReplacePos = $1;
}
}
}
close(MAKEFILE);
print MAKEFILE "SHL" . $nNumber . "OBJS= "; my $nFirstFree = 0;
for($i = 1;$i < 10;$i++)
{
if ($aNumbers[$i] == 0)
{
$nFirstFree = $i;
last;
}
}
return $nFirstFree, $nReplacePos;
}
# ------------------------------------------------------------------------------
sub createNewMakefile
{
$sNewMakefileName = shift;
my $sTargetName = shift;
my $nNumber = shift;
# this function split a makefile into two parts,
open(MAKEFILE, "makefile.mk") || return;
my @lines = <MAKEFILE>;
close(MAKEFILE);
# print "info: Makefile has $#lines lines.\n";
# search a point, where to insert the new makefile part.
my $nTargetMK = -1;
for ($i = $#lines; $i > 0; $i--)
{
if ($lines[$i] =~ /\.INCLUDE.*target.mk\s$/)
{
$nTargetMK = $i;
last;
}
}
if ($nTargetMK > 0)
{
# print "info: target.mk found, is in line $nTargetMK\n";
# print "@lines[0]";
# print "@lines[1]";
# print "@lines[2]";
# print "@lines[$nTargetMK - 2]";
# print "@lines[$nTargetMK - 1]";
# print "@lines[$nTargetMK]";
open(MAKEFILE, ">$sNewMakefileName") || return;
for ($i = 0;$i < ($nTargetMK - 2); $i++)
{
print MAKEFILE $lines[$i];
}
generateMakefileEntry($sTargetName, $nNumber);
for ($i = ($nTargetMK - 2);$i <= $#lines; $i++)
{
print MAKEFILE $lines[$i];
}
close(MAKEFILE);
}
}
# ------------------------------------------------------------------------------
sub generateMakefileEntry
{
# my MAKEFILE = shift;
my $sTargetName = shift;
my $nNumber = shift;
# open(MAKEFILE, ">makefile.add") || die "can't open makefile.add";
print MAKEFILE "# BEGIN ----------------------------------------------------------------\n";
print MAKEFILE "# auto generated Target:$sTargetName by codegen.pl \n";
print MAKEFILE "SHL${nNumber}OBJS= ";
foreach $sFilename (@sFilenameStack) foreach $sFilename (@sFilenameStack)
{ {
print MAKEFILE " \\\n"; print MAKEFILE " \\\n";
...@@ -307,33 +442,44 @@ sub generateMakefileEntry ...@@ -307,33 +442,44 @@ sub generateMakefileEntry
print MAKEFILE "\n\n"; print MAKEFILE "\n\n";
# targetname # targetname
print MAKEFILE "SHL" . $nNumber . "TARGET= $sTargetName\n"; print MAKEFILE "SHL${nNumber}TARGET= $sTargetName\n";
# additional libraries # additional libraries
print MAKEFILE "SHL" . $nNumber . "STDLIBS=\\\n"; print MAKEFILE "SHL${nNumber}STDLIBS=\\\n";
print MAKEFILE " \$(SALLIB) \n"; print MAKEFILE " \$(SALLIB) \n";
# link static cppunit library # link static cppunit library
print MAKEFILE ".IF \"\$(GUI)\" == \"WNT\"\n"; print MAKEFILE ".IF \"\$(GUI)\" == \"WNT\"\n";
print MAKEFILE "SHL" . $nNumber . "STDLIBS+= \$(SOLARLIBDIR)\$/cppunit.lib\n"; print MAKEFILE "SHL${nNumber}STDLIBS+= \$(SOLARLIBDIR)\$/cppunit.lib\n";
print MAKEFILE ".ENDIF\n"; print MAKEFILE ".ENDIF\n";
print MAKEFILE ".IF \"\$(GUI)\" == \"UNX\"\n"; print MAKEFILE ".IF \"\$(GUI)\" == \"UNX\"\n";
print MAKEFILE "SHL" . $nNumber . "STDLIBS+=\$(SOLARLIBDIR)\$/libcppunit\$(DLLPOSTFIX).a\n"; print MAKEFILE "SHL${nNumber}STDLIBS+=\$(SOLARLIBDIR)\$/libcppunit\$(DLLPOSTFIX).a\n";
print MAKEFILE ".ENDIF\n"; print MAKEFILE ".ENDIF\n";
print MAKEFILE "\n"; print MAKEFILE "\n";
print MAKEFILE "SHL" . $nNumber . "IMPLIB= i\$(SHL" . $nNumber . "TARGET)\n"; print MAKEFILE "SHL${nNumber}IMPLIB= i\$(SHL${nNumber}TARGET)\n";
print MAKEFILE "SHL" . $nNumber . "DEF= \$(MISC)\$/\$(SHL" . $nNumber . "TARGET).def\n"; print MAKEFILE "SHL${nNumber}DEF= \$(MISC)\$/\$(SHL${nNumber}TARGET).def\n";
print MAKEFILE "\n"; print MAKEFILE "\n";
# DEF name # DEF name
print MAKEFILE "DEF" . $nNumber . "NAME =\$(SHL" . $nNumber . "TARGET)\n"; print MAKEFILE "DEF${nNumber}NAME =\$(SHL${nNumber}TARGET)\n";
print MAKEFILE "DEF" . $nNumber . "EXPORTFILE= export.exp\n"; print MAKEFILE "DEF${nNumber}EXPORTFILE= export.exp\n";
print MAKEFILE "# auto generated Target:$sTargetName\n";
print MAKEFILE "# END ------------------------------------------------------------------\n\n";
close(MAKEFILE); # close(MAKEFILE);
}
if (! -e "export.exp") # ------------------------------------------------------------------------------
{ sub usage
open(EXPORTEXP, ">export.exp") || die "can't create export.exp"; {
print EXPORTEXP "registerAllTestFunction\n"; print "usage:\ncodegen.pl joblist\n";
close(EXPORTEXP); print "\n(c) Sun Microsystems Inc. 2002\n";
} print "
This is a testshl2 codegenerator which creates compilable C++ source files
with stub functions for all given test routines from the jobfile.
Also generate a makefile entry which is insert in the makefile.new
if a makefile.mk already exist or this tool creates a makefile.add. Which
has to add into a new makefile.mk by hand.
Also generate a export.exp file, if no one exist.
";
exit(1);
} }
# -------------------------------- main function -------------------------------- # -------------------------------- main function --------------------------------
...@@ -344,10 +490,62 @@ sub main ...@@ -344,10 +490,62 @@ sub main
usage(); usage();
} }
my $jobfile = $ARGV[0]; my $jobfile = $ARGV[0];
my $sTargetName;
if ($#ARGV < 2)
{
# remove .sce
$sTargetName = $jobfile;
$sTargetName =~ s/\.\w*//;
}
else
{
$sTargetName = $ARGV[1];
}
print "Test code generator\n\n";
print "Test code generator\n"; if (! -e $jobfile)
{
print "error: given jobfile $jobfile doesn't exist.\n";
exit(1);
}
walkThroughJobFile($jobfile); walkThroughJobFile($jobfile);
# generate makefile
if (-e "makefile.mk")
{
my $n;
my $nReplacePos;
($n, $nReplacePos) = checkMakefileNumber($sTargetName);
# $n == -1 no makefile
# $n == 0 no free number
# $n 1..9 ok.
if ($n > 0)
{
my $sNewMakefileName = "makefile.new";
print "Makefile: Add the 'SHL${n}TARGET' to the file '$sNewMakefileName'\n";
createNewMakefile($sNewMakefileName, $sTargetName, $n);
}
}
else
{
print "warning: no makefile found, please add the content of makefile.add to a makefile.mk file\n";
open(MAKEFILE, ">makefile.add");
generateMakefileEntry($sTargetName, 1);
close(MAKEFILE);
}
print "\n";
if (! -e "export.exp")
{
print "info: create export.exp file\n";
open(EXPORTEXP, ">export.exp") || die "can't create export.exp";
print EXPORTEXP "registerAllTestFunction\n";
close(EXPORTEXP);
}
else
{
print "The file 'export.exp' file already exist, please make sure that it contain an entry 'registerAllTestFunction'.\n";
}
} }
# ------------------------------------------------------------------------------ # ------------------------------------------------------------------------------
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment