1 3 5 22 23 package edu.neu.ccs.jmk; 24 25 import java.io.*; 26 import java.util.Hashtable ; 27 import java.util.Vector ; 28 29 41 public class Make 42 implements Operator 43 { 44 private final static String defaultMakefileName = "makefile.jmk"; 45 46 49 public static String getVersion() { 50 String cvsName = CvsInfo.getTag("$Name: JMK1_6 $"); 51 if (cvsName == null || cvsName.length() == 0) 52 cvsName = "unknown"; 53 else if (cvsName.startsWith("JMK")) 54 cvsName = cvsName.substring(3).trim(); 55 return "Make for Java version " + cvsName; 56 } 57 58 61 62 private Hashtable dir = new Hashtable (); 65 66 Rule get(String name) { 67 Rule rule = (Rule)dir.get(name); 68 if (rule == null) { 69 rule = new Rule(this, name); 70 put(rule); 71 } 72 return rule; 73 } 74 75 private Rule put(Rule rule) { 76 return (Rule)dir.put(rule.getTarget(), rule); 77 } 78 79 private Vector patterns = new Vector (); 82 83 88 boolean tryPatterns(Rule rule) { 89 for (int i = patterns.size() - 1; i >= 0; i--) { 90 Pattern pattern = (Pattern)patterns.elementAt(i); 91 if (pattern.merge(rule)) 92 return true; 93 } 94 return false; 95 } 96 97 101 private boolean maybeAddPattern(String target, String [] prerequisites, 102 Command[] commands, int lineNumber) { 103 if (isPattern(target, prerequisites)) { 104 patterns.addElement(new Pattern(target, prerequisites, 105 commands, lineNumber)); 106 return true; 107 } 108 else 109 return false; 110 } 111 112 115 private static boolean isPattern(String target, String [] prerequisites) { 116 if (Matcher.isPattern(target)) 117 return true; 118 for (int i = 0; i < prerequisites.length; i++) 119 if (Matcher.isPattern(prerequisites[i])) 120 return true; 121 return false; 122 } 123 124 128 private boolean maybeAddSpecialTarget(String target, 129 String [] prerequisites) { 130 if (target.equals(".PHONY")) { 131 for (int i = 0; i < prerequisites.length; i++) 132 get(prerequisites[i]).setPhony(true); 133 return true; 134 } 135 else 136 return false; 137 } 138 139 private String defaultTarget = "default"; 142 143 private boolean hasSeenARule; 144 145 149 void addRule(String target, String [] prerequisites, 150 Command[] commands, int lineNumber) { 151 if (maybeAddPattern(target, prerequisites, commands, lineNumber)) 152 return; 153 if (maybeAddSpecialTarget(target, prerequisites)) 154 return; 155 if (!hasSeenARule) { defaultTarget = target; hasSeenARule = true; 158 } 159 Rule rule = get(target); Rule[] dependencies = new Rule[prerequisites.length]; 161 for (int i = 0; i < prerequisites.length; i++) dependencies[i] = get(prerequisites[i]); rule.merge(dependencies, commands, lineNumber); 164 } 165 166 167 168 private PrintWriter out = new PrintWriter(System.out, true); 169 170 174 public PrintWriter getOut() { 175 return out; 176 } 177 178 182 public void setOut(PrintWriter out) { 183 this.out = out; 184 } 185 186 private File file = new File(defaultMakefileName); 187 188 193 public File getFile() { 194 return file; 195 } 196 197 201 public void setFile(File file) { 202 if (file == null) 203 this.file = new File(defaultMakefileName); 204 else 205 this.file = file; 206 } 207 208 private boolean verbose = false; 209 210 216 public boolean isVerbose() { 217 return verbose; 218 } 219 220 223 public void setVerbose(boolean verbose) { 224 this.verbose = verbose; 225 } 226 227 private boolean justPrinting = false; 228 229 234 public boolean isJustPrinting() { 235 return justPrinting; 236 } 237 238 241 public void setJustPrinting(boolean justPrinting) { 242 this.justPrinting = justPrinting; 243 } 244 245 254 private static volatile boolean interrupt = false; 255 256 260 public boolean isInterruptEnabled() { 261 return interrupt; 262 } 263 264 270 public void setInterruptEnabled(boolean interrupt) { 271 this.interrupt = interrupt; 272 } 273 274 281 public synchronized boolean make(String [] targets) 282 throws CommandFailedException 283 { 284 interrupt = false; 285 if (targets.length == 0) 286 targets = new String [] { defaultTarget }; 287 try { 288 boolean made = false; 289 for (int i = 0; i < targets.length; i++) 290 if (get(targets[i]).make()) 291 made = true; 292 return made; 293 } 294 finally { for (int i = 0; i < targets.length; i++) get(targets[i]).reset(); 297 interrupt = false; 298 } 299 } 300 301 305 306 374 public synchronized void load() 375 throws FileNotFoundException, ParseError 376 { 377 load(new FileReader(getFile())); 378 } 379 380 385 public synchronized void load(Reader in) 386 throws ParseError 387 { 388 dir = new Hashtable (); 389 patterns = new Vector (); 390 hasSeenARule = false; 391 new Loader(this, in).load(); 392 } 393 394 397 398 public String getName() { 399 return "make"; 400 } 401 402 408 public void exec(String [] args, PrintWriter out) 409 throws CommandFailedException 410 { 411 boolean useWindow = false; 412 boolean useSwing = false; 413 setOut(out); 414 if (args.length > 0 && args[0].startsWith("-")) { 416 int i = 0; 417 switches: for (; i < args.length; i++) { 419 if (!args[i].startsWith("-")) break; if (args[i].length() != 2) { 422 out.println("Unrecognized switch: " + args[i]); 423 usage(); 424 return; 425 } 426 switch (args[i].charAt(1)) { 427 case 'v': 428 out.println(getVersion()); 429 return; 430 case 'f': 431 i++; 432 if (i < args.length) 433 setFile(new File(args[i])); 434 else { 435 out.println("No makefile for -f option"); 436 usage(); 437 return; 438 } 439 break; 440 case 'd': 441 setVerbose(true); 442 break; 443 case 'n': 444 setJustPrinting(true); 445 break; 446 case 'w': 447 useWindow = true; 448 break; 449 case 's': 450 useSwing = true; 451 break; 452 case '-': 453 i++; 454 break switches; 455 default: 456 out.println("Unrecognized switch: " + args[i]); 457 usage(); 458 return; 459 } 460 } 461 Vector v = new Vector (); for (; i < args.length; i++) 463 v.addElement(args[i]); 464 args = new String [v.size()]; 465 v.copyInto(args); } 467 readAndMake(args, useWindow, useSwing); 468 } 469 470 private void usage() 471 throws CommandFailedException 472 { 473 out.println("Usage: java " + Make.class.getName() + 474 " [-f filename] [-d] [-n] [-v] [-w] [-s] filename ..."); 475 out.println(" -f use filename for makefile" + 476 " (default is " + defaultMakefileName + ")"); 477 out.println(" -d print debugging information"); 478 out.println(" -n print but don't run commands"); 479 out.println(" -w use AWT window for make output"); 480 out.println(" -s use Swing window for make output"); 481 out.println(" -v print the version number"); 482 fail(); 483 } 484 485 private void fail() 486 throws CommandFailedException 487 { 488 throw new CommandFailedException("Make failed"); 489 } 490 491 497 public void readAndMake(String [] targets, 498 boolean useWindow, 499 boolean useSwing) 500 throws CommandFailedException 501 { 502 if (useWindow) { 503 edu.neu.ccs.jmk.awt.MakeWindow.createMakeWindow(this, targets); 504 } 505 else if (useSwing) { 506 try { edu.neu.ccs.jmk.swing.JMakeWindow.createMakeWindow(this, targets); 508 } 509 catch (LinkageError le) { 510 edu.neu.ccs.jmk.awt.MakeWindow.createMakeWindow(this, targets); 511 } 512 } 513 else { 514 File file = getFile(); 515 Reader in; 517 if (file.getPath().equals("-")) 518 in = new InputStreamReader(System.in); 519 else { 520 try { 521 in = new FileReader(file); 522 } 523 catch (FileNotFoundException ex) { 524 out.println("Cannot find makefile " + file.getPath()); 525 fail(); 526 return; 527 } 528 } 529 530 try { 531 load(in); } 533 catch (ParseError pe) { 534 out.println(pe.getFileName() + ":" + pe.getLineNumber() 535 + ": Parse error: " + pe.getMessage()); 536 fail(); 537 return; 538 } 539 540 try { 541 if (!make(targets)) out.println("Nothing to make"); 543 } 544 catch (CommandFailedException ex) { 545 out.println("Command failed: " + ex.getMessage()); 546 fail(); 547 return; 548 } 549 } 550 } 551 552 555 556 560 public static void main(String [] args) { 561 PrintWriter out = new PrintWriter(System.out, true); 562 Make make = new Make(); 563 try { 564 make.exec(args, out); 565 } 566 catch (CommandFailedException ex) { 567 System.exit(1); 568 } 569 catch (Throwable t) { 570 System.err.println("Internal error: " + t.getMessage()); 571 t.printStackTrace(); 572 System.exit(1); 573 } 574 } 575 } 576 | Popular Tags |