1<package>
2    <job id="new-project-wsh-js">
3
4        <script language="VBScript">
5        Function VbAskData(prompt, title, defvalue)
6            VbAskData = InputBox(prompt, title, defvalue)
7        End Function
8
9        Function VbAskQuestionYNC(prompt, title)
10            Dim reply
11            reply = MsgBox(prompt, vbYesNoCancel, title)
12            If reply = vbYes Then
13                VbAskQuestionYNC = "yes"
14            End If
15            If reply = vbNo Then
16                VbAskQuestionYNC = "no"
17            End If
18        End Function
19
20        Function VbAskQuestionYN(prompt, title)
21            Dim reply
22            reply = MsgBox(prompt, vbYesNo, title)
23            If reply = vbYes Then
24                VbAskQuestionYN = "yes"
25            End If
26            If reply = vbNo Then
27                VbAskQuestionYN = "no"
28            End If
29        End Function
30
31        Function VbInfoMessage(prompt, title)
32            Dim reply
33            reply = MsgBox(prompt, vbOKOnly, title)
34            VbInfoMessage = "ok"
35        End Function
36        </script>
37
38        <script language="JScript" src="project_utilits.js">
39        </script>
40
41        <script language="JScript">
42        // Framework
43
44        function InputData(prompt, defvalue)
45        {
46            var answer = VbAskData(prompt, WScript.ScriptFullName, defvalue);
47            if ((typeof(answer) == "undefined") || answer.length == 0) {
48                WScript.Quit(1);
49            }
50            return answer;
51        }
52        function InputFlagYNC(prompt)
53        {
54            var answer = VbAskQuestionYNC(prompt, WScript.ScriptFullName);
55            if ((typeof(answer) == "undefined") || answer.length == 0) {
56                WScript.Quit(1);
57            }
58            return answer == "yes";
59        }
60        function InputFlagYN(prompt)
61        {
62            var answer = VbAskQuestionYN(prompt, WScript.ScriptFullName);
63            if ((typeof(answer) == "undefined") || answer.length == 0) {
64                WScript.Quit(1);
65            }
66            return answer == "yes";
67        }
68        function ShowMessage(prompt)
69        {
70            var answer = VbInfoMessage(prompt, WScript.ScriptFullName);
71            return answer == "ok";
72        }
73        // Verify command line arguments
74        function VerifyArguments(oArgs)
75        {
76            if (oArgs.Length < 2) {
77                return false;
78            }
79            var name = GetPositionalValue(oArgs, 0);
80            if (name == "") {
81                return false;
82            }
83/*
84            if (oArgs.Length > 6) {
85                return false;
86            }
87*/
88
89            return true;
90        }
91        // Verify task object
92        function VerifyTask(oShell, oTask)
93        {
94            var err = false;
95            // Project name
96            var oRe = /^[a-zA-Z]([a-zA-Z]|\d|[_]|[-]|[\.])*$/g;
97            if (oTask.ProjectName.match(oRe) == null) {
98                WScript.Echo("ERROR: Invalid project name: \"" + oTask.ProjectName + "\"");
99                WScript.Echo("       Project name should start with a lower-case character");
100                WScript.Echo("       and contain lower-case character(s), underscore(s), or digit(s)");
101                err = true;
102            }
103            // Project type
104            if ((typeof(oTask.ProjectTemplate) == "undefined") || oTask.ProjectTemplate.length == 0) {
105                WScript.Echo("ERROR: Invalid project type: \"" + oTask.ProjectType + "\"");
106                WScript.Echo("       Supported project types are:");
107                var keys = (new VBArray(oTask.TemplatesDict.Keys())).toArray();
108                for(var key_ind in keys) {
109                    WScript.Echo( "         " + keys[key_ind] );
110                }
111                err = true;
112            }
113
114            // Path to C++ Toolkit
115            var oFso = new ActiveXObject("Scripting.FileSystemObject");
116            if ( !oFso.FolderExists(oTask.ToolkitPath) ||
117                 (!(!oTask.DllBuild && oFso.FolderExists(oTask.ToolkitPath + "\\static\\bin")) &&
118                  !( oTask.DllBuild && oFso.FolderExists(oTask.ToolkitPath + "\\dll\\bin")) &&
119                  !oFso.FolderExists(oTask.ToolkitPath + "\\bin"))) {
120                WScript.Echo("ERROR: Pre-built NCBI C++ toolkit is not found in:\n\"" + oTask.ToolkitPath + "\"");
121                if (oTask.DllBuild) {
122                    if (oFso.FolderExists(oTask.ToolkitPath + "\\static\\bin")) {
123                        WScript.Echo("\nConsider using static build - do not specify -dll flag");
124                    }
125                } else {
126                    if (oFso.FolderExists(oTask.ToolkitPath + "\\dll\\bin")) {
127                        WScript.Echo("\nConsider using DLL build - specify -dll flag");
128                    }
129                }
130                err = true;
131            }
132            if ( !oFso.FolderExists(oTask.ToolkitSrcPath) ||
133                 !oFso.FolderExists(oTask.ToolkitSrcPath + "\\include") ||
134                 !oFso.FolderExists(oTask.ToolkitSrcPath + "\\src")) {
135                WScript.Echo("ERROR: Pre-built NCBI C++ toolkit sources are not found in:\n\"" + oTask.ToolkitPath + "\"");
136                err = true;
137            }
138            if (err) {
139                WScript.Quit(1);
140            }
141        }
142        // Create usage string
143        function Usage()
144        {
145            var usage_str;
146            //usage_str  = "Usage:\n";
147            //usage_str += "cscript new_project.wsf <project-name> <project-template> <path-to-pre-built-toolkit> [-dll]";
148            usage_str  = "USAGE: cscript new_project.wsf <name> <type> [builddir] [-msvc nn] [-dll] [-b] [-v] [-noopen] [-ams yes|no]\n";
149            usage_str += "SYNOPSIS:\n";
150            usage_str += "    Create new MSVC application project from sample template:\n";
151            usage_str += "      Create local build tree structure. Fill-in the local tree.\n";
152            usage_str += "      Copy and adjust sample code.\n";
153//            usage_str += "      Add to project_tree_builder.ini entries for pre-built NCBI C++ toolkit.\n";
154            usage_str += "      Run project tree builder on local build tree.\n";
155            usage_str += "      Open created solution in MSVC IDE.\n";
156            usage_str += "ARGUMENTS:\n";
157            usage_str += "    <name>      -- name of the project\n";
158            usage_str += "    <type>      -- one of the following:\n";
159            usage_str += "                   app[/basic]        a simple application\n";
160            usage_str += "                   app/multicmd       a simple command-based application\n";
161            usage_str += "                   app/alnmgr         an application that uses Alignment Manager\n";
162            usage_str += "                   app/asn            an application that uses ASN.1 specification\n";
163            usage_str += "                   app/blast          a BLAST application\n";
164            usage_str += "                   app/cgi            a CGI application\n";
165            usage_str += "                   app/deployable_cgi a CD-deployable CGI application\n";
166            usage_str += "                   app/dbapi          a DBAPI application\n";
167            usage_str += "                   app/sdbapi         a Simple-DBAPI application\n";
168            usage_str += "                   app/eutils         an eUtils client application\n";
169            usage_str += "                   app/http_session   an application that uses CHttpSession\n";
170            usage_str += "                   app/lds            an application that uses local data store\n";
171            usage_str += "                   app/netcache       an application that uses NetCache\n";
172            usage_str += "                   app/netschedule    an NCBI GRID (NetSchedule) application\n";
173            usage_str += "                   app/objects        an application that uses ASN.1 objects\n";
174            usage_str += "                   app/objmgr         an application that uses Object Manager\n";
175            usage_str += "                   app/serial         a data serialization application\n";
176            usage_str += "                   app/soap/client    a SOAP client\n";
177            usage_str += "                   app/soap/server    a SOAP server\n";
178            usage_str += "                   app/unit_test      a Boost-based unit test application\n";
179            usage_str += "                   lib[/basic]        a simple static library\n";
180            usage_str += "                   lib/asn            a static library from ASN.1 specification\n";
181            usage_str += "                   lib/dtd            a static library from DTD specification\n";
182            usage_str += "                   lib/xsd            a static library from XML Schema specification\n";
183            usage_str += "                   lib/jsd            a static library from JSON Schema specification\n";
184            usage_str += "    [builddir]  -- path to the pre-built NCBI C++ toolkit\n";
185            usage_str += "                       default path is: " + GetDefaultCXX_ToolkitFolder() + "\\" + GetDefaultCXX_ToolkitSubFolder() + "\n";
186            usage_str += "                       you can only specify a subfolder of " + GetDefaultCXX_ToolkitFolder() + "\n";
187            usage_str += "    [-msvc nn]  -- MSVC version: 140, 140x64, 150, 150x64; default is " + GetDefaultMsvcVer() + "\n";
188            usage_str += "    [-dll]      -- use  NCBI C++ toolkit DLLs' instead of static libraries\n";
189            usage_str += "    [-b]        -- copy NCBI C++ toolkit DLLs' to local binary directories\n";
190            usage_str += "    [-v]        -- show details about what is being made\n";
191            usage_str += "    [-i]        -- enter the data interactively\n";
192            usage_str += "    [-noopen]   -- do not open generated solution in IDE\n";
193            usage_str += "    [-ams yes|no]  -- automatically map network drive S:\n";
194            usage_str += "        Generated solution uses libraries from a network location:\n";
195            usage_str += "            " + GetDefaultLibFolder() + "\n";
196            usage_str += "        It is recommended that this location is mapped to drive S:\n";
197            usage_str += "EXAMPLES:\n";
198            usage_str += "    cscript new_project.wsf my_app app/basic\n";
199            usage_str += "    cscript new_project.wsf my_app app/basic -dll -v\n";
200            usage_str += "    cscript new_project.wsf my_app app/basic cxx.potluck -dll\n";
201            usage_str += "    cscript new_project.wsf my_app app/basic " + GetDefaultCXX_ToolkitFolder() + "\\cxx.current -dll\n";
202
203            return usage_str;
204        }
205        // Task object constructor
206        function Task()
207        {
208            var toolkit_path;
209            var oArgs = WScript.Arguments;
210            SetMsvcVer(oArgs, "-msvc");
211            SetOpenSolution(oArgs, "-noopen", false);
212            var run_interactive = GetFlagValue(oArgs, "-i", false);
213            if ( !run_interactive && VerifyArguments(oArgs) ) {
214                SetVerbose(oArgs, "-v", false);
215                this.ProjectName = GetPositionalValue(oArgs, 0);
216                this.ProjectType = GetPositionalValue(oArgs, 1);
217                this.DllBuild    = GetFlagValue(oArgs, "-dll", false);
218                if ( this.DllBuild ) {
219                    this.CopyDlls    = GetFlagValue(oArgs, "-b", false);
220                } else {
221                    this.CopyDlls    = false;
222                }
223                this.AutoMapS = GetFlaggedValue(oArgs, "-ams", "ask")
224                toolkit_path     = GetOptionalPositionalValue(oArgs, 2,
225                    GetDefaultCXX_ToolkitFolder() + "\\" + GetDefaultCXX_ToolkitSubFolder());
226            } else {
227                this.AutoMapS = "ask";
228                WScript.Echo(Usage());
229                if (!run_interactive) {
230                    var oFso = new ActiveXObject("Scripting.FileSystemObject");
231                    var scripthost = oFso.GetBaseName(WScript.FullName);
232                    run_interactive = (scripthost == "cscript");
233                    if (run_interactive) {
234                        run_interactive = InputFlagYN("Do you want to enter the data interactively?");
235                    }
236                    if (!run_interactive) {
237                        WScript.Quit(1);
238                    }
239                }
240            }
241            if (run_interactive) {
242                var prompt, answer, footer;
243                prompt = "Enter Project Name";
244//                footer = "\n\nPress Cancel to abort the script";
245                footer="";
246                this.ProjectName = InputData(prompt+footer, "test");
247                prompt = "Enter Project Type\n";
248                prompt += "This can be one of the following:\n";
249                prompt += "\tapp\n";
250                prompt += "\tapp/basic\n";
251                prompt += "\tapp/multicmd\n";
252                prompt += "\tapp/alnmgr\n";
253                prompt += "\tapp/asn\n";
254                prompt += "\tapp/blast\n";
255                prompt += "\tapp/cgi\n";
256                prompt += "\tapp/deployable_cgi\n";
257                prompt += "\tapp/dbapi\n";
258                prompt += "\tapp/sdbapi\n";
259                prompt += "\tapp/eutils\n";
260                prompt += "\tapp/http_session\n";
261                prompt += "\tapp/lds\n";
262                prompt += "\tapp/netcache\n";
263                prompt += "\tapp/netschedule\n";
264                prompt += "\tapp/objects\n";
265                prompt += "\tapp/objmgr\n";
266                prompt += "\tapp/serial\n";
267                prompt += "\tapp/soap/client\n";
268                prompt += "\tapp/soap/server\n";
269                prompt += "\tapp/unit_test\n";
270                prompt += "\tlib\n";
271                prompt += "\tlib/basic\n";
272                prompt += "\tlib/asn\n";
273                prompt += "\tlib/dtd\n";
274                prompt += "\tlib/xsd\n";
275                prompt += "\tlib/jsd\n";
276                this.ProjectType = InputData(prompt+footer, "app/basic");
277                prompt = "Enter path to the pre-built NCBI C++ toolkit";
278                toolkit_path = InputData(prompt+footer,
279                    GetDefaultCXX_ToolkitFolder() + "\\" + GetDefaultCXX_ToolkitSubFolder());
280                prompt = "Use NCBI C++ toolkit DLLs?";
281                this.DllBuild = InputFlagYNC(prompt+footer);
282                prompt = "Copy NCBI C++ toolkit DLLs into local directories?";
283                this.CopyDlls = InputFlagYNC(prompt+footer);
284                prompt = "Use verbose output?"
285                SetVerboseFlag( InputFlagYNC(prompt+footer));
286            }
287            this.ProjectFolder = this.ProjectName;
288
289            this.TemplatesDict = new ActiveXObject("Scripting.Dictionary");
290            this.TemplatesDict.Add("app",         "sample/app/basic");
291            this.TemplatesDict.Add("app/basic",   "sample/app/basic");
292            this.TemplatesDict.Add("app/multicmd",   "sample/app/multicmd");
293            this.TemplatesDict.Add("app/alnmgr",  "sample/app/alnmgr");
294            this.TemplatesDict.Add("app/asn",     "sample/app/asn");
295            this.TemplatesDict.Add("app/blast",   "sample/app/blast");
296            this.TemplatesDict.Add("app/cgi",     "sample/app/cgi");
297            this.TemplatesDict.Add("app/deployable_cgi",    "sample/app/deployable_cgi");
298            this.TemplatesDict.Add("app/dbapi",   "sample/app/dbapi");
299            this.TemplatesDict.Add("app/sdbapi",  "sample/app/sdbapi");
300            this.TemplatesDict.Add("app/eutils",  "sample/app/eutils");
301            this.TemplatesDict.Add("app/http_session",      "sample/app/http_session");
302            this.TemplatesDict.Add("app/lds",     "sample/app/lds");
303            this.TemplatesDict.Add("app/netcache",    "sample/app/netcache");
304            this.TemplatesDict.Add("app/netschedule", "sample/app/netschedule");
305            this.TemplatesDict.Add("app/objects",     "sample/app/objects");
306            this.TemplatesDict.Add("app/objmgr",      "sample/app/objmgr");
307            this.TemplatesDict.Add("app/serial",      "sample/app/serial");
308            this.TemplatesDict.Add("app/soap/client", "sample/app/soap/client");
309            this.TemplatesDict.Add("app/soap/server", "sample/app/soap/server");
310            this.TemplatesDict.Add("app/unit_test",   "sample/app/unit_test");
311            this.TemplatesDict.Add("lib",         "sample/lib/basic");
312            this.TemplatesDict.Add("lib/basic",   "sample/lib/basic");
313            this.TemplatesDict.Add("lib/asn",     "sample/lib/asn_lib");
314            this.TemplatesDict.Add("lib/dtd",     "sample/lib/asn_lib");
315            this.TemplatesDict.Add("lib/xsd",     "sample/lib/asn_lib");
316            this.TemplatesDict.Add("lib/jsd",     "sample/lib/asn_lib");
317            if (this.TemplatesDict.Exists(this.ProjectType)) {
318                this.ProjectTemplate = this.TemplatesDict.Item(this.ProjectType);
319            }
320
321            if (toolkit_path.indexOf("\\\\") == 0 || toolkit_path.indexOf(":\\") == 1) {
322                this.ToolkitPath = toolkit_path;
323            } else {
324                this.ToolkitPath = GetDefaultCXX_ToolkitFolder() + "\\" + toolkit_path;
325            }
326            var oFso = new ActiveXObject("Scripting.FileSystemObject");
327            var src_root = this.ToolkitPath;
328            var src_path = src_root + "\\src";
329            while (!oFso.FolderExists(src_path)) {
330                src_root = oFso.GetParentFolderName(src_root)
331                if (src_root == "") {
332                    break;
333                }
334                src_path = src_root + "\\src";
335            }
336            this.ToolkitSrcPath = src_root;
337        }
338        // Diagnostic dump of task object
339        function DumpTask(oTask)
340        {
341            WScript.Echo("ProjectName     = " + oTask.ProjectName);
342            WScript.Echo("ProjectFolder   = " + oTask.ProjectFolder);
343            WScript.Echo("ProjectType     = " + oTask.ProjectType);
344            WScript.Echo("ProjectTemplate = " + oTask.ProjectTemplate);
345            WScript.Echo("ToolkitPath     = " + oTask.ToolkitPath);
346            WScript.Echo("ToolkitSrcPath  = " + oTask.ToolkitSrcPath);
347            WScript.Echo("DllBuild        = " + oTask.DllBuild.toString());
348            WScript.Echo("CopyDlls        = " + oTask.CopyDlls.toString());
349            WScript.Echo("AutoMapS        = " + oTask.AutoMapS);
350        }
351
352        // Fill local tree
353        function FillTree(oShell, oTree)
354        {
355            FillTreeStructure(oShell, oTree);
356        }
357
358        function ConvertDataSpec(oShell, oTree, oTask)
359        {
360            var oFso = new ActiveXObject("Scripting.FileSystemObject");
361            if ( oFso.FolderExists(oTree.SrcProjectBranch) ) {
362	            var dir = oFso.GetFolder(oTree.SrcProjectBranch);
363	            var dir_files = new Enumerator(dir.files);
364	            for ( ; !dir_files.atEnd(); dir_files.moveNext()) {
365	                if (oFso.GetExtensionName(dir_files.item()) == "asn") {
366	                    var cmd = oTask.Datatool + " -m " + dir_files.item() + " -sxo";
367	                    var file_out = oTree.SrcProjectBranch + "\\" + oFso.GetBaseName(dir_files.item());
368	                    if (oTask.ProjectType == "lib/dtd") {
369	                        cmd += " -fx " + file_out + ".dtd";
370	                    } else if (oTask.ProjectType == "lib/xsd") {
371	                        cmd += " -fxs " + file_out + ".xsd";
372	                    } else {
373	                        cmd += " -fjs " + file_out + ".jsd";
374			    }
375                        execute(oShell,cmd);
376	                }
377	            }
378            }
379        }
380
381        // Copy project template from CVS/SVN
382        function CopyProjectTemplate(oShell, oTree, oTask)
383        {
384//            var src = "/src/" + oTask.ProjectTemplate + "/*.*";
385//            GetFileFromTree(oShell, oTree, oTask, src, oTree.SrcProjectBranch)
386            GetSubtreeFromTree(oShell, oTree, oTask, "src/" + oTask.ProjectTemplate, oTree.SrcProjectBranch);
387            if (oTask.ProjectType == "lib" ||
388                oTask.ProjectType == "lib/basic") {
389                GetSubtreeFromTree(oShell, oTree, oTask, "include/" + oTask.ProjectTemplate, oTree.IncludeProjectBranch);
390            }
391
392            var rm0 = new Array (
393                "*.files"
394                );
395            var rm = rm0;
396            if (oTask.ProjectType == "lib/asn" ||
397                oTask.ProjectType == "lib/dtd" ||
398                oTask.ProjectType == "lib/xsd" ||
399                oTask.ProjectType == "lib/jsd") {
400                var rm1 = new Array (
401                    "*.lib"
402                    );
403                rm = rm0.concat(rm1);
404
405                if (typeof(oTask.Datatool) != "undefined" && (
406                    oTask.ProjectType == "lib/dtd" ||
407                    oTask.ProjectType == "lib/xsd" ||
408                    oTask.ProjectType == "lib/jsd")) {
409                    ConvertDataSpec(oShell, oTree, oTask);
410                    rm[rm.length] = "*.asn";
411                }
412            }
413            for (var i = 0; i < rm.length; ++i) {
414                var cmd = "if exist " + oTree.SrcProjectBranch + "\\" + rm[i] +
415                              " del " + oTree.SrcProjectBranch + "\\" + rm[i];
416                execute(oShell,cmd);
417            }
418        }
419
420        function AdjustDataSpecProject(oShell, oTree, oTask)
421        {
422            var oFso = new ActiveXObject("Scripting.FileSystemObject");
423
424            var filename = oTree.SrcProjectBranch + "\\Makefile.in";
425            var modelname = filename + ".old";
426
427            // Makefile.in
428            VerboseEcho("Modifying      " + filename);
429            oFso.CopyFile(filename, modelname);
430            var old_file = oFso.OpenTextFile(modelname, 1);
431            var new_file = oFso.CreateTextFile(filename, true);
432            while( !old_file.AtEndOfStream ) {
433                var old_line = old_file.ReadLine();
434                if (old_line.indexOf("ASN_PROJ") == 0) {
435                    if (oTask.ProjectType == "lib/asn") {
436                        new_file.WriteLine("ASN_PROJ = " + oTask.ProjectName);
437                    } else if (oTask.ProjectType == "lib/dtd") {
438                        new_file.WriteLine("DTD_PROJ = " + oTask.ProjectName);
439                    } else if (oTask.ProjectType == "lib/xsd") {
440                        new_file.WriteLine("XSD_PROJ = " + oTask.ProjectName);
441                    } else if (oTask.ProjectType == "lib/jsd") {
442                        new_file.WriteLine("JSD_PROJ = " + oTask.ProjectName);
443                    }
444                } else {
445                    new_file.WriteLine(old_line);
446                }
447            }
448            old_file.Close();
449            new_file.Close();
450            oFso.DeleteFile(modelname, true);
451
452            // Makefile.projname.lib
453            filename = oTree.SrcProjectBranch + "\\Makefile." + oTask.ProjectName + ".lib";
454            VerboseEcho("Creating       " + filename);
455            new_file = oFso.CreateTextFile(filename, true);
456            new_file.WriteLine("LIB = " + oTask.ProjectName);
457            new_file.WriteLine("SRC = " + oTask.ProjectName + "__ " + oTask.ProjectName + "___ ");
458            new_file.Close();
459
460            //dataspec
461            var dir = oFso.GetFolder(oTree.SrcProjectBranch);
462            var dir_files = new Enumerator(dir.files);
463            for ( ; !dir_files.atEnd(); dir_files.moveNext()) {
464                var ext = oFso.GetExtensionName(dir_files.item());
465                var file_out = oTree.SrcProjectBranch + "\\" + oTask.ProjectName;
466                if (oTask.ProjectType == "lib/asn") {
467                    if (ext == "asn") {
468                        oFso.MoveFile(dir_files.item(),file_out+".asn");
469                        break;
470                    }
471                } else if (oTask.ProjectType == "lib/dtd") {
472                    if (ext == "dtd") {
473                        oFso.MoveFile(dir_files.item(),file_out+".dtd");
474                        break;
475                    }
476                } else if (oTask.ProjectType == "lib/xsd") {
477                    if (ext == "xsd") {
478                        oFso.MoveFile(dir_files.item(),file_out+".xsd");
479                        break;
480                    }
481                } else if (oTask.ProjectType == "lib/jsd") {
482                    if (ext == "jsd") {
483                        oFso.MoveFile(dir_files.item(),file_out+".jsd");
484                        break;
485                    }
486                }
487            }
488        }
489
490        // Change Makefile.in and Makefile.*.app
491        function AdjustProject(oShell, oTree, oTask)
492        {
493            if (oTask.ProjectType == "lib/asn" ||
494                oTask.ProjectType == "lib/dtd" ||
495                oTask.ProjectType == "lib/xsd" ||
496                oTask.ProjectType == "lib/jsd") {
497                AdjustDataSpecProject(oShell, oTree, oTask)
498                return;
499            }
500            var XX_PROJ = "APP_PROJ";
501            var XX_EXT  = "app";
502            var XX_APP  = "APP";
503            if (oTask.ProjectType == "lib" ||
504                oTask.ProjectType == "lib/basic") {
505                XX_PROJ = "LIB_PROJ";
506                XX_EXT  = "lib";
507                XX_APP  = "LIB"
508            }
509
510            var oFso = new ActiveXObject("Scripting.FileSystemObject");
511
512            var filename = oTree.SrcProjectBranch + "\\Makefile.in";
513            var modelname = filename + ".old";
514            var samplename = "";
515            var sourcename = "";
516            var subtype = oTask.ProjectType.split("/");
517            if (subtype.length > 1) {
518                subtype = subtype[1];
519            } else {
520                subtype = "basic";
521            }
522            var standard_sample_found = false;
523
524
525            // Makefile.in
526            VerboseEcho("Modifying      " + filename);
527            oFso.CopyFile(filename, modelname);
528            var old_file = oFso.OpenTextFile(modelname, 1);
529            var new_file = oFso.CreateTextFile(filename, true);
530            while( !old_file.AtEndOfStream ) {
531                var old_line = old_file.ReadLine();
532                if (old_line.indexOf( XX_PROJ ) == 0) {
533                    var subproj = old_line.split(" ");
534                    var new_line = "";
535                    for (var i = 0; i < subproj.length; i++) {
536                        if (subproj[i] == subtype + "_sample") {
537                            standard_sample_found = true;
538                            sourcename = subproj[i];
539                            new_line += oTask.ProjectName + " ";
540                        } else {
541                            new_line += subproj[i] + " ";
542                        }
543                    }
544                    new_file.WriteLine(new_line);
545                } else {
546                    new_file.WriteLine(old_line);
547                }
548            }
549            old_file.Close();
550            new_file.Close();
551            oFso.DeleteFile(modelname, true);
552
553            if (!standard_sample_found) {
554                return;
555            }
556
557            modelname = oTree.SrcProjectBranch + "\\" + "Makefile." + sourcename + "." + XX_EXT;
558            if (sourcename == "" || !oFso.FileExists(modelname)) {
559                // Makefile.*.app
560                // lookup file name
561                var type = oTask.ProjectType;
562                type = type.replace(/[/]/g, ".");
563                type = oFso.GetExtensionName(type);
564                if (type == "") {
565                    type = "basic";
566                }
567                var src_folder = oFso.GetFolder(oTree.SrcProjectBranch);
568                var src_folder_contents = new Enumerator(src_folder.files);
569                modelname = "";
570                for( ; !src_folder_contents.atEnd() && modelname == ""; src_folder_contents.moveNext()) {
571                    var src_file = src_folder_contents.item();
572                    if (oFso.GetExtensionName(src_file) == XX_EXT) {
573                        var t1 = oFso.GetFileName(src_file).replace(/_/g, ".");
574                        var t2 = oFso.GetBaseName(t1);
575                        while ( t1 != t2 ) {
576                            if ( oFso.GetExtensionName( t1 ) == type) {
577                                modelname = src_file;
578                                break;
579                            }
580                            t1 = t2;
581                            t2 = oFso.GetBaseName(t1);
582                        }
583                    }
584                }
585                if ( modelname == "") {
586                    src_folder_contents.moveFirst();
587                    for( ; !src_folder_contents.atEnd(); src_folder_contents.moveNext()) {
588                        var src_file = src_folder_contents.item();
589                        if (oFso.GetExtensionName(src_file) == XX_EXT) {
590                            modelname = src_file;
591                            break;
592                        }
593                    }
594                }
595            }
596
597            samplename = oFso.GetExtensionName( oFso.GetBaseName(modelname) );
598            if (XX_EXT == "lib") {
599                ReplaceInFile( oFso, oTree.SrcProjectBranch, "app", samplename, oTask.ProjectName);
600                ReplaceInFile( oFso, oTree.SrcProjectBranch, "cpp", oTask.ProjectTemplate, oTask.ProjectName);
601            }
602            filename = oTree.SrcProjectBranch + "\\Makefile." + oTask.ProjectName + "." + XX_EXT;
603            VerboseEcho("Converting model file " + modelname + " into " + filename);
604            // open for reading
605            var old_makefile = oFso.OpenTextFile(modelname, 1);
606            // Create new makefile with new project name
607            var new_makefile = oFso.CreateTextFile(filename, true);
608            while( !old_makefile.AtEndOfStream ) {
609                var old_line = old_makefile.ReadLine();
610                if (old_line.indexOf( XX_APP ) == 0) {
611                    if (sourcename != "") {
612                        if (old_line.indexOf(sourcename) >= 0) {
613                            var tt = old_line.replace(sourcename,oTask.ProjectName);
614                            old_line = tt;
615                        }
616                        new_makefile.WriteLine(old_line);
617                    } else {
618                        new_makefile.WriteLine(XX_APP + " = " + oTask.ProjectName);
619                    }
620                }
621/*
622// rename source file ?
623                else if (old_line.indexOf("SRC") == 0) {
624                    var subproj = old_line.split(" ");
625                    var new_line = "";
626                    for (var i = 0; i < subproj.length; i++) {
627                        if (i == 2) {
628                            filename = oTree.SrcProjectBranch + "\\" + subproj[2] + ".cpp";
629                            if (oFso.FileExists(filename)) {
630                                oFso.MoveFile(filename, oTree.SrcProjectBranch + "\\" + oTask.ProjectName + ".cpp");
631                                new_line += oTask.ProjectName + " ";
632                            } else {
633                                new_line += subproj[i] + " ";
634                            }
635                        } else {
636                            new_line += subproj[i] + " ";
637                        }
638                    }
639                    new_makefile.WriteLine(new_line);
640                }
641*/
642                else {
643                    if (old_line.indexOf(oTask.ProjectTemplate) >= 0) {
644                        var tt = old_line.replace(oTask.ProjectTemplate,oTask.ProjectName);
645                        old_line = tt;
646                    }
647                    if (old_line.indexOf("#") == 0 && old_line.indexOf(sourcename) > 0) {
648                        var tt = old_line.replace(sourcename,oTask.ProjectName);
649                        old_line = tt;
650                    }
651                    new_makefile.WriteLine(old_line);
652                }
653            }
654            old_makefile.Close();
655            new_makefile.Close();
656            oFso.DeleteFile(modelname, true);
657
658// MSVC customisation
659            modelname += ".msvc";
660            filename += ".msvc";
661            if (oFso.FileExists(modelname)) {
662                oFso.MoveFile(modelname, filename);
663            }
664        }
665        function ReplaceInFile(oFso, srcdir, srcext, findtxt, replacetxt)
666        {
667            var src_folder = oFso.GetFolder(srcdir);
668            var src_folder_contents = new Enumerator(src_folder.files);
669            var src_file;
670            for( ; !src_folder_contents.atEnd(); src_folder_contents.moveNext()) {
671                src_file = src_folder_contents.item();
672                if (oFso.GetExtensionName(src_file) == srcext) {
673//                    break;
674                    var old_name = src_file;
675                    var new_name = src_file+"new";
676                    oFso.CopyFile(old_name, new_name);
677                    old_name = src_file;
678                    var old_makefile = oFso.OpenTextFile(new_name, 1);
679                    var new_makefile = oFso.CreateTextFile(old_name, true);
680                    while( !old_makefile.AtEndOfStream ) {
681                        var old_line = old_makefile.ReadLine();
682                        var tt = old_line.replace(findtxt,replacetxt);
683                        old_line = tt;
684                        new_makefile.WriteLine(old_line);
685                    }
686                    old_makefile.Close();
687                    new_makefile.Close();
688                    oFso.DeleteFile(new_name, true);
689                }
690            }
691        }
692        // Run project tree builder
693        function RunPtb(oShell, oTree, oTask)
694        {
695            var ptb_platform = GetTargetPlatform();
696            var sln_path;
697            if ( oTask.DllBuild ) {
698                sln_path = oTree.CompilersBranchDll   + "\\build\\" + oTask.ProjectName + ".sln";
699            } else {
700                sln_path = oTree.CompilersBranchStatic + "\\build\\" + oTask.ProjectName + ".sln";
701            }
702            var ptb_path;
703            var conf = GetConfigs(oTask)[0];
704            if (oTask.DllBuild) {
705                ptb_path = oTree.BinPathDll;
706            } else {
707                ptb_path = oTree.BinPathStatic;
708            }
709            ptb_path += "\\" + conf;
710            var ptb_flags;
711            ptb_flags = "";
712            if ( oTask.DllBuild ) {
713                ptb_flags += " -dll";
714            }
715            if (GetVerbose()) {
716                ptb_flags += " -cfg";
717            }
718            ptb_flags += " -nobuildptb";
719            ptb_flags += " -ext -nws -extroot \"";
720            var lib_dir = oTask.ToolkitPath + "\\lib\\";
721            if ( oTask.DllBuild ) {
722                lib_dir += "dll";
723            } else {
724                lib_dir += "static";
725            }
726            var oFso = new ActiveXObject("Scripting.FileSystemObject");
727            if (!oFso.FolderExists(lib_dir)) {
728                lib_dir = oTask.ToolkitPath + "\\";
729                if ( oTask.DllBuild ) {
730                    lib_dir += "dll";
731                } else {
732                    lib_dir += "static";
733                }
734                lib_dir += "\\lib";
735            }
736            ptb_flags += lib_dir + "\"";
737            var sysenv = oShell.Environment("PROCESS");
738            sysenv("PTB_PLATFORM") = ptb_platform;
739            sysenv("PTB_FLAGS") = ptb_flags;
740            sysenv("PTB_PATH") = ptb_path;
741            sysenv("SLN_PATH") = sln_path;
742            sysenv("TREE_ROOT") = oTree.TreeRoot;
743            sysenv("BUILD_TREE_ROOT") = oTree.CompilersBranch;
744            sysenv("PTB_PROJECT_REQ") = "src\\";
745
746            var ptb_command_line;
747            ptb_command_line = "\"" + oTree.CompilersBranch + "\\ptb.bat\"";
748            if (!GetVerbose()) {
749                WScript.Echo(ptb_command_line);
750            }
751            if ( execute(oShell, ptb_command_line) != 0) {
752                WScript.Echo("ERROR: project_tree_builder failed");
753                WScript.Quit(1);
754            }
755        }
756        function AutoMountS(oTask)
757        {
758            var check = CheckNetworkDrive();
759            if (check == "ok") {
760                return;
761            }
762            var message = "\n";
763            message += "Generated solution uses libraries from a network location:\n";
764            message += "        " + GetDefaultLibFolder() + "\n";
765            message += "It is recommended that this location is mapped to drive S:\n";
766            if (check == "wrong") {
767                message += "\nDisk S: is now mapped to a wrong location!\n";
768                if (oTask.AutoMapS == "ask") {
769                    ShowMessage(message);
770                } else {
771                    WScript.Echo(message);
772                }
773                return;
774            }
775            if (oTask.AutoMapS == "ask") {
776                message += "\nDo you want to map the network drive?\n";
777                if (InputFlagYN(message)) {
778                    MapNetworkDrive();
779                }
780            } else {
781                if (oTask.AutoMapS == "yes") {
782                    MapNetworkDrive();
783                } else {
784                    WScript.Echo(message);
785                }
786            }
787        }
788        // Open generated solution in  MSVC IDE
789        function LoadSolution(oShell, oTree, oTask)
790        {
791            AutoMountS(oTask);
792            if ( GetFlagValue(WScript.Arguments, "-noopen", false)) {
793                return;
794            }
795            var sln_path = " \"";
796            if ( oTask.DllBuild ) {
797                sln_path += oTree.CompilersBranchDll;
798            } else {
799                sln_path += oTree.CompilersBranchStatic;
800            }
801            sln_path += "\\build\\" + oTask.ProjectName + ".sln\"";
802
803            WScript.Echo("Generated solution: " + sln_path);
804            if (GetOpenSolution()) {
805                execute(oShell, "start \"\" " + sln_path);
806            }
807        }
808
809        </script>
810
811        <script language="JScript">
812        WScript.Echo(WScript.ScriptFullName);
813        var oShell = WScript.CreateObject("WScript.shell");
814
815        var oTask  = new Task();
816        VerifyTask(oShell, oTask);
817        WScript.Echo("========================= Task ========================================");
818        DumpTask(oTask);
819
820        var oTree  = new Tree(oShell, oTask);
821        VerboseEcho("========================= Tree ========================================");
822        DumpTree(oTree);
823
824        WScript.Echo("========================= CreateTreeStructure =========================");
825        CreateTreeStructure(oTree, oTask);
826        WScript.Echo("========================= FillTree ====================================");
827        FillTree           (oShell, oTree);
828        WScript.Echo("========================= CopyPtb =====================================");
829        CopyPtb            (oShell, oTree, oTask);
830        WScript.Echo("========================= CopyDatatool ================================");
831        CopyDatatool       (oShell, oTree, oTask);
832        VerboseEcho("========================= CopyDlls ====================================");
833        CopyDlls           (oShell, oTree, oTask);
834        WScript.Echo("========================= CopyProjectTemplate =========================");
835        CopyProjectTemplate(oShell, oTree, oTask);
836        WScript.Echo("========================= AdjustProject ===============================");
837        AdjustProject      (oShell, oTree, oTask);
838        WScript.Echo("========================= RunPtb ======================================");
839        RunPtb             (oShell, oTree, oTask);
840        WScript.Echo("========================= LoadSolution ================================");
841        LoadSolution       (oShell, oTree, oTask);
842        WScript.Echo("========================= done ========================================");
843         </script>
844    </job>
845</package>
846
847