1 module dco.buildExes; 2 3 import core.time; 4 5 import std.file; 6 import std..string; 7 import std.process; 8 import std.stdio; 9 import std.datetime; 10 import std.datetime.stopwatch; 11 import std.exception; 12 import dco.readConfigs; 13 import dco.globalInfo; 14 import dco.checkInfo; 15 import dco.operateFile; 16 17 void buildExe(string[] args) 18 { 19 string c; 20 size_t p; 21 22 if(bGetLocal) goto build; 23 24 foreach(int i,arg;args) 25 { 26 if(i ==0) continue; 27 c = toLower(arg); 28 p = c.indexOf('-'); 29 if(p != -1) 30 { 31 c = c[p+1 .. c.length]; 32 33 switch(c) 34 { 35 case "gui": 36 strTargetLflags = strWindows; 37 bUseSpecialLib = true; 38 strAddArgs = strAddArgsdfl; 39 break; 40 case "use": 41 bUseSpecialLib = true; 42 strAddArgs = strAddArgsdfl; 43 break; 44 case "win","windows","winexe": 45 strTargetLflags = strWindows; 46 strLibs =strWinLibs; 47 break; 48 case "debug": 49 bDebug = true; 50 break; 51 case "release": 52 bDebug = false; 53 buildMode = " -" ~ c.idup; 54 break; 55 56 case "console","con","exe": 57 strTargetLflags = strConsole; 58 break; 59 case "all": 60 bUseSpecialLib = false; 61 strAddLib = strLibs; 62 strAddArgs = strAddArgsdfl; 63 strImport = strImportDefault; 64 strTargetLflags = strConsole; 65 break; 66 case "addlib": 67 strAddLib = strLibs~" "; 68 //strImport = strImportDefault; 69 //strTargetLflags = strConsole; 70 break; 71 case "arg": 72 strAddArgs = strAddArgsdfl; 73 break; 74 case "lib": 75 strTargetTypeSwitch = " -" ~ targetTypeDefault; 76 break; 77 case "dfl","dfllib": 78 SpecialLib = "dfl"; 79 bBuildSpecialLib = true; 80 strTargetTypeSwitch = " -" ~ targetTypeDefault; 81 break; 82 case "dgui","dguilib": 83 SpecialLib = "dgui"; 84 bBuildSpecialLib = true; 85 strTargetTypeSwitch = " -" ~ targetTypeDefault; 86 break; 87 case "copy": 88 bCopy = true; 89 break; 90 case "force": 91 bForce = true; 92 break; 93 case "shared": 94 strTargetTypeSwitch = " -" ~ targetTypeShared; 95 strTargetType = "dll"; 96 break; 97 default: 98 if(c == "m64" || c == "m32mscoff") 99 { 100 compileType =c[1..$]; 101 } 102 strOtherArgs ~= " "; 103 strOtherArgs ~= arg; 104 break; 105 } 106 } 107 } 108 109 strTargetLib = bDebug ? SpecialLib ~ "_debug" ~ compileType ~ ".lib" : SpecialLib ~ compileType ~ ".lib" ; 110 111 if(bBuildSpecialLib) 112 { 113 strOtherArgs ~= " -of" ~ strTargetPath ~ separator ~ strTargetLib; 114 strAddLib = strLibs; 115 strTargetFileName = getcwd() ~ separator ~ strTargetLib; 116 } 117 else 118 { 119 strTargetFileName = getcwd() ~ separator ~ strTargetName; 120 } 121 122 123 if(strTargetLflags == "" && strLflags !="") 124 { 125 strTargetLflags = strLflags; 126 } 127 128 if(strTargetLflags == "" && strLflags =="") 129 { 130 if(bUseSpecialLib) 131 strTargetLflags = strWindows; 132 else 133 strTargetLflags = strConsole; 134 } 135 136 build: 137 138 if(buildMode.toLower().indexOf("debug") != -1) 139 { 140 strOtherArgs ~= " -g"; 141 } 142 143 if(strDflags != "") 144 { 145 strOtherArgs ~= " "; 146 strOtherArgs ~= strDflags; 147 } 148 149 if(strObjPath != "") 150 { 151 strOtherArgs ~= " -od"; 152 strOtherArgs ~= strObjPath; 153 } 154 155 if(bUseSpecialLib) 156 { 157 writeln("dco.ini's SpecialLib is ",SpecialLib); 158 if(SpecialLib == "dfl" || SpecialLib == "dgui") 159 { 160 strTargetLib = bDebug ? SpecialLib ~ "_debug" ~ compileType ~ ".lib" : SpecialLib ~ compileType ~ ".lib" ; 161 strLibs =strWinLibs; 162 } 163 164 if(SpecialLib !="") 165 { 166 strAddLib = strLibs ~" " ~ strTargetLib ; 167 } 168 } 169 else 170 { 171 strAddLib = strLibs; 172 } 173 174 if(compileType == "64") 175 { 176 if(strip(strTargetLflags) !=strip(strConsole)) 177 { 178 if(strAddLib.indexOf(strip(strWinLibs64)) == -1) 179 { 180 strAddLib ~= strWinLibs64; 181 } 182 183 strTargetLflags = strWindows64; 184 } 185 else //console x64 not set 186 { 187 strTargetLflags= ""; 188 } 189 } 190 191 buildExe(); 192 } 193 194 void buildExe() 195 { 196 if(bForce) 197 { 198 removeExe(strTargetFileName); 199 } 200 strDC ~= " "; 201 strDC ~= strTargetTypeSwitch; 202 string strCommon = strOtherArgs ~" " ~ strImportDefault ~ strImport ~ " " ~ strAddLib ~ strTargetLflags ~ strDFile ~ buildMode; 203 string buildstr = strDC ~ strAddArgsdfl ~ strCommon ~ "\r\n"; 204 buildstr = bUseSpecialLib ? buildstr : strDC ~ strCommon; 205 206 std.datetime.stopwatch.StopWatch sw; 207 sw.start(); 208 auto pid = enforce(spawnShell(buildstr.dup()),"build function is error! "); 209 210 if (wait(pid) != 0) 211 { 212 writeln("\n"~ buildstr); 213 writeln("\nCompilation failed:\n", pid); 214 215 auto err = File("ErrBuild.txt","w"); 216 scope(failure) err.close(); 217 err.writeln(buildstr); 218 err.close(); 219 } 220 else 221 { 222 sw.stop(); 223 224 writeln(buildstr); 225 writeln("\nCompile time :" , sw.peek().total!"seconds","secs"); 226 227 if(bCopy) 228 { 229 copyFile(); 230 } 231 } 232 233 writeln("End."); 234 }