diff --git a/uppsrc/ide/Builders/Builders.h b/uppsrc/ide/Builders/Builders.h index d0a8118b1..bcba06028 100644 --- a/uppsrc/ide/Builders/Builders.h +++ b/uppsrc/ide/Builders/Builders.h @@ -76,6 +76,21 @@ struct GccBuilder : CppBuilder { void BinaryToObject(String objfile, CParser& binscript, String basedir, const String& package, const Package& pkg); }; +struct OwcBuilder : CppBuilder { + typedef OwcBuilder CLASSNAME; + + virtual void AddFlags(Index& cfg); + virtual bool BuildPackage(const String& package, Vector& linkfile, String& linkoptions, + const Vector& all_uses, const Vector& all_libraries, int optimize); + virtual bool Link(const Vector& linkfile, const String& linkoptions, bool createmap); + virtual bool Preprocess(const String& package, const String& file, const String& target, bool asmout); + + String CompilerName(bool isCpp = true) const; + String LinkerName() const; + String CmdLine(const String& package, const Package& pkg); + void BinObjConsole(String c) { PutConsole(c); } +}; + struct MscBuilder : CppBuilder { typedef MscBuilder CLASSNAME; diff --git a/uppsrc/ide/Builders/Builders.upp b/uppsrc/ide/Builders/Builders.upp index c47ef615c..dafd650de 100644 --- a/uppsrc/ide/Builders/Builders.upp +++ b/uppsrc/ide/Builders/Builders.upp @@ -12,6 +12,7 @@ file MakeFile.cpp, GccBuilder.cpp, MscBuilder.cpp, + OwcBuilder.cpp, JavaBuilder.cpp, ScriptBuilder.cpp, Info readonly separator, diff --git a/uppsrc/ide/Builders/OwcBuilder.cpp b/uppsrc/ide/Builders/OwcBuilder.cpp new file mode 100644 index 000000000..fd5897921 --- /dev/null +++ b/uppsrc/ide/Builders/OwcBuilder.cpp @@ -0,0 +1,306 @@ +#include "Builders.h" + +#include + +void OwcBuilder::AddFlags(Index& cfg) +{ + +} + +bool OwcBuilder::BuildPackage(const String& package, Vector& linkfile, String& linkoptions, const Vector& all_uses, const Vector& all_libraries, int opt) +{ + String packagepath = PackagePath(package); + Package pkg; + pkg.Load(packagepath); + String packagedir = GetFileFolder(packagepath); + ChDir(packagedir); + PutVerbose("cd " + packagedir); + IdeConsoleBeginGroup(package); + Vector obj; + + /*bool is_shared = HasFlag("SO"); + String shared_ext = (HasFlag("WIN32") ? ".dll" : ".so");*/ + + String cc = CmdLine(package, pkg), + clc = CompilerName(false), clcpp = CompilerName(true); + + // <..> Flags configuration + if (HasFlag("MT")) + cc << " -bm"; +#ifdef PLATFORM_WIN32 + cc << " -bt=nt"; +#endif + String cc_speed = cc; + bool release = false; + + if(HasFlag("DEBUG")) + cc << " -d_DEBUG " << debug_options; + else { + release = true; + cc << ' ' << release_size_options; + cc_speed << ' ' << release_options; + if(opt == R_SPEED || pkg.optimize_speed) + cc = cc_speed; + } + // <..> + + Vector sfile, isfile; + Vector soptions, isoptions; + Vector optimize, ioptimize; + bool error = false; + + for(int i = 0; i < pkg.GetCount(); i++) { + if(!IdeIsBuilding()) + return false; + if(!pkg[i].separator) { + String gop = Gather(pkg[i].option, config.GetKeys()); + Vector srcfile = CustomStep(SourcePath(package, pkg[i])); + if(srcfile.GetCount() == 0) + error = true; + for(int j = 0; j < srcfile.GetCount(); j++) { + String fn = srcfile[j]; + String ext = ToLower(GetFileExt(fn)); + if(ext == ".c" || ext == ".cpp" || ext == ".cc" || ext == ".cxx" || ext == ".rc" || ext == ".brc") { + sfile.Add(fn); + soptions.Add(gop); + optimize.Add(release && pkg[i].optimize_speed && opt == R_OPTIMAL); + } + else + if(ext == ".icpp") { + isfile.Add(fn); + isoptions.Add(gop); + ioptimize.Add(release && pkg[i].optimize_speed && opt == R_OPTIMAL); + } + else + if(ext == ".obj") + obj.Add(fn); + else + if(ext == ".lib") + linkfile.Add(fn); + } + } + } + + if(HasFlag("BLITZ")) { + Blitz b = BlitzStep(sfile, soptions, obj, ".obj", optimize); + if(b.build) { + PutConsole("BLITZ:" + b.info); + int slot = AllocSlot(); + if(slot < 0 || !Run(String().Cat() << clcpp << cc << ' ' + << GetHostPathQ(b.path) << " -fo=" << GetHostPathQ(b.object), slot, GetHostPath(b.object), b.count)) + error = true; + } + } + + int first_ifile = sfile.GetCount(); + sfile.AppendPick(isfile); + soptions.AppendPick(isoptions); + optimize.AppendPick(ioptimize); + + int ccount = 0; + + for(int i = 0; i < sfile.GetCount(); i++) { + if(!IdeIsBuilding()) + return false; + String fn = sfile[i]; + String ext = ToLower(GetFileExt(fn)); + bool rc = (ext == ".rc"); + bool brc = (ext == ".brc"); + bool init = (i >= first_ifile); + String objfile = CatAnyPath(outdir, GetFileName(fn) + ".obj"); + if(HdependFileTime(fn) > GetFileTime(objfile)) { + int time = GetTickCount(); + bool execerr = false; + if(rc) { + PutConsole(GetFileNamePos(fn)); + int slot = AllocSlot(); + if(slot < 0 || !Run("wrc -q -fo=" + GetHostPathQ(objfile) + Includes(" -i=", package, pkg) + + ' ' + GetHostPathQ(fn), slot, GetHostPath(objfile), 1)) + execerr = true; + } + else + if(brc) { + PutConsole(GetFileNamePos(fn)); + try { + String hfn = GetHostPath(fn); + String brcdata = LoadFile(hfn); + if(brcdata.IsVoid()) + throw Exc(NFormat("error reading file '%s'", hfn)); + CParser parser(brcdata, hfn); + BinaryToObject(GetHostPath(objfile), parser, GetFileDirectory(hfn), THISBACK(BinObjConsole)); + } + catch(Exc e) { + PutConsole(e); + execerr = true; + } + } + else { + String c = cc; + if(optimize[i]) + c = cc_speed; + int slot = AllocSlot(); + + if(slot < 0 || !Run((ext == ".c" ? clc : clcpp + " -xr -xs") + c + soptions[i] + ' ' + + GetHostPathQ(fn) + " -fo=" + GetHostPathQ(objfile), slot, GetHostPath(objfile), 1)) + execerr = true; + } + + if(execerr) + DeleteFile(objfile); + error |= execerr; + PutVerbose("compiled in " + GetPrintTime(time)); + ccount++; + } + if(init) + linkfile.Add(objfile); + else + obj.Add(objfile); + } + + if(error) { + IdeConsoleEndGroup(); + return false; + } + + obj.Append(linkfile); + linkfile = obj; + return true; +} + +bool OwcBuilder::Link(const Vector& linkfile, const String& linkoptions, bool createmap) +{ + int time = GetTickCount(); + if(!Wait()) + return false; + + const int linkfileCount = linkfile.GetCount(); + + for(int i = 0; i < linkfileCount; i++) + if(GetFileTime(linkfile[i]) >= targettime) { + String link; + link << LinkerName() << " option quiet"; + + if (HasFlag("DEBUG")) + link << " debug all option incremental"; +#ifdef PLATFORM_WIN32 + if (HasFlag("GUI")) + link << " system nt_win"; + else if (HasFlag("DLL")) + link << " system nt_dll"; + else link << " system nt"; +#endif + if(createmap) + link << " option map"; + + const int libpathCount = libpath.GetCount(); + if (libpathCount > 0) + { + link << " libpath "; + for (int j = 0, k = libpathCount - 1; j < libpathCount; ++j) + { + link << '\"' << libpath[j] << '\"'; + if (j < k) + link << ';'; + } + } + + if (!linkoptions.IsEmpty()) + link << ' ' << linkoptions; + + Vector files, libs; + + for (int j = 0; j < linkfileCount; ++j) + { + const String ext = GetFileExt(linkfile[j]); + if (ext == ".obj") + files.Add(linkfile[j]); + else if (ext == ".lib") + libs.Add(linkfile[j]); + } + + const int filesCount = files.GetCount(), + libsCount = libs.GetCount(); + + if (filesCount > 0) + { + link << " file "; + + for (int j = 0, k = filesCount - 1; j < filesCount; ++j) + { + link << '\'' << files[j] << '\''; + if (j < k) + link << ", "; + } + } + + if (libsCount > 0) + { + link << " library "; + + for (int j = 0, k = libsCount - 1; j < libsCount; ++j) + { + link << '\'' << GetHostPath(libs[i]) << '\''; + if (j < k) + link << ", "; + } + } + + link << " name '" << GetHostPath(target) << '\''; + + PutConsole("Linking..."); + CustomStep(".pre-link"); + if(Execute(link) == 0) { + CustomStep(".post-link"); + + PutConsole(String().Cat() << GetHostPath(target) << " (" << GetFileInfo(target).length + << " B) linked in " << GetPrintTime(time)); + return true; + } + else { + DeleteFile(target); + return false; + } + } + + PutConsole(String().Cat() << GetHostPath(target) << " (" << GetFileInfo(target).length + << " B) is up to date."); + return true; +} + +bool OwcBuilder::Preprocess(const String& package, const String& file, const String& target, bool asmout) +{ + FileOut out(target); + const String packagepath = PackagePath(package); + Package pkg; + pkg.Load(packagepath); + + return Execute((GetFileExt(file) == ".c" ? CompilerName(false) : CompilerName(true)) + CmdLine(package, pkg) + " -pl " + file, out); +} + +String OwcBuilder::CompilerName(bool isCpp) const +{ + if(!IsNull(compiler)) return compiler; + return isCpp ? "wpp386" : "wcc386"; // C++ or C compiler +} + +String OwcBuilder::LinkerName() const +{ + return "wlink"; +} + +String OwcBuilder::CmdLine(const String& package, const Package& pkg) +{ + return String().Cat() << " -zq -fr=" << Includes(" -i=", package, pkg); + // "-fr=" - do not create error files +} + +Builder *CreateOwcBuilder() +{ + return new OwcBuilder; +} + +void RegisterOwcBuilder() +{ + RegisterBuilder("OWC", CreateOwcBuilder); + //RegisterBuilder("OWC32", CreateOwcBuilder); +} diff --git a/uppsrc/ide/idewin.cpp b/uppsrc/ide/idewin.cpp index fab692c53..29baa5968 100644 --- a/uppsrc/ide/idewin.cpp +++ b/uppsrc/ide/idewin.cpp @@ -820,7 +820,7 @@ void AppMain___() } #endif } - + #ifndef _DEBUG SetVppLogSizeLimit(0); #endif @@ -831,6 +831,7 @@ void AppMain___() // void RegisterIdeVectorDes(); RegisterIdeVectorDes(); void RegisterGccBuilder(); RegisterGccBuilder(); void RegisterMscBuilder(); RegisterMscBuilder(); + void RegisterOwcBuilder(); RegisterOwcBuilder(); void RegisterJavaBuilder(); RegisterJavaBuilder(); void RegisterScriptBuilder(); RegisterScriptBuilder();