523 lines
12 KiB
Plaintext
Executable File
523 lines
12 KiB
Plaintext
Executable File
#!yab
|
|
|
|
//////////////////////////////////////
|
|
// BuildFactory v 2.4
|
|
//////////////////////////////////////
|
|
|
|
// find out in which directory we are
|
|
if (peek("isbound")) then
|
|
This_dir$ = peek$("directory")+"/"
|
|
else
|
|
This_dir$ = trim$(system$("pwd"))+"/"
|
|
fi
|
|
|
|
if (system("test -e \""+This_dir$+"yab\"")) then
|
|
YAB$ = "yab"
|
|
else
|
|
YAB$ = This_dir$+"yab"
|
|
fi
|
|
|
|
/////////////////////////////////////////////////////////////
|
|
// if yab gives us its version, we know that it exists.
|
|
// Otherwise we tell the user to make sure that there is one
|
|
/////////////////////////////////////////////////////////////
|
|
if (system(YAB$+" -version")) then
|
|
print "Please make sure you have a yab binary in"
|
|
print "\t"+left$(This_dir$, len(This_dir$)-1)
|
|
print "or"
|
|
print "\t/home/config/bin"
|
|
print "or"
|
|
print "\t/system/bin\n"
|
|
exit 1
|
|
fi
|
|
|
|
// set some global variables here
|
|
AppName$ = "BuildFactory"
|
|
VERSION$ = " 2.4.1"
|
|
TMP_folder$ = "/boot/var/tmp/BUILD_FACTORY_TMP/"
|
|
Lib_path$ = "/boot/home/config/settings/yab/"
|
|
|
|
dim Library$(1)
|
|
dim Is_in_lib_path(1)
|
|
dim Found_sub$(1)
|
|
|
|
/////////////////////////////////////////////////////////////
|
|
// Program starts here
|
|
//
|
|
|
|
if (not open(1,"flex.c")) then
|
|
system("yab flex-bison.yab") // make flex.c and modify it for BuildFactory
|
|
else
|
|
close #1
|
|
endif
|
|
|
|
if (peek("argument") < 2) then
|
|
UsageAdvise(1)
|
|
fi
|
|
|
|
// in- and outputfiles
|
|
Output_file$ = peek$("argument")
|
|
Input_file$ = peek$("argument")
|
|
appsig$ = peek$("argument")
|
|
run_from_ide$ = peek$("argument")
|
|
if appsig$="" appsig$=getappsig$(Input_file$)
|
|
if appsig$="" appsig$="application/x-vnd.yab-app"
|
|
SetAppSig(appsig$)
|
|
|
|
Input_dir$ = left$(Input_file$, rinstr(Input_file$, "/"))
|
|
Library$(0) = right$(Input_file$, len(Input_file$)-rinstr(Input_file$, "/"))
|
|
|
|
if (trim$(Input_dir$) = "") Input_dir$ = This_dir$
|
|
|
|
// create the temp folder
|
|
if (system("test -d \""+TMP_folder$+"\"")) then
|
|
if (system("mkdir -p \""+TMP_folder$+"\"")) then
|
|
print "-- Error while creating temp folder!"
|
|
UsageAdvise(1)
|
|
fi
|
|
fi
|
|
|
|
// We clean up all the files including the libs, if existing
|
|
for NL = 0 to num_lib
|
|
if (Is_in_lib_path(NL)) then
|
|
lib$ = Lib_path$+Library$(NL)
|
|
else
|
|
lib$ = Input_dir$+Library$(NL)
|
|
fi
|
|
num_lib = CleanUpCode(lib$)
|
|
next NL
|
|
|
|
// writing all the libs into the mainfile
|
|
// because the BuildFactory can not handle libs
|
|
err = JoinFiles(Output_file$+"_bf.yab")
|
|
|
|
// here it comes - the BuildFactory
|
|
BuildFactory(Output_file$+"_bf.yab")
|
|
|
|
// cleaning up
|
|
RmErr = RemoveTemp()
|
|
system ("RdefApply parts/YAB.bf.rdef "+Output_file$)
|
|
system ("addattr -t mime BEOS:APP_SIG "+appsig$+" "+Output_file$)
|
|
system ("addattr -t mime BEOS:TYPE application/x-vnd.be-elfexecutable "+Output_file$)
|
|
system ("chmod a+x "+Output_file$)
|
|
|
|
// check if the BuildFactory was envoked by the yab-ide.
|
|
// if so, copy the output file to the inmputfile's directory and open the directory.
|
|
// the IDE will delete the output file from the BuildFactory directory.
|
|
|
|
|
|
if run_from_ide$ = "yab-ide" then
|
|
system ("cp "+Output_file$+" "+Input_dir$)
|
|
system ("open "+Input_dir$)
|
|
endif
|
|
|
|
print "--------"
|
|
print "-- Info:"
|
|
print "\tNumber of libs:\t\t", num_lib
|
|
print "\tNumber of subs:\t\t", num_sub
|
|
print "\tNumber of lines:\t", num_line
|
|
|
|
exit
|
|
|
|
//
|
|
// programm ends here
|
|
/////////////////////////////////////////////////////////////
|
|
|
|
///////////////////////////////////////////
|
|
// joining all files to one
|
|
///////////////////////////////////////////
|
|
sub JoinFiles(the_file$)
|
|
local in_file, out_file
|
|
|
|
out_file = OpenWriteFile(the_file$)
|
|
for NL = 0 to num_lib
|
|
// contents of each file is written to our joined temp file
|
|
in_file = OpenReadFile(TMP_folder$+Library$(NL))
|
|
while (not eof(in_file))
|
|
print #out_file LineInput$(in_file)
|
|
num_line = num_line + 1
|
|
wend
|
|
close in_file
|
|
next NL
|
|
close out_file
|
|
|
|
return
|
|
end sub
|
|
|
|
///////////////////////////////////////////
|
|
// here we are cleaning up the files
|
|
///////////////////////////////////////////
|
|
sub CleanUpCode(the_file$)
|
|
local the_filename$, out_file$
|
|
local in_file, out_file
|
|
local Current_line$
|
|
|
|
the_filename$ = right$(the_file$, len(the_file$)-rinstr(the_file$, "/"))
|
|
out_file$ = TMP_folder$+the_filename$
|
|
|
|
out_file = OpenWriteFile(out_file$)
|
|
in_file = OpenReadFile(the_file$)
|
|
|
|
if (min(out_file, in_file) = 0) return -1
|
|
|
|
print "\t-- removing not needed stuff ..."
|
|
while (not eof(in_file))
|
|
Current_line$ = LineInput$(in_file)
|
|
|
|
if (double_sub) then
|
|
if (upper$(left$(Current_line$, 7)) = "END SUB") double_sub = false
|
|
continue
|
|
fi
|
|
|
|
// remove empty lines and commented lines and stuff
|
|
if (Current_line$ = "") continue
|
|
if (left$(Current_line$, 2) = "//") continue
|
|
if (left$(Current_line$, 1) = "#") continue
|
|
if (upper$(left$(Current_line$, 11)) = "EXPORT SUB ") then
|
|
Current_line$ = trim$(right$(Current_line$, len(Current_line$)-6))
|
|
fi
|
|
Current_line$ = CheckOnLineComments$(Current_line$)
|
|
if (upper$(left$(Current_line$, 4)) = "SUB ") then
|
|
curr_sub$ = right$(Current_line$, len(Current_line$)-4)
|
|
curr_sub$ = left$(curr_sub$, instr(curr_sub$, "("))
|
|
for NS = 0 to num_sub
|
|
if (Found_sub$(NS) = curr_sub$) then
|
|
double_sub = true
|
|
break
|
|
fi
|
|
next NS
|
|
|
|
if (double_sub) then
|
|
continue
|
|
else
|
|
num_sub = num_sub + 1
|
|
dim Found_sub$(num_sub+1)
|
|
Found_sub$(num_sub) = curr_sub$
|
|
fi
|
|
fi
|
|
if (upper$(left$(Current_line$, 6)) = "IMPORT") then
|
|
found_lib = FindLibraries(Current_line$)
|
|
continue
|
|
fi
|
|
if (upper$(Current_line$) = "ENDIF") Current_line$ = "fi"
|
|
|
|
print #out_file Current_line$
|
|
wend
|
|
|
|
close in_file
|
|
close out_file
|
|
|
|
return found_lib
|
|
end sub
|
|
|
|
////////////////////////////////////////////
|
|
// search for comments behind a needed line
|
|
// if found, remove it. Exept there is a "
|
|
////////////////////////////////////////////
|
|
sub CheckOnLineComments$(the_line$)
|
|
D = instr(the_line$, "//")
|
|
|
|
if (D) then
|
|
local is_comment
|
|
local A : local B
|
|
local C : local E
|
|
|
|
for B = 1 to len(the_line$)
|
|
A = asc(mid$(the_line$, B, 1))
|
|
if (B > D) then
|
|
if (A = 34 and is_comment) then
|
|
C = true
|
|
break
|
|
fi
|
|
else
|
|
E = asc(mid$(the_line$, B+1, 1))
|
|
if (E = 34 and not A = 92) then
|
|
if (is_comment) then
|
|
is_comment = false
|
|
else
|
|
is_comment = true
|
|
fi
|
|
fi
|
|
fi
|
|
next B
|
|
|
|
if (not C) the_line$ = left$(the_line$, D-1)
|
|
fi
|
|
|
|
return trim$(the_line$)
|
|
end sub
|
|
|
|
/////////////////////////////////////////////////
|
|
// search for libraries, to prepare them as well
|
|
/////////////////////////////////////////////////
|
|
sub FindLibraries(the_line$)
|
|
local Library$
|
|
|
|
Library$ = right$(the_line$, len(the_line$)-7)
|
|
|
|
if (upper$(right$(Library$, 4)) <> ".YAB") then
|
|
Library$ = Library$+".yab"
|
|
fi
|
|
|
|
num_lib = num_lib + 1
|
|
dim Library$(num_lib+1)
|
|
dim Is_in_lib_path(num_lib+1)
|
|
|
|
if (system("test -e \""+Input_dir$+Library$+"\"")) then
|
|
if (system("test -e \""+Lib_path$+Library$+"\"")) then
|
|
print "-- Could not find lib\n\t"+Library$
|
|
num_lib = num_lib - 1
|
|
return num_lib
|
|
else
|
|
Is_in_lib_path(num_lib) = true
|
|
fi
|
|
fi
|
|
|
|
Library$(num_lib) = Library$
|
|
|
|
print "-- Found lib: "+Library$
|
|
return num_lib
|
|
end sub
|
|
|
|
/////////////////////////////////////////////////////////////
|
|
// open the inputfile for reading
|
|
/////////////////////////////////////////////////////////////
|
|
sub OpenReadFile(the_file$)
|
|
local READ_FILE
|
|
READ_FILE = 22
|
|
|
|
if (not open(#READ_FILE,the_file$,"r")) then
|
|
print "-- Could not open "+the_file$
|
|
print "-- for reading!"
|
|
exit
|
|
fi
|
|
|
|
return READ_FILE
|
|
end sub
|
|
|
|
/////////////////////////////////////////////////////////////
|
|
// open the outputfile for writing
|
|
/////////////////////////////////////////////////////////////
|
|
sub OpenWriteFile(the_file$)
|
|
local WRITE_FILE
|
|
WRITE_FILE = 23
|
|
|
|
if (not open(#WRITE_FILE,the_file$,"w")) then
|
|
print "-- Could not open "+the_file$
|
|
print "-- for writing!"
|
|
exit
|
|
fi
|
|
|
|
return WRITE_FILE
|
|
end sub
|
|
|
|
/////////////////////////////////////////
|
|
// read in one line from the given file
|
|
/////////////////////////////////////////
|
|
sub LineInput$(n)
|
|
|
|
local tmp : local tmp$
|
|
|
|
// while (tmp <> 10)
|
|
// tmp = peek(n)
|
|
// if (tmp < 0) continue
|
|
// tmp$ = tmp$ + chr$(tmp)
|
|
// wend
|
|
|
|
// line input allows for final lines without a newline "\n"
|
|
|
|
line input #n tmp$
|
|
return trim$(tmp$)
|
|
end sub
|
|
|
|
/////////////////////////////////////////////////////////////
|
|
// Remove our tempfolder
|
|
/////////////////////////////////////////////////////////////
|
|
sub RemoveTemp()
|
|
if (not system("test -d \""+TMP_folder$+"\"")) then
|
|
RmErr = system("rm -rf \""+TMP_folder$+"\"")
|
|
fi
|
|
|
|
return RmErr
|
|
end sub
|
|
|
|
/////////////////////////////////////////////////////////////
|
|
// tell the user how to use this app
|
|
/////////////////////////////////////////////////////////////
|
|
sub UsageAdvise(n)
|
|
print "\n"+AppName$+VERSION$
|
|
print "Usage:"
|
|
print "\t"+AppName$+" outputfile inputfile < applicationsignature >\n"
|
|
print "\tFilenames may have no spaces!\n"
|
|
print "\tapplicationsignature default is: application/x-vnd.yab-app\n"
|
|
RemoveTemp()
|
|
|
|
exit n
|
|
end sub
|
|
|
|
/////////////////////////////////////////////////////////////
|
|
// set the application signature in YabMain.cpp
|
|
/////////////////////////////////////////////////////////////
|
|
sub SetAppSig(sig$)
|
|
app_sig$="\n\tBString tmp(\""+sig$+"\");\n"
|
|
open #1, This_dir$+"parts/YabMain.cpp.appsig","w"
|
|
print #1 app_sig$
|
|
close #1
|
|
cmd$="cat "+This_dir$+"parts/YabMain.cpp.start "+This_dir$+"parts/YabMain.cpp.appsig "+This_dir$+"parts/YabMain.cpp.end > "+This_dir$+"YabMain.cpp"
|
|
system(cmd$)
|
|
|
|
end sub
|
|
|
|
/////////////////////////////////////////////////////////////
|
|
// set the application signature to match the mimetype declared in the file.
|
|
/////////////////////////////////////////////////////////////
|
|
|
|
|
|
sub getappsig$(infil$)
|
|
local x,a$,i,ii
|
|
open #22,infil$,"r"
|
|
for i=1 to 2
|
|
line input #22 a$
|
|
a$=lower$(a$)
|
|
ii = instr(a$,"mimetype")
|
|
if ii<>0 then
|
|
a$=right$(a$,len(a$) - (ii+8))
|
|
a$=trim$(a$)
|
|
a$=right$(a$,len(a$)-1)
|
|
a$=left$(a$,len(a$)-1)
|
|
close #22
|
|
return a$
|
|
endif
|
|
next
|
|
close #22
|
|
return ""
|
|
|
|
|
|
end sub
|
|
|
|
|
|
////////////////////////////////////////
|
|
////////////////////////////////////////
|
|
// the BuildFactory starts here
|
|
////////////////////////////////////////
|
|
////////////////////////////////////////
|
|
sub BuildFactory(f$)
|
|
handle = open(f$, "r")
|
|
if(not handle) then
|
|
print "Error: Could not open file "+f$
|
|
exit(1)
|
|
endif
|
|
|
|
print "Reading file "+f$+"..."
|
|
print
|
|
|
|
while(not eof(handle))
|
|
numRead = numRead + 1
|
|
dim line$(numRead)
|
|
line$(numRead) = GetLine$(handle)
|
|
wend
|
|
close(handle)
|
|
|
|
print "Dumping file..."
|
|
print
|
|
DumpProg(f$)
|
|
|
|
// times have changed :)
|
|
hasZeta = false
|
|
|
|
print "This yab version was compiled on "+peek$("os")+"."
|
|
realOS$ = upper$(system$("uname -o"))
|
|
realOS$ = left$(realOS$, len(realOS$)-1)
|
|
print "This system is running "+realOS$
|
|
|
|
print "Writing Automakefile and global.h..."
|
|
print
|
|
|
|
system("cp AutoHeader.mak Automakefile")
|
|
|
|
handle = open("Automakefile", "a")
|
|
if(not handle) then
|
|
print "Error: Could not write file Automakefile"
|
|
exit(1)
|
|
endif
|
|
|
|
print #handle "TARGET = "+left$(f$, len(f$)-7)
|
|
|
|
close(handle)
|
|
|
|
system("cat AutoFooter.mak >> Automakefile")
|
|
|
|
print "Starting make (ignore warnings)..."
|
|
print
|
|
system("make -f Automakefile clean")
|
|
system("make -f Automakefile")
|
|
system("make -f Automakefile clean")
|
|
system("rm -f program.h Automakefile "+f$)
|
|
print
|
|
print "Finished"
|
|
print
|
|
|
|
return
|
|
end sub
|
|
|
|
sub GetFirstCommand$(line$)
|
|
local t$: local ret$
|
|
local i
|
|
|
|
t$ = ltrim$(line$)
|
|
for i=1 to len(t$)
|
|
if(mid$(t$,i,1) = " " or mid$(t$,i,1) = "\t" or mid$(t$,i,1) = "\n" or mid$(t$,i,1) = "(") break
|
|
ret$ = ret$ + mid$(t$,i,1)
|
|
next i
|
|
return ret$
|
|
end sub
|
|
|
|
sub DumpProg(fileName$)
|
|
local handle
|
|
local t$
|
|
local i
|
|
|
|
if(val(system$("wc -c "+fileName$)) < 100) then
|
|
print "WARNING: File too small, filling up program with comments"
|
|
handle = open(fileName$, "a")
|
|
if(handle) then
|
|
print #handle "rem ~~ This comment was added by the ~~"
|
|
print #handle "rem ~~ BuildFactory because your program ~~"
|
|
print #handle "rem ~~ was too small. ~~"
|
|
close(handle)
|
|
else
|
|
print "ERROR: Could not add comments, is "+fileName$+" write-protected?"
|
|
exit(1)
|
|
endif
|
|
endif
|
|
|
|
system("yab-compress "+fileName$)
|
|
handle = open("program.h", "a")
|
|
if(handle) then
|
|
print #handle "#define PROGLEN ";
|
|
t$ = system$("wc -c "+fileName$)
|
|
i = 1
|
|
while(mid$(t$,i,1) = " ")
|
|
i = i + 1
|
|
wend
|
|
if(i>1) t$ = right$(t$,len(t$)-i+1)
|
|
t$ = left$(t$, instr(t$, " ")-1)
|
|
print #handle t$
|
|
close(handle)
|
|
endif
|
|
return
|
|
end sub
|
|
|
|
sub GetLine$(handle)
|
|
local tmp$
|
|
local retString$
|
|
|
|
while(tmp$<>chr$(10) and tmp$<>chr$(13) and not eof(handle))
|
|
tmp$ = chr$(peek(handle))
|
|
retString$ = retString$ + tmp$
|
|
wend
|
|
|
|
return retString$
|
|
end sub
|
|
|