Fix a bug where the content of variables are appended instead of being
[tatoo.git] / remake.cpp
1 /**
2 @mainpage Remake, a build system that bridges the gap between make and redo.
3
4 As with <b>make</b>, <b>remake</b> uses a centralized rule file, which is
5 named <b>Remakefile</b>. It contains rules with a <em>make</em>-like
6 syntax:
7
8 @verbatim
9 target1 target2 ... : prerequisite1 prerequisite2 ...
10         shell script
11         that builds
12         the targets
13 @endverbatim
14
15 A target is known to be up-to-date if all its prerequisites are. If it
16 has no known prerequisites yet the file already exits, it is assumed to
17 be up-to-date. Obsolete targets are rebuilt thanks to the shell script
18 provided by the rule.
19
20 As with <b>redo</b>, <b>remake</b> supports dynamic dependencies in
21 addition to these static dependencies. Whenever a script executes
22 <tt>remake prerequisite4 prerequisite5 ...</tt>, these prerequisites are
23 rebuilt if they are obsolete. (So <b>remake</b> acts like
24 <b>redo-ifchange</b>.) Moreover, all the dependencies are stored in file
25 <b>.remake</b> so that they are remembered in subsequent runs. Note that
26 dynamic dependencies from previous runs are only used to decide whether a
27 target is obsolete; they are not automatically rebuilt when they are
28 obsolete yet a target depends on them. They will only be rebuilt once the
29 dynamic call to <b>remake</b> is executed.
30
31 In other words, the following two rules have almost the same behavior.
32
33 @verbatim
34 target1 target2 ... : prerequisite1 prerequisite2 ...
35         shell script
36
37 target1 target2 ... :
38         remake prerequisite1 prerequisite2 ...
39         shell script
40 @endverbatim
41
42 (There is a difference if the targets already exist, have never been
43 built before, and the prerequisites are either younger or obsolete, since
44 the targets will not be rebuilt in the second case.)
45
46 The above usage of dynamic dependencies is hardly useful. Their strength
47 lies in the fact that they can be computed on the fly:
48
49 @verbatim
50 %.o : %.c
51         gcc -MMD -MF $@.d -o $@ -c $<
52         remake -r < $@.d
53         rm $@.d
54
55 %.cmo : %.ml
56         ocamldep $< | remake -r $@
57         ocamlc -c $<
58
59 after.xml: before.xml rules.xsl
60         xsltproc --load-trace -o after.xml rules.xsl before.xml 2> deps
61         remake `sed -n -e "\\,//,! s,^.*URL=\"\\([^\"]*\\).*\$,\\1,p" deps`
62         rm deps
63 @endverbatim
64
65 Note that the first rule fails if any of the header files included by
66 a C source file has to be automatically generated. In that case, one
67 should perform a first call to <b>remake</b> them before calling the
68 compiler. (Dependencies from several calls to <b>remake</b> are
69 cumulative, so they will all be remembered the next time.)
70
71 \section sec-usage Usage
72
73 Usage: <tt>remake <i>options</i> <i>targets</i></tt>
74
75 Options:
76
77 - <tt>-d</tt>: Echo script commands.
78 - <tt>-f FILE</tt>: Read <tt>FILE</tt> as <b>Remakefile</b>.
79 - <tt>-j[N]</tt>, <tt>--jobs=[N]</tt>: Allow <tt>N</tt> jobs at once;
80   infinite jobs with no argument.
81 - <tt>-k</tt>, <tt>--keep-going</tt>: Keep going when some targets cannot be made.
82 - <tt>-r</tt>: Look up targets from the dependencies on standard input.
83 - <tt>-s</tt>, <tt>--silent</tt>, <tt>--quiet</tt>: Do not echo targets.
84
85 \section sec-syntax Syntax
86
87 Lines starting with a space character or a tabulation are assumed to be rule
88 scripts. They are only allowed after a rule header.
89
90 Lines starting with <tt>#</tt> are considered to be comments and are ignored.
91 They do interrupt rule scripts though.
92
93 Any other line is either a rule header or a variable definition. If such a
94 line ends with a backslash, the following line break is ignored and the line
95 extends to the next one.
96
97 Rule headers are a nonempty list of names, followed by a colon, followed by
98 another list of names, possibly empty. Variable definitions are a single
99 name followed by equal followed by a list of names, possibly empty. Basically,
100 the syntax of a rule is as follows:
101
102 @verbatim
103 targets : prerequisites
104         shell script
105 @endverbatim
106
107 List of names are space-separated sequences of names. If a name contains a
108 space character, it should be put into double quotes. Names can not be any
109 of the following special characters <tt>:$(),="</tt>. Again, quotation
110 should be used. Quotation marks can be escaped by a backslash inside
111 quoted names.
112
113 \subsection sec-variables Variables
114
115 Variables can be used to factor lists of targets or prerequisites. They are
116 expanded as they are encountered during <b>Remakefile</b> parsing.
117
118 @verbatim
119 VAR2 = a
120 VAR1 = c d
121 VAR2 += $(VAR1) b
122 $(VAR2) e :
123 @endverbatim
124
125 Variable assignments can appear instead of prerequisites inside non-generic
126 rules with no script. They are then expanded inside the corresponding
127 generic rule.
128
129 @verbatim
130 foo.o: CFLAGS += -DBAR
131
132 %.o : %.c
133         gcc $(CFLAGS) -MMD -MF $@.d -o $@ -c $<
134         remake -r < $@.d
135         rm $@.d
136 @endverbatim
137
138 Note: contrarily to <b>make</b>, variable names have to be enclosed in
139 parentheses. For instance, <tt>$y</tt> is not a shorthand for <tt>\$(y)</tt> and
140 is left unexpanded.
141
142 \subsection sec-autovars Automatic variables
143
144 The following special symbols can appear inside scripts:
145
146 - <tt>$&lt;</tt> expands to the first static prerequisite of the rule.
147 - <tt>$^</tt> expands to all the static prerequisites of the rule, including
148   duplicates if any.
149 - <tt>$\@</tt> expands to the first target of the rule.
150 - <tt>$*</tt> expands to the string that matched <tt>%</tt> in a generic rule.
151 - <tt>$$</tt> expands to a single dollar symbol.
152
153 Note: contrarily to <b>make</b>, there are no corresponding variables. For
154 instance, <tt>$^</tt> is not a shorthand for <tt>$(^)</tt>. Another
155 difference is that <tt>$\@</tt> is always the first target, not the one that
156 triggered the rule.
157
158 \subsection sec-functions Built-in functions
159
160 <b>remake</b> also supports a few built-in functions inspired from <b>make</b>.
161
162 - <tt>$(addprefix <i>prefix</i>, <i>list</i>)</tt> returns the list obtained
163   by prepending its first argument to each element of its second argument.
164 - <tt>$(addsuffix <i>suffix</i>, <i>list</i>)</tt> returns the list obtained
165   by appending its first argument to each element of its second argument.
166
167 \section sec-semantics Semantics
168
169 \subsection src-obsolete When are targets obsolete?
170
171 A target is obsolete:
172
173 - if there is no file corresponding to the target, or to one of its siblings
174   in a multi-target rule,
175 - if any of its dynamic prerequisites from a previous run or any of its static
176   prerequisites is obsolete,
177 - if the latest file corresponding to its siblings or itself is older than any
178   of its dynamic prerequisites or static prerequisites.
179
180 In all the other cases, it is assumed to be up-to-date (and so are all its
181 siblings). Note that the last rule above says "latest" and not "earliest". While
182 it might cause some obsolete targets to go unnoticed in corner cases, it allows
183 for the following kind of rules:
184
185 @verbatim
186 config.h stamp-config_h: config.h.in config.status
187         ./config.status config.h
188         touch stamp-config_h
189 @endverbatim
190
191 A <tt>config.status</tt> file generally does not update header files (here
192 <tt>config.h</tt>) if they would not change. As a consequence, if not for the
193 <tt>stamp-config_h</tt> file above, a header would always be considered obsolete
194 once one of its prerequisites is modified. Note that touching <tt>config.h</tt>
195 rather than <tt>stamp-config_h</tt> would defeat the point of not updating it
196 in the first place, since the program files would need to be rebuilt.
197
198 Once all the static prerequisites of a target have been rebuilt, <b>remake</b>
199 checks whether the target still needs to be built. If it was obsolete only
200 because its prerequisites needed to be rebuilt and none of them changed, the
201 target is assumed to be up-to-date.
202
203 \subsection sec-rules How are targets (re)built?
204
205 There are two kinds of rules. If any of the targets or prerequisites contains
206 a <tt>%</tt> character, the rule is said to be <em>generic</em>. All the
207 targets of the rule shall then contain a single <tt>%</tt> character. All the
208 other rules are said to be <em>specific</em>.
209
210 A rule is said to <em>match</em> a given target:
211
212 - if it is specific and the target appears inside its target list,
213 - if it is generic and there is a way to replace the <tt>%</tt> character
214   from one of its targets so that it matches the given target.
215
216 When <b>remake</b> tries to build a given target, it looks for a specific rule
217 that matches it. If there is one and its script is nonempty, it uses it to
218 rebuild the target.
219
220 Otherwise, it looks for a generic rule that match the target. If there are
221 several matching rules, it chooses the one with the shortest pattern (and if
222 there are several ones, the earliest one). <b>remake</b> then looks for
223 specific rules that match each target of the generic rule. All the
224 prerequisites of these specific rules are added to those of the generic rule.
225 The script of the generic rule is used to build the target.
226
227 Example:
228
229 @verbatim
230 t%1 t2%: p1 p%2
231         commands building t%1 and t2%
232
233 t2z: p4
234         commands building t2z
235
236 ty1: p3
237
238 # t2x is built by the first rule (which also builds tx1) and its prerequisites are p1, px2
239 # t2y is built by the first rule (which also builds ty1) and its prerequisites are p1, py2, p3
240 # t2z is built by the second rule and its prerequisite is p4
241 @endverbatim
242
243 The set of rules from <b>Remakefile</b> is ill-formed:
244
245 - if any specific rule matching a target of the generic rule has a nonempty script,
246 - if any target of the generic rule is matched by a generic rule with a shorter pattern.
247
248 \section sec-compilation Compilation
249
250 - On Linux, MacOSX, and BSD: <tt>g++ -o remake remake.cpp</tt>
251 - On Windows: <tt>g++ -o remake.exe remake.cpp -lws2_32</tt>
252
253 Installing <b>remake</b> is needed only if <b>Remakefile</b> does not
254 specify the path to the executable for its recursive calls. Thanks to its
255 single source file, <b>remake</b> can be shipped inside other packages and
256 built at configuration time.
257
258 \section sec-differences Differences with other build systems
259
260 Differences with <b>make</b>:
261
262 - Dynamic dependencies are supported.
263 - For rules with multiple targets, the shell script is executed only once
264   and is assumed to build all the targets. There is no need for
265   convoluted rules that are robust enough for parallel builds. For generic
266   rules, this is similar to the behavior of pattern rules from <b>gmake</b>.
267 - As with <b>redo</b>, only one shell is run when executing a script,
268   rather than one per script line. Note that the shells are run with
269   option <tt>-e</tt>, thus causing them to exit as soon as an error is
270   encountered.
271 - The prerequisites of generic rules (known as implicit rules in make lingo)
272   are not used to decide between several of them. <b>remake</b> does not
273   select one for which it could satisfy the dependencies.
274 - Variables and built-in functions are expanded as they are encountered
275   during <b>Remakefile</b> parsing.
276
277 Differences with <b>redo</b>:
278
279 - As with <b>make</b>, it is possible to write the following kind of rules
280   in <b>remake</b>.
281 @verbatim
282 Remakefile: Remakefile.in ./config.status
283         ./config.status Remakefile
284 @endverbatim
285 - If a target is already built the first time <b>remake</b> runs, it still
286   uses the static prerequisites of rules mentioning it to check whether it
287   needs to be rebuilt. It does not assume it to be up-to-date. As with
288   <b>redo</b> though, if its obsolete status would be due to a dynamic
289   prerequisite, it will go unnoticed; it should be removed beforehand.
290 - Multiple targets are supported.
291 - <b>remake</b> has almost no features: no checksum-based dependencies, no
292   compatibility with job servers, etc.
293
294 \section sec-limitations Limitations
295
296 - When the user calls <b>remake</b>, the current working directory should be
297   the one containing <b>.remake</b>. Rules are understood relatively to this
298   directory. If a rule script calls <b>remake</b>, the current working
299   directory should be the same as the one from the original <b>remake</b>.
300 - Some cases of ill-formed rules are not caught by <b>remake</b> and can
301   thus lead to unpredictable behaviors.
302
303 \section sec-links Links
304
305 @see http://cr.yp.to/redo.html for the philosophy of <b>redo</b> and
306 https://github.com/apenwarr/redo for an implementation and some comprehensive documentation.
307
308 \section sec-licensing Licensing
309
310 @author Guillaume Melquiond
311 @version 0.8
312 @date 2012-2013
313 @copyright
314 This program is free software: you can redistribute it and/or modify
315 it under the terms of the GNU General Public License as published by
316 the Free Software Foundation, either version 3 of the License, or
317 (at your option) any later version.
318 \n
319 This program is distributed in the hope that it will be useful,
320 but WITHOUT ANY WARRANTY; without even the implied warranty of
321 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
322 GNU General Public License for more details.
323
324 \section sec-internals Internals
325
326 The parent <b>remake</b> process acts as a server. The other ones have a
327 REMAKE_SOCKET environment variable that tells them how to contact the
328 server. They send the content of the REMAKE_JOB_ID environment variable,
329 so that the server can associate the child targets to the jobs that
330 spawned them. They then wait for completion and exit with the status
331 returned by the server. This is handled by #client_mode.
332
333 The server calls #load_dependencies and #save_dependencies to serialize
334 dynamic dependencies from <b>.remake</b>. It loads <b>Remakefile</b> with
335 #load_rules. It then runs #server_mode, which calls #server_loop.
336
337 When building a target, the following sequence of events happens:
338
339 - #start calls #find_rule (and #find_generic_rule) to get the rule.
340 - It then creates a pseudo-client if the rule has static dependencies, or
341   calls #run_script otherwise. In both cases, a new job is created and its
342   targets are put into #job_targets.
343 - #run_script creates a shell process and stores it in #job_pids. It
344   increases #running_jobs.
345 - The child process possibly calls <b>remake</b> with a list of targets.
346 - #accept_client receives a build request from a child process and adds
347   it to #clients. It also records the new dependencies of the job into
348   #dependencies. It increases #waiting_jobs.
349 - #handle_clients uses #get_status to look up the obsoleteness of the
350   targets.
351 - Once the targets of a request have been built or one of them has failed,
352   #handle_clients calls #complete_request and removes the request from
353   #clients.
354 - If the build targets come from a pseudo-client, #complete_request calls
355   #run_script. Otherwise it sends the reply to the corresponding child
356   process and decreases #waiting_jobs.
357 - When a child process ends, #server_loop calls #finalize_job, which
358   removes the process from #job_pids, decreases #running_jobs, and calls
359   #complete_job.
360 - #complete_job removes the job from #job_targets and calls #update_status
361   to change the status of the targets. It also removes the target files in
362   case of failure.
363 */
364
365 #ifdef _WIN32
366 #define WIN32_LEAN_AND_MEAN
367 #define WINDOWS
368 #endif
369
370 #include <fstream>
371 #include <iostream>
372 #include <list>
373 #include <map>
374 #include <set>
375 #include <sstream>
376 #include <string>
377 #include <vector>
378 #include <cassert>
379 #include <cstdlib>
380 #include <ctime>
381 #include <errno.h>
382 #include <fcntl.h>
383 #include <signal.h>
384 #include <unistd.h>
385 #include <sys/stat.h>
386 #include <sys/types.h>
387
388 #ifdef __APPLE__
389 #define MACOSX
390 #endif
391
392 #ifdef __linux__
393 #define LINUX
394 #endif
395
396 #ifdef WINDOWS
397 #include <windows.h>
398 #include <winbase.h>
399 #include <winsock2.h>
400 #define pid_t HANDLE
401 typedef SOCKET socket_t;
402 #else
403 #include <sys/socket.h>
404 #include <sys/un.h>
405 #include <sys/wait.h>
406 typedef int socket_t;
407 enum { INVALID_SOCKET = -1 };
408 #endif
409
410 #if defined(WINDOWS) || defined(MACOSX)
411 enum { MSG_NOSIGNAL = 0 };
412 #endif
413
414 typedef std::list<std::string> string_list;
415
416 typedef std::set<std::string> string_set;
417
418 /**
419  * Reference-counted shared object.
420  * @note The default constructor delays the creation of the object until it
421  *       is first dereferenced.
422  */
423 template<class T>
424 struct ref_ptr
425 {
426         struct content
427         {
428                 size_t cnt;
429                 T val;
430                 content(): cnt(1) {}
431                 content(T const &t): cnt(1), val(t) {}
432         };
433         mutable content *ptr;
434         ref_ptr(): ptr(NULL) {}
435         ref_ptr(T const &t): ptr(new content(t)) {}
436         ref_ptr(ref_ptr const &p): ptr(p.ptr) { if (ptr) ++ptr->cnt; }
437         ~ref_ptr() { if (ptr && --ptr->cnt == 0) delete ptr; }
438         ref_ptr &operator=(ref_ptr const &p)
439         {
440                 if (ptr == p.ptr) return *this;
441                 if (ptr && --ptr->cnt == 0) delete ptr;
442                 ptr = p.ptr;
443                 if (ptr) ++ptr->cnt;
444                 return *this;
445         }
446         T &operator*() const
447         {
448                 if (!ptr) ptr = new content;
449                 return ptr->val;
450         }
451         T *operator->() const { return &**this; }
452 };
453
454 struct dependency_t
455 {
456         string_list targets;
457         string_set deps;
458 };
459
460 typedef std::map<std::string, ref_ptr<dependency_t> > dependency_map;
461
462 typedef std::map<std::string, string_list> variable_map;
463
464 /**
465  * Build status of a target.
466  */
467 enum status_e
468 {
469         Uptodate, ///< Target is up-to-date.
470         Todo,     ///< Target is missing or obsolete.
471         Recheck,  ///< Target has an obsolete dependency.
472         Running,  ///< Target is being rebuilt.
473         Remade,   ///< Target was successfully rebuilt.
474         Failed    ///< Build failed for target.
475 };
476
477 /**
478  * Build status of a target.
479  */
480 struct status_t
481 {
482         status_e status; ///< Actual status.
483         time_t last;     ///< Last-modified date.
484 };
485
486 typedef std::map<std::string, status_t> status_map;
487
488 /**
489  * Delayed assignment to a variable.
490  */
491 struct assign_t
492 {
493         std::string name;
494         bool append;
495         string_list value;
496 };
497
498 typedef std::list<assign_t> assign_list;
499
500 /**
501  * A rule loaded from Remakefile.
502  */
503 struct rule_t
504 {
505         string_list targets; ///< Files produced by this rule.
506         string_list deps;    ///< Files used for an implicit call to remake at the start of the script.
507         assign_list vars;    ///< Values of variables.
508         std::string script;  ///< Shell script for building the targets.
509         std::string stem;    ///< String used to instantiate a generic rule.
510 };
511
512 typedef std::list<rule_t> rule_list;
513
514 typedef std::map<std::string, ref_ptr<rule_t> > rule_map;
515
516 typedef std::map<int, string_list> job_targets_map;
517
518 typedef std::map<int, variable_map> job_variables_map;
519
520 typedef std::map<pid_t, int> pid_job_map;
521
522 /**
523  * Client waiting for a request to complete.
524  *
525  * There are two kinds of clients:
526  * - real clients, which are instances of remake created by built scripts,
527  * - pseudo clients, which are created by the server to build specific targets.
528  *
529  * Among pseudo clients, there are two categories:
530  * - original clients, which are created for the targets passed on the
531  *   command line by the user or for the initial regeneration of the rule file,
532  * - dependency clients, which are created to handle rules that have
533  *   explicit dependencies and thus to emulate a call to remake.
534  */
535 struct client_t
536 {
537         socket_t socket;     ///< Socket used to reply to the client (invalid for pseudo clients).
538         int job_id;          ///< Job for which the built script called remake and spawned the client (negative for original clients).
539         bool failed;         ///< Whether some targets failed in mode -k.
540         string_list pending; ///< Targets not yet started.
541         string_set running;  ///< Targets being built.
542         rule_t *delayed;     ///< Rule that implicitly created a dependency client, and which script has to be started on request completion.
543         client_t(): socket(INVALID_SOCKET), job_id(-1), failed(false), delayed(NULL) {}
544 };
545
546 typedef std::list<client_t> client_list;
547
548 /**
549  * Map from variable names to their content.
550  */
551 static variable_map variables;
552
553 /**
554  * Map from targets to their known dependencies.
555  */
556 static dependency_map dependencies;
557
558 /**
559  * Map from targets to their build status.
560  */
561 static status_map status;
562
563 /**
564  * Set of generic rules loaded from Remakefile.
565  */
566 static rule_list generic_rules;
567
568 /**
569  * Map from targets to specific rules loaded from Remakefile.
570  */
571 static rule_map specific_rules;
572
573 /**
574  * Map from jobs to targets being built.
575  */
576 static job_targets_map job_targets;
577
578 /**
579  * Map from jobs to job specific variables
580  */
581 static job_variables_map job_variables;
582
583 /**
584  * Map from jobs to shell pids.
585  */
586 static pid_job_map job_pids;
587
588 /**
589  * List of clients waiting for a request to complete.
590  * New clients are put to front, so that the build process is depth-first.
591  */
592 static client_list clients;
593
594 /**
595  * Maximum number of parallel jobs (non-positive if unbounded).
596  * Can be modified by the -j option.
597  */
598 static int max_active_jobs = 1;
599
600 /**
601  * Whether to keep building targets in case of failure.
602  * Can be modified by the -k option.
603  */
604 static bool keep_going = false;
605
606 /**
607  * Number of jobs currently running:
608  * - it increases when a process is created in #run_script,
609  * - it decreases when a completion message is received in #finalize_job.
610  *
611  * @note There might be some jobs running while #clients is empty.
612  *       Indeed, if a client requested two targets to be rebuilt, if they
613  *       are running concurrently, if one of them fails, the client will
614  *       get a failure notice and might terminate before the other target
615  *       finishes.
616  */
617 static int running_jobs = 0;
618
619 /**
620  * Number of jobs currently waiting for a build request to finish:
621  * - it increases when a build request is received in #accept_client
622  *   (since the client is presumably waiting for the reply),
623  * - it decreases when a reply is sent in #complete_request.
624  */
625 static int waiting_jobs = 0;
626
627 /**
628  * Global counter used to produce increasing job numbers.
629  * @see job_targets
630  */
631 static int job_counter = 0;
632
633 /**
634  * Socket on which the server listens for client request.
635  */
636 static socket_t socket_fd;
637
638 /**
639  * Whether the request of an original client failed.
640  */
641 static bool build_failure;
642
643 #ifndef WINDOWS
644 /**
645  * Name of the server socket in the file system.
646  */
647 static char *socket_name;
648 #endif
649
650 /**
651  * Name of the first target of the first specific rule, used for default run.
652  */
653 static std::string first_target;
654
655 /**
656  * Whether a short message should be displayed for each target.
657  */
658 static bool show_targets = true;
659
660 /**
661  * Whether script commands are echoed.
662  */
663 static bool echo_scripts = false;
664
665 static time_t now = time(NULL);
666
667 static std::string working_dir;
668
669 #ifndef WINDOWS
670 static volatile sig_atomic_t got_SIGCHLD = 0;
671
672 static void sigchld_handler(int)
673 {
674         got_SIGCHLD = 1;
675 }
676
677 static void sigint_handler(int)
678 {
679         // Child processes will receive the signal too, so just prevent
680         // new jobs from starting and wait for the running jobs to fail.
681         keep_going = false;
682 }
683 #endif
684
685 struct log
686 {
687         bool active, open;
688         int depth;
689         log(): active(false), open(false), depth(0)
690         {
691         }
692         std::ostream &operator()()
693         {
694                 if (open) std::cerr << std::endl;
695                 assert(depth >= 0);
696                 std::cerr << std::string(depth * 2, ' ');
697                 open = false;
698                 return std::cerr;
699         }
700         std::ostream &operator()(bool o)
701         {
702                 if (o && open) std::cerr << std::endl;
703                 if (!o) --depth;
704                 assert(depth >= 0);
705                 if (o || !open) std::cerr << std::string(depth * 2, ' ');
706                 if (o) ++depth;
707                 open = o;
708                 return std::cerr;
709         }
710 };
711
712 log debug;
713
714 struct log_auto_close
715 {
716         bool still_open;
717         log_auto_close(): still_open(true)
718         {
719         }
720         ~log_auto_close()
721         {
722                 if (debug.active && still_open) debug(false) << "done\n";
723         }
724 };
725
726 #define DEBUG if (debug.active) debug()
727 #define DEBUG_open log_auto_close auto_close; if (debug.active) debug(true)
728 #define DEBUG_close if ((auto_close.still_open = false), debug.active) debug(false)
729
730 /**
731  * Strong typedef for strings that need escaping.
732  * @note The string is stored as a reference, so the constructed object is
733  *       meant to be immediately consumed.
734  */
735 struct escape_string
736 {
737         std::string const &input;
738         escape_string(std::string const &s): input(s) {}
739 };
740
741 /**
742  * Write the string in @a se to @a out if it does not contain any special
743  * characters, a quoted and escaped string otherwise.
744  */
745 static std::ostream &operator<<(std::ostream &out, escape_string const &se)
746 {
747         std::string const &s = se.input;
748         char const *quoted_char = ",: '";
749         char const *escaped_char = "\"\\$!";
750         bool need_quotes = false;
751         char *buf = NULL;
752         size_t len = s.length(), last = 0, j = 0;
753         for (size_t i = 0; i < len; ++i)
754         {
755                 if (strchr(escaped_char, s[i]))
756                 {
757                         need_quotes = true;
758                         if (!buf) buf = new char[len * 2];
759                         memcpy(&buf[j], &s[last], i - last);
760                         j += i - last;
761                         buf[j++] = '\\';
762                         buf[j++] = s[i];
763                         last = i + 1;
764                 }
765                 if (!need_quotes && strchr(quoted_char, s[i]))
766                         need_quotes = true;
767         }
768         if (!need_quotes) return out << s;
769         out << '"';
770         if (!buf) return out << s << '"';
771         out.write(buf, j);
772         out.write(&s[last], len - last);
773         delete[] buf;
774         return out << '"';
775 }
776
777 /**
778  * @defgroup paths Path helpers
779  *
780  * @{
781  */
782
783 /**
784  * Initialize #working_dir.
785  */
786 void init_working_dir()
787 {
788         char buf[1024];
789         char *res = getcwd(buf, sizeof(buf));
790         if (!res)
791         {
792                 perror("Failed to get working directory");
793                 exit(EXIT_FAILURE);
794         }
795         working_dir = buf;
796 }
797
798 /**
799  * Normalize an absolute path with respect to the working directory.
800  * Paths outside the working subtree are left unchanged.
801  */
802 static std::string normalize_abs(std::string const &s)
803 {
804         size_t l = working_dir.length();
805         if (s.compare(0, l, working_dir)) return s;
806         size_t ll = s.length();
807         if (ll == l) return ".";
808         if (s[l] != '/')
809         {
810                 size_t pos = s.rfind('/', l);
811                 assert(pos != std::string::npos);
812                 return s.substr(pos + 1);
813         }
814         if (ll == l + 1) return ".";
815         return s.substr(l + 1);
816 }
817
818 /**
819  * Normalize a target name.
820  */
821 static std::string normalize(std::string const &s)
822 {
823 #ifdef WINDOWS
824         char const *delim = "/\\";
825 #else
826         char delim = '/';
827 #endif
828         size_t prev = 0, len = s.length();
829         size_t pos = s.find_first_of(delim);
830         if (pos == std::string::npos) return s;
831         bool absolute = pos == 0;
832         string_list l;
833         for (;;)
834         {
835                 if (pos != prev)
836                 {
837                         std::string n = s.substr(prev, pos - prev);
838                         if (n == "..")
839                         {
840                                 if (!l.empty()) l.pop_back();
841                                 else if (!absolute)
842                                         return normalize(working_dir + '/' + s);
843                         }
844                         else if (n != ".")
845                                 l.push_back(n);
846                 }
847                 ++pos;
848                 if (pos >= len) break;
849                 prev = pos;
850                 pos = s.find_first_of(delim, prev);
851                 if (pos == std::string::npos) pos = len;
852         }
853         string_list::const_iterator i = l.begin(), i_end = l.end();
854         if (i == i_end) return absolute ? "/" : ".";
855         std::string n;
856         if (absolute) n.push_back('/');
857         n.append(*i);
858         for (++i; i != i_end; ++i)
859         {
860                 n.push_back('/');
861                 n.append(*i);
862         }
863         if (absolute) return normalize_abs(n);
864         return n;
865 }
866
867 /**
868  * Normalize the content of a list of targets.
869  */
870 static void normalize_list(string_list &l)
871 {
872         for (string_list::iterator i = l.begin(),
873              i_end = l.end(); i != i_end; ++i)
874         {
875                 *i = normalize(*i);
876         }
877 }
878
879 /** @} */
880
881 /**
882  * @defgroup lexer Lexer
883  *
884  * @{
885  */
886
887 /**
888  * Skip spaces.
889  */
890 static void skip_spaces(std::istream &in)
891 {
892         char c;
893         while (strchr(" \t", (c = in.get()))) {}
894         if (in.good()) in.putback(c);
895 }
896
897 /**
898  * Skip empty lines.
899  */
900 static void skip_empty(std::istream &in)
901 {
902         char c;
903         while (strchr("\r\n", (c = in.get()))) {}
904         if (in.good()) in.putback(c);
905 }
906
907 /**
908  * Skip end of line. If @a multi is true, skip the following empty lines too.
909  * @return true if there was a line to end.
910  */
911 static bool skip_eol(std::istream &in, bool multi = false)
912 {
913         char c = in.get();
914         if (c == '\r') c = in.get();
915         if (c != '\n' && in.good()) in.putback(c);
916         if (c != '\n' && !in.eof()) return false;
917         if (multi) skip_empty(in);
918         return true;
919 }
920
921 enum
922 {
923   Unexpected = 0,
924   Word       = 1 << 1,
925   Colon      = 1 << 2,
926   Equal      = 1 << 3,
927   Dollarpar  = 1 << 4,
928   Rightpar   = 1 << 5,
929   Comma      = 1 << 6,
930   Plusequal  = 1 << 7,
931 };
932
933 /**
934  * Skip spaces and peek at the next token.
935  * If it is one of @a mask, skip it (if it is not Word) and return it.
936  * @note For composite tokens allowed by @a mask, input characters might
937  *       have been eaten even for an Unexpected result.
938  */
939 static int expect_token(std::istream &in, int mask)
940 {
941         while (true)
942         {
943                 skip_spaces(in);
944                 char c = in.peek();
945                 if (!in.good()) return Unexpected;
946                 int tok;
947                 switch (c)
948                 {
949                 case '\r':
950                 case '\n': return Unexpected;
951                 case ':': tok = Colon; break;
952                 case ',': tok = Comma; break;
953                 case '=': tok = Equal; break;
954                 case ')': tok = Rightpar; break;
955                 case '$':
956                         if (!(mask & Dollarpar)) return Unexpected;
957                         in.ignore(1);
958                         tok = Dollarpar;
959                         if (in.peek() != '(') return Unexpected;
960                         break;
961                 case '+':
962                         if (!(mask & Plusequal)) return Unexpected;
963                         in.ignore(1);
964                         tok = Plusequal;
965                         if (in.peek() != '=') return Unexpected;
966                         break;
967                 case '\\':
968                         in.ignore(1);
969                         if (skip_eol(in)) continue;
970                         in.putback('\\');
971                         return mask & Word ? Word : Unexpected;
972                 default:
973                         return mask & Word ? Word : Unexpected;
974                 }
975                 if (!(tok & mask)) return Unexpected;
976                 in.ignore(1);
977                 return tok;
978         }
979 }
980
981 /**
982  * Read a (possibly quoted) word.
983  */
984 static std::string read_word(std::istream &in)
985 {
986         int c = in.get();
987         std::string res;
988         if (!in.good()) return res;
989         char const *separators = " \t\r\n:$(),=+\"";
990         bool quoted = c == '"';
991         if (!quoted)
992         {
993                 if (strchr(separators, c))
994                 {
995                         in.putback(c);
996                         return res;
997                 }
998                 res += c;
999         }
1000         while (true)
1001         {
1002                 c = in.get();
1003                 if (!in.good()) return res;
1004                 if (quoted)
1005                 {
1006                         if (c == '\\')
1007                                 res += in.get();
1008                         else if (c == '"')
1009                                 return res;
1010                         else
1011                                 res += c;
1012                 }
1013                 else
1014                 {
1015                         if (strchr(separators, c))
1016                         {
1017                                 in.putback(c);
1018                                 return res;
1019                         }
1020                         res += c;
1021                 }
1022         }
1023 }
1024
1025 /** @} */
1026
1027 /**
1028  * @defgroup stream Token streams
1029  *
1030  * @{
1031  */
1032
1033 /**
1034  * Possible results from word producers.
1035  */
1036 enum input_status
1037 {
1038         Success,
1039         SyntaxError,
1040         Eof
1041 };
1042
1043 /**
1044  * Interface for word producers.
1045  */
1046 struct generator
1047 {
1048         virtual ~generator() {}
1049         virtual input_status next(std::string &) = 0;
1050 };
1051
1052 /**
1053  * Generator for the words of a variable.
1054  */
1055 struct variable_generator: generator
1056 {
1057         std::string name;
1058         string_list::const_iterator cur1, end1;
1059         assign_list::const_iterator cur2, end2;
1060         variable_generator(std::string const &, assign_list const *);
1061         input_status next(std::string &);
1062 };
1063
1064 variable_generator::variable_generator(std::string const &n,
1065         assign_list const *local_variables): name(n)
1066 {
1067         bool append = true;
1068         if (local_variables)
1069         {
1070                 // Set cur2 to the last variable overwriter, if any.
1071                 cur2 = local_variables->begin();
1072                 end2 = local_variables->end();
1073                 for (assign_list::const_iterator i = cur2; i != end2; ++i)
1074                 {
1075                         if (i->name == name && !i->append)
1076                         {
1077                                 append = false;
1078                                 cur2 = i;
1079                         }
1080                 }
1081         }
1082         else
1083         {
1084                 static assign_list dummy;
1085                 cur2 = dummy.begin();
1086                 end2 = dummy.end();
1087         }
1088         static string_list dummy;
1089         cur1 = dummy.begin();
1090         end1 = dummy.end();
1091         if (append)
1092         {
1093                 variable_map::const_iterator i = variables.find(name);
1094                 if (i == variables.end()) return;
1095                 cur1 = i->second.begin();
1096                 end1 = i->second.end();
1097         }
1098 }
1099
1100 input_status variable_generator::next(std::string &res)
1101 {
1102         restart:
1103         if (cur1 != end1)
1104         {
1105                 res = *cur1;
1106                 ++cur1;
1107                 return Success;
1108         }
1109         while (cur2 != end2)
1110         {
1111                 if (cur2->name == name)
1112                 {
1113                         cur1 = cur2->value.begin();
1114                         end1 = cur2->value.end();
1115                         ++cur2;
1116                         goto restart;
1117                 }
1118                 ++cur2;
1119         }
1120         return Eof;
1121 }
1122
1123 /**
1124  * Generator for the words of an input stream.
1125  */
1126 struct input_generator
1127 {
1128         std::istream &in;
1129         generator *nested;
1130         assign_list const *local_variables;
1131         bool earliest_exit, done;
1132         input_generator(std::istream &i, assign_list const *lv, bool e = false)
1133                 : in(i), nested(NULL), local_variables(lv), earliest_exit(e), done(false) {}
1134         input_status next(std::string &);
1135         ~input_generator() { assert(!nested); }
1136 };
1137
1138 static generator *get_function(input_generator const &, std::string const &);
1139
1140 input_status input_generator::next(std::string &res)
1141 {
1142         if (nested)
1143         {
1144                 restart:
1145                 input_status s = nested->next(res);
1146                 if (s == Success) return Success;
1147                 delete nested;
1148                 nested = NULL;
1149                 if (s == SyntaxError) return SyntaxError;
1150         }
1151         if (done) return Eof;
1152         if (earliest_exit) done = true;
1153         switch (expect_token(in, Word | Dollarpar))
1154         {
1155         case Word:
1156                 res = read_word(in);
1157                 return Success;
1158         case Dollarpar:
1159         {
1160                 std::string name = read_word(in);
1161                 if (name.empty()) return SyntaxError;
1162                 if (expect_token(in, Rightpar))
1163                         nested = new variable_generator(name, local_variables);
1164                 else
1165                 {
1166                         nested = get_function(*this, name);
1167                         if (!nested) return SyntaxError;
1168                 }
1169                 goto restart;
1170         }
1171         default:
1172                 return Eof;
1173         }
1174 }
1175
1176 /**
1177  * Read a list of words from an input generator.
1178  * @return false if a syntax error was encountered.
1179  */
1180 static bool read_words(input_generator &in, string_list &res)
1181 {
1182         while (true)
1183         {
1184                 res.push_back(std::string());
1185                 input_status s = in.next(res.back());
1186                 if (s == Success) continue;
1187                 res.pop_back();
1188                 return s == Eof;
1189         }
1190 }
1191
1192 static bool read_words(std::istream &in, string_list &res)
1193 {
1194         input_generator gen(in, NULL);
1195         return read_words(gen, res);
1196 }
1197
1198
1199 /**
1200  * Serialize a variable map.
1201  */
1202 std::string serialize_variables(variable_map &vars, char sep = ' ')
1203 {
1204   std::ostringstream buf;
1205   for(variable_map::const_iterator i = vars.begin(),
1206         i_end = vars.end(); i != i_end; ++i)
1207   {
1208     buf << i->first << '=';
1209     bool first = true;
1210     std::string val;
1211     for (string_list::const_iterator j = i->second.begin(),
1212            j_end = i->second.end(); j != j_end; ++j)
1213     {
1214       if (first) first = false;
1215       else val += " ";
1216       val += *j;
1217     }
1218     buf << escape_string(val) << sep;
1219   }
1220   std::string s = buf.str();
1221   return s;
1222 }
1223
1224 /**
1225  * Generator for the result of function addprefix.
1226  */
1227 struct addprefix_generator: generator
1228 {
1229         input_generator gen;
1230         string_list pre;
1231         string_list::const_iterator prei;
1232         size_t prej, prel;
1233         std::string suf;
1234         addprefix_generator(input_generator const &, bool &);
1235         input_status next(std::string &);
1236 };
1237
1238 addprefix_generator::addprefix_generator(input_generator const &top, bool &ok)
1239         : gen(top.in, top.local_variables)
1240 {
1241         if (!read_words(gen, pre)) return;
1242         if (!expect_token(gen.in, Comma)) return;
1243         prej = 0;
1244         prel = pre.size();
1245         ok = true;
1246 }
1247
1248 input_status addprefix_generator::next(std::string &res)
1249 {
1250         if (prej)
1251         {
1252                 produce:
1253                 if (prej == prel)
1254                 {
1255                         res = *prei + suf;
1256                         prej = 0;
1257                 }
1258                 else
1259                 {
1260                         res = *prei++;
1261                         ++prej;
1262                 }
1263                 return Success;
1264         }
1265         switch (gen.next(res))
1266         {
1267         case Success:
1268                 if (!prel) return Success;
1269                 prei = pre.begin();
1270                 prej = 1;
1271                 suf = res;
1272                 goto produce;
1273         case Eof:
1274                 return expect_token(gen.in, Rightpar) ? Eof : SyntaxError;
1275         default:
1276                 return SyntaxError;
1277         }
1278 }
1279
1280 /**
1281  * Generator for the result of function addsuffix.
1282  */
1283 struct addsuffix_generator: generator
1284 {
1285         input_generator gen;
1286         string_list suf;
1287         string_list::const_iterator sufi;
1288         size_t sufj, sufl;
1289         std::string pre;
1290         addsuffix_generator(input_generator const &, bool &);
1291         input_status next(std::string &);
1292 };
1293
1294 addsuffix_generator::addsuffix_generator(input_generator const &top, bool &ok)
1295         : gen(top.in, top.local_variables)
1296 {
1297         if (!read_words(gen, suf)) return;
1298         if (!expect_token(gen.in, Comma)) return;
1299         sufj = 0;
1300         sufl = suf.size();
1301         ok = true;
1302 }
1303
1304 input_status addsuffix_generator::next(std::string &res)
1305 {
1306         if (sufj)
1307         {
1308                 if (sufj != sufl)
1309                 {
1310                         res = *sufi++;
1311                         ++sufj;
1312                         return Success;
1313                 }
1314                 sufj = 0;
1315         }
1316         switch (gen.next(res))
1317         {
1318         case Success:
1319                 if (!sufl) return Success;
1320                 sufi = suf.begin();
1321                 sufj = 1;
1322                 res += *sufi++;
1323                 return Success;
1324         case Eof:
1325                 return expect_token(gen.in, Rightpar) ? Eof : SyntaxError;
1326         default:
1327                 return SyntaxError;
1328         }
1329 }
1330
1331 /**
1332  * Return a generator for function @a name.
1333  */
1334 generator *get_function(input_generator const &in, std::string const &name)
1335 {
1336         skip_spaces(in.in);
1337         generator *g = NULL;
1338         bool ok = false;
1339         if (name == "addprefix") g = new addprefix_generator(in, ok);
1340         else if (name == "addsuffix") g = new addsuffix_generator(in, ok);
1341         if (!g || ok) return g;
1342         delete g;
1343         return NULL;
1344 }
1345
1346 /** @} */
1347
1348 /**
1349  * @defgroup database Dependency database
1350  *
1351  * @{
1352  */
1353
1354 /**
1355  * Load dependencies from @a in.
1356  */
1357 static void load_dependencies(std::istream &in)
1358 {
1359         if (false)
1360         {
1361                 error:
1362                 std::cerr << "Failed to load database" << std::endl;
1363                 exit(EXIT_FAILURE);
1364         }
1365
1366         while (!in.eof())
1367         {
1368                 string_list targets;
1369                 if (!read_words(in, targets)) goto error;
1370                 if (in.eof()) return;
1371                 if (targets.empty()) goto error;
1372                 DEBUG << "reading dependencies of target " << targets.front() << std::endl;
1373                 if (in.get() != ':') goto error;
1374                 ref_ptr<dependency_t> dep;
1375                 dep->targets = targets;
1376                 string_list deps;
1377                 if (!read_words(in, deps)) goto error;
1378                 dep->deps.insert(deps.begin(), deps.end());
1379                 for (string_list::const_iterator i = targets.begin(),
1380                      i_end = targets.end(); i != i_end; ++i)
1381                 {
1382                         dependencies[*i] = dep;
1383                 }
1384                 skip_empty(in);
1385         }
1386 }
1387
1388 /**
1389  * Load known dependencies from file <tt>.remake</tt>.
1390  */
1391 static void load_dependencies()
1392 {
1393         DEBUG_open << "Loading database... ";
1394         std::ifstream in(".remake");
1395         if (!in.good())
1396         {
1397                 DEBUG_close << "not found\n";
1398                 return;
1399         }
1400         load_dependencies(in);
1401 }
1402
1403
1404 /**
1405  * Save all the dependencies in file <tt>.remake</tt>.
1406  */
1407 static void save_dependencies()
1408 {
1409         DEBUG_open << "Saving database... ";
1410         std::ofstream db(".remake");
1411         while (!dependencies.empty())
1412         {
1413                 ref_ptr<dependency_t> dep = dependencies.begin()->second;
1414                 for (string_list::const_iterator i = dep->targets.begin(),
1415                      i_end = dep->targets.end(); i != i_end; ++i)
1416                 {
1417                         db << escape_string(*i) << ' ';
1418                         dependencies.erase(*i);
1419                 }
1420                 db << ':';
1421                 for (string_set::const_iterator i = dep->deps.begin(),
1422                      i_end = dep->deps.end(); i != i_end; ++i)
1423                 {
1424                         db << ' ' << escape_string(*i);
1425                 }
1426                 db << std::endl;
1427         }
1428 }
1429
1430 /** @} */
1431
1432 /**
1433  * @defgroup parser Rule parser
1434  *
1435  * @{
1436  */
1437
1438 /**
1439  * Register a specific rule with an empty script:
1440  *
1441  * - Check that none of the targets already has an associated rule with a
1442  *   nonempty script.
1443  * - Create a new rule with a single target for each target, if needed.
1444  * - Add the prerequisites of @a rule to all these associated rules.
1445  */
1446 static void register_transparent_rule(rule_t const &rule, string_list const &targets)
1447 {
1448         assert(rule.script.empty());
1449         for (string_list::const_iterator i = targets.begin(),
1450              i_end = targets.end(); i != i_end; ++i)
1451         {
1452                 std::pair<rule_map::iterator, bool> j =
1453                         specific_rules.insert(std::make_pair(*i, ref_ptr<rule_t>()));
1454                 ref_ptr<rule_t> &r = j.first->second;
1455                 if (j.second)
1456                 {
1457                         r = ref_ptr<rule_t>(rule);
1458                         r->targets = string_list(1, *i);
1459                         continue;
1460                 }
1461                 if (!r->script.empty())
1462                 {
1463                         std::cerr << "Failed to load rules: " << *i
1464                                 << " cannot be the target of several rules" << std::endl;
1465                         exit(EXIT_FAILURE);
1466                 }
1467                 assert(r->targets.size() == 1 && r->targets.front() == *i);
1468                 r->deps.insert(r->deps.end(), rule.deps.begin(), rule.deps.end());
1469                 r->vars.insert(r->vars.end(), rule.vars.begin(), rule.vars.end());
1470         }
1471
1472         for (string_list::const_iterator i = targets.begin(),
1473              i_end = targets.end(); i != i_end; ++i)
1474         {
1475                 ref_ptr<dependency_t> &dep = dependencies[*i];
1476                 if (dep->targets.empty()) dep->targets.push_back(*i);
1477                 dep->deps.insert(rule.deps.begin(), rule.deps.end());
1478         }
1479 }
1480
1481 /**
1482  * Register a specific rule with a nonempty script:
1483  *
1484  * - Check that none of the targets already has an associated rule.
1485  * - Create a single shared rule and associate it to all the targets.
1486  * - Merge the prerequisites of all the targets into a single set and
1487  *   add the prerequisites of the rule to it. (The preexisting
1488  *   prerequisites, if any, come from a previous run.)
1489  */
1490 static void register_scripted_rule(rule_t const &rule)
1491 {
1492         ref_ptr<rule_t> r(rule);
1493         for (string_list::const_iterator i = rule.targets.begin(),
1494              i_end = rule.targets.end(); i != i_end; ++i)
1495         {
1496                 std::pair<rule_map::iterator, bool> j =
1497                         specific_rules.insert(std::make_pair(*i, r));
1498                 if (j.second) continue;
1499                 std::cerr << "Failed to load rules: " << *i
1500                         << " cannot be the target of several rules" << std::endl;
1501                 exit(EXIT_FAILURE);
1502         }
1503
1504         ref_ptr<dependency_t> dep;
1505         dep->targets = rule.targets;
1506         dep->deps.insert(rule.deps.begin(), rule.deps.end());
1507         for (string_list::const_iterator i = rule.targets.begin(),
1508              i_end = rule.targets.end(); i != i_end; ++i)
1509         {
1510                 ref_ptr<dependency_t> &d = dependencies[*i];
1511                 dep->deps.insert(d->deps.begin(), d->deps.end());
1512                 d = dep;
1513         }
1514 }
1515
1516 /**
1517  * Read a rule starting with target @a first, if nonempty.
1518  * Store into #generic_rules or #specific_rules depending on its genericity.
1519  */
1520 static void load_rule(std::istream &in, std::string const &first)
1521 {
1522         DEBUG_open << "Reading rule for target " << first << "... ";
1523         if (false)
1524         {
1525                 error:
1526                 DEBUG_close << "failed\n";
1527                 std::cerr << "Failed to load rules: syntax error" << std::endl;
1528                 exit(EXIT_FAILURE);
1529         }
1530         rule_t rule;
1531
1532         // Read targets and check genericity.
1533         string_list targets;
1534         if (!read_words(in, targets)) goto error;
1535         if (!first.empty()) targets.push_front(first);
1536         else if (targets.empty()) goto error;
1537         else DEBUG << "actual target: " << targets.front() << std::endl;
1538         bool generic = false;
1539         normalize_list(targets);
1540         for (string_list::const_iterator i = targets.begin(),
1541              i_end = targets.end(); i != i_end; ++i)
1542         {
1543                 if (i->empty()) goto error;
1544                 if ((i->find('%') != std::string::npos) != generic)
1545                 {
1546                         if (i == targets.begin()) generic = true;
1547                         else goto error;
1548                 }
1549         }
1550         std::swap(rule.targets, targets);
1551         skip_spaces(in);
1552         if (in.get() != ':') goto error;
1553
1554         bool assignment = false;
1555
1556         // Read dependencies.
1557         if (expect_token(in, Word))
1558         {
1559                 std::string d = read_word(in);
1560                 if (int tok = expect_token(in, Equal | Plusequal))
1561                 {
1562                         rule.vars.push_back(assign_t());
1563                         string_list v;
1564                         if (!read_words(in, v)) goto error;
1565                         assign_t &a = rule.vars.back();
1566                         a.name = d;
1567                         a.append = tok == Plusequal;
1568                         a.value.swap(v);
1569                         assignment = true;
1570                 }
1571                 else
1572                 {
1573                         string_list v;
1574                         if (!read_words(in, v)) goto error;
1575                         v.push_front(d);
1576                         normalize_list(v);
1577                         rule.deps.swap(v);
1578                 }
1579         }
1580         else
1581         {
1582                 string_list v;
1583                 if (!read_words(in, v)) goto error;
1584                 normalize_list(v);
1585                 rule.deps.swap(v);
1586         }
1587         skip_spaces(in);
1588         if (!skip_eol(in, true)) goto error;
1589
1590         // Read script.
1591         std::ostringstream buf;
1592         while (true)
1593         {
1594                 char c = in.get();
1595                 if (!in.good()) break;
1596                 if (c == '\t' || c == ' ')
1597                 {
1598                         in.get(*buf.rdbuf());
1599                         if (in.fail() && !in.eof()) in.clear();
1600                 }
1601                 else if (c == '\r' || c == '\n')
1602                         buf << c;
1603                 else
1604                 {
1605                         in.putback(c);
1606                         break;
1607                 }
1608         }
1609         rule.script = buf.str();
1610
1611         // Add generic rules to the correct set.
1612         if (generic)
1613         {
1614                 if (assignment) goto error;
1615                 generic_rules.push_back(rule);
1616                 return;
1617         }
1618
1619         if (!rule.script.empty())
1620         {
1621                 if (assignment) goto error;
1622                 register_scripted_rule(rule);
1623         }
1624         else
1625         {
1626                 // Swap away the targets to avoid costly copies when registering.
1627                 string_list targets;
1628                 std::swap(rule.targets, targets);
1629                 register_transparent_rule(rule, targets);
1630                 std::swap(rule.targets, targets);
1631         }
1632
1633         // If there is no default target yet, mark it as such.
1634         if (first_target.empty())
1635                 first_target = rule.targets.front();
1636 }
1637
1638 /**
1639  * Load rules from @a remakefile.
1640  * If some rules have dependencies and non-generic targets, add these
1641  * dependencies to the targets.
1642  */
1643 static void load_rules(std::string const &remakefile)
1644 {
1645         DEBUG_open << "Loading rules... ";
1646         if (false)
1647         {
1648                 error:
1649                 std::cerr << "Failed to load rules: syntax error" << std::endl;
1650                 exit(EXIT_FAILURE);
1651         }
1652         std::ifstream in(remakefile.c_str());
1653         if (!in.good())
1654         {
1655                 std::cerr << "Failed to load rules: no Remakefile found" << std::endl;
1656                 exit(EXIT_FAILURE);
1657         }
1658         skip_empty(in);
1659
1660         // Read rules
1661         while (in.good())
1662         {
1663                 char c = in.peek();
1664                 if (c == '#')
1665                 {
1666                         while (in.get() != '\n') {}
1667                         skip_empty(in);
1668                         continue;
1669                 }
1670                 if (c == ' ' || c == '\t') goto error;
1671                 if (expect_token(in, Word))
1672                 {
1673                         std::string name = read_word(in);
1674                         if (name.empty()) goto error;
1675                         if (int tok = expect_token(in, Equal | Plusequal))
1676                         {
1677                                 DEBUG << "Assignment to variable " << name << std::endl;
1678                                 string_list value;
1679                                 if (!read_words(in, value)) goto error;
1680                                 string_list &dest = variables[name];
1681                                 if (tok == Equal) dest.swap(value);
1682                                 else dest.splice(dest.end(), value);
1683                                 if (!skip_eol(in, true)) goto error;
1684                         }
1685                         else load_rule(in, name);
1686                 }
1687                 else load_rule(in, std::string());
1688         }
1689 }
1690
1691 /** @} */
1692
1693 /**
1694  * @defgroup rules Rule resolution
1695  *
1696  * @{
1697  */
1698
1699 /**
1700  * Substitute a pattern into a list of strings.
1701  */
1702 static void substitute_pattern(std::string const &pat, string_list const &src, string_list &dst)
1703 {
1704         for (string_list::const_iterator i = src.begin(),
1705              i_end = src.end(); i != i_end; ++i)
1706         {
1707                 size_t pos = i->find('%');
1708                 if (pos == std::string::npos)dst.push_back(*i);
1709                 else dst.push_back(i->substr(0, pos) + pat + i->substr(pos + 1));
1710         }
1711 }
1712
1713 /**
1714  * Find a generic rule matching @a target:
1715  * - the one leading to shorter matches has priority,
1716  * - among equivalent rules, the earliest one has priority.
1717  */
1718 static rule_t find_generic_rule(std::string const &target)
1719 {
1720         size_t tlen = target.length(), plen = tlen + 1;
1721         rule_t rule;
1722         for (rule_list::const_iterator i = generic_rules.begin(),
1723              i_end = generic_rules.end(); i != i_end; ++i)
1724         {
1725                 for (string_list::const_iterator j = i->targets.begin(),
1726                      j_end = i->targets.end(); j != j_end; ++j)
1727                 {
1728                         size_t len = j->length();
1729                         if (tlen < len) continue;
1730                         if (plen <= tlen - (len - 1)) continue;
1731                         size_t pos = j->find('%');
1732                         if (pos == std::string::npos) continue;
1733                         size_t len2 = len - (pos + 1);
1734                         if (j->compare(0, pos, target, 0, pos) ||
1735                             j->compare(pos + 1, len2, target, tlen - len2, len2))
1736                                 continue;
1737                         plen = tlen - (len - 1);
1738                         rule = rule_t();
1739                         rule.stem = target.substr(pos, plen);
1740                         rule.script = i->script;
1741                         substitute_pattern(rule.stem, i->targets, rule.targets);
1742                         substitute_pattern(rule.stem, i->deps, rule.deps);
1743                         break;
1744                 }
1745         }
1746         return rule;
1747 }
1748
1749 /**
1750  * Find a specific rule matching @a target. Return a generic one otherwise.
1751  * If there is both a specific rule with an empty script and a generic rule, the
1752  * generic one is returned after adding the dependencies of the specific one.
1753  */
1754 static rule_t find_rule(std::string const &target)
1755 {
1756         rule_map::const_iterator i = specific_rules.find(target),
1757                 i_end = specific_rules.end();
1758         // If there is a specific rule with a script, return it.
1759         if (i != i_end && !i->second->script.empty()) return *i->second;
1760         rule_t grule = find_generic_rule(target);
1761         // If there is no generic rule, return the specific rule (no script), if any.
1762         if (grule.targets.empty())
1763         {
1764                 if (i != i_end) return *i->second;
1765                 return grule;
1766         }
1767         // Optimize the lookup when there is only one target (already looked up).
1768         if (grule.targets.size() == 1)
1769         {
1770                 if (i == i_end) return grule;
1771                 grule.deps.insert(grule.deps.end(),
1772                         i->second->deps.begin(), i->second->deps.end());
1773                 grule.vars.insert(grule.vars.end(),
1774                         i->second->vars.begin(), i->second->vars.end());
1775                 return grule;
1776         }
1777         // Add the dependencies of the specific rules of every target to the
1778         // generic rule. If any of those rules has a nonempty script, error out.
1779         for (string_list::const_iterator j = grule.targets.begin(),
1780              j_end = grule.targets.end(); j != j_end; ++j)
1781         {
1782                 i = specific_rules.find(*j);
1783                 if (i == i_end) continue;
1784                 if (!i->second->script.empty()) return rule_t();
1785                 grule.deps.insert(grule.deps.end(),
1786                         i->second->deps.begin(), i->second->deps.end());
1787                 grule.vars.insert(grule.vars.end(),
1788                         i->second->vars.begin(), i->second->vars.end());
1789         }
1790         return grule;
1791 }
1792
1793 /** @} */
1794
1795 /**
1796  * @defgroup status Target status
1797  *
1798  * @{
1799  */
1800
1801 /**
1802  * Compute and memoize the status of @a target:
1803  * - if the file does not exist, the target is obsolete,
1804  * - if any dependency is obsolete or younger than the file, it is obsolete,
1805  * - otherwise it is up-to-date.
1806  *
1807  * @note For rules with multiple targets, all the targets share the same
1808  *       status. (If one is obsolete, they all are.) The second rule above
1809  *       is modified in that case: the latest target is chosen, not the oldest!
1810  */
1811 static status_t const &get_status(std::string const &target)
1812 {
1813         std::pair<status_map::iterator,bool> i =
1814                 status.insert(std::make_pair(target, status_t()));
1815         status_t &ts = i.first->second;
1816         if (!i.second) return ts;
1817         DEBUG_open << "Checking status of " << target << "... ";
1818         dependency_map::const_iterator j = dependencies.find(target);
1819         if (j == dependencies.end())
1820         {
1821                 struct stat s;
1822                 if (stat(target.c_str(), &s) != 0)
1823                 {
1824                         DEBUG_close << "missing\n";
1825                         ts.status = Todo;
1826                         ts.last = 0;
1827                         return ts;
1828                 }
1829                 DEBUG_close << "up-to-date\n";
1830                 ts.status = Uptodate;
1831                 ts.last = s.st_mtime;
1832                 return ts;
1833         }
1834         dependency_t const &dep = *j->second;
1835         status_e st = Uptodate;
1836         time_t latest = 0;
1837         for (string_list::const_iterator k = dep.targets.begin(),
1838              k_end = dep.targets.end(); k != k_end; ++k)
1839         {
1840                 struct stat s;
1841                 if (stat(k->c_str(), &s) != 0)
1842                 {
1843                         if (st == Uptodate) DEBUG_close << *k << " missing\n";
1844                         s.st_mtime = 0;
1845                         st = Todo;
1846                 }
1847                 status[*k].last = s.st_mtime;
1848                 if (s.st_mtime > latest) latest = s.st_mtime;
1849         }
1850         if (st == Todo) goto update;
1851         for (string_set::const_iterator k = dep.deps.begin(),
1852              k_end = dep.deps.end(); k != k_end; ++k)
1853         {
1854                 status_t const &ts_ = get_status(*k);
1855                 if (latest < ts_.last)
1856                 {
1857                         DEBUG_close << "older than " << *k << std::endl;
1858                         st = Todo;
1859                         goto update;
1860                 }
1861                 if (ts_.status == Uptodate) continue;
1862                 if (st == Uptodate)
1863                         DEBUG << "obsolete dependency " << *k << std::endl;
1864                 st = Recheck;
1865         }
1866         if (st == Uptodate) DEBUG_close << "all siblings up-to-date\n";
1867         update:
1868         for (string_list::const_iterator k = dep.targets.begin(),
1869              k_end = dep.targets.end(); k != k_end; ++k)
1870         {
1871                 status[*k].status = st;
1872         }
1873         return ts;
1874 }
1875
1876 /**
1877  * Change the status of @a target to #Remade or #Uptodate depending on whether
1878  * its modification time changed.
1879  */
1880 static void update_status(std::string const &target)
1881 {
1882         DEBUG_open << "Rechecking status of " << target << "... ";
1883         status_map::iterator i = status.find(target);
1884         assert(i != status.end());
1885         status_t &ts = i->second;
1886         ts.status = Remade;
1887         if (ts.last >= now)
1888         {
1889                 DEBUG_close << "possibly remade\n";
1890                 return;
1891         }
1892         struct stat s;
1893         if (stat(target.c_str(), &s) != 0)
1894         {
1895                 DEBUG_close << "missing\n";
1896                 ts.last = 0;
1897         }
1898         else if (s.st_mtime != ts.last)
1899         {
1900                 DEBUG_close << "remade\n";
1901                 ts.last = s.st_mtime;
1902         }
1903         else
1904         {
1905                 DEBUG_close << "unchanged\n";
1906                 ts.status = Uptodate;
1907         }
1908 }
1909
1910 /**
1911  * Check whether all the prerequisites of @a target ended being up-to-date.
1912  */
1913 static bool still_need_rebuild(std::string const &target)
1914 {
1915         DEBUG_open << "Rechecking obsoleteness of " << target << "... ";
1916         status_map::const_iterator i = status.find(target);
1917         assert(i != status.end());
1918         if (i->second.status != Recheck) return true;
1919         dependency_map::const_iterator j = dependencies.find(target);
1920         assert(j != dependencies.end());
1921         dependency_t const &dep = *j->second;
1922         for (string_set::const_iterator k = dep.deps.begin(),
1923              k_end = dep.deps.end(); k != k_end; ++k)
1924         {
1925                 if (status[*k].status != Uptodate) return true;
1926         }
1927         for (string_list::const_iterator k = dep.targets.begin(),
1928              k_end = dep.targets.end(); k != k_end; ++k)
1929         {
1930                 status[*k].status = Uptodate;
1931         }
1932         DEBUG_close << "no longer obsolete\n";
1933         return false;
1934 }
1935
1936 /** @} */
1937
1938 /**
1939  * @defgroup server Server
1940  *
1941  * @{
1942  */
1943
1944 /**
1945  * Handle job completion.
1946  */
1947 static void complete_job(int job_id, bool success)
1948 {
1949         DEBUG_open << "Completing job " << job_id << "... ";
1950         job_targets_map::iterator i = job_targets.find(job_id);
1951         assert(i != job_targets.end());
1952         string_list const &targets = i->second;
1953         if (success)
1954         {
1955                 for (string_list::const_iterator j = targets.begin(),
1956                      j_end = targets.end(); j != j_end; ++j)
1957                 {
1958                         update_status(*j);
1959                 }
1960         }
1961         else
1962         {
1963                 DEBUG_close << "failed\n";
1964                 std::cerr << "Failed to build";
1965                 for (string_list::const_iterator j = targets.begin(),
1966                      j_end = targets.end(); j != j_end; ++j)
1967                 {
1968                         status[*j].status = Failed;
1969                         std::cerr << ' ' << *j;
1970                         remove(j->c_str());
1971                 }
1972                 std::cerr << std::endl;
1973         }
1974         job_targets.erase(i);
1975         job_variables.erase(job_variables.find(job_id));
1976 }
1977
1978 /**
1979  * Return the script obtained by substituting variables.
1980  */
1981 static std::string prepare_script(rule_t const &rule)
1982 {
1983         std::string const &s = rule.script;
1984         std::istringstream in(s);
1985         std::ostringstream out;
1986         size_t len = s.size();
1987
1988         while (!in.eof())
1989         {
1990                 size_t pos = in.tellg(), p = s.find('$', pos);
1991                 if (p == std::string::npos || p == len - 1) p = len;
1992                 out.write(&s[pos], p - pos);
1993                 if (p == len) break;
1994                 ++p;
1995                 switch (s[p])
1996                 {
1997                 case '$':
1998                         out << '$';
1999                         in.seekg(p + 1);
2000                         break;
2001                 case '<':
2002                         if (!rule.deps.empty())
2003                                 out << rule.deps.front();
2004                         in.seekg(p + 1);
2005                         break;
2006                 case '^':
2007                 {
2008                         bool first = true;
2009                         for (string_list::const_iterator i = rule.deps.begin(),
2010                              i_end = rule.deps.end(); i != i_end; ++i)
2011                         {
2012                                 if (first) first = false;
2013                                 else out << ' ';
2014                                 out << *i;
2015                         }
2016                         in.seekg(p + 1);
2017                         break;
2018                 }
2019                 case '@':
2020                         assert(!rule.targets.empty());
2021                         out << rule.targets.front();
2022                         in.seekg(p + 1);
2023                         break;
2024                 case '*':
2025                         out << rule.stem;
2026                         in.seekg(p + 1);
2027                         break;
2028                 case '(':
2029                 {
2030                         in.seekg(p - 1);
2031                         bool first = true;
2032                         input_generator gen(in, &rule.vars, true);
2033                         while (true)
2034                         {
2035                                 std::string w;
2036                                 input_status s = gen.next(w);
2037                                 if (s == SyntaxError)
2038                                 {
2039                                         // TODO
2040                                         return "false";
2041                                 }
2042                                 if (s == Eof) break;
2043                                 if (first) first = false;
2044                                 else out << ' ';
2045                                 out << w;
2046                         }
2047                         break;
2048                 }
2049                 default:
2050                         // Let dollars followed by an unrecognized character
2051                         // go through. This differs from Make, which would
2052                         // use a one-letter variable.
2053                         out << '$';
2054                         in.seekg(p);
2055                 }
2056         }
2057
2058         return out.str();
2059 }
2060
2061 /**
2062  * Execute the script from @a rule.
2063  */
2064 static bool run_script(int job_id, rule_t /*const */ &rule)
2065 {
2066         if (show_targets)
2067         {
2068                 std::cout << "Building";
2069                 for (string_list::const_iterator i = rule.targets.begin(),
2070                      i_end = rule.targets.end(); i != i_end; ++i)
2071                 {
2072                         std::cout << ' ' << *i;
2073                 }
2074                 std::cout << std::endl;
2075         }
2076
2077         ref_ptr<dependency_t> dep;
2078         dep->targets = rule.targets;
2079         dep->deps.insert(rule.deps.begin(), rule.deps.end());
2080         for (string_list::const_iterator i = rule.targets.begin(),
2081              i_end = rule.targets.end(); i != i_end; ++i)
2082         {
2083                 dependencies[*i] = dep;
2084         }
2085         variable_map job_vars = job_variables[job_id];
2086         for(variable_map::const_iterator i = job_vars.begin(),
2087               i_end = job_vars.end(); i != i_end; ++i)
2088         {
2089           assign_t a = assign_t();
2090           a.name = i->first;
2091           a.append = false;
2092           a.value = i->second;
2093           rule.vars.push_back(a);
2094         }
2095
2096         std::string script = prepare_script(rule);
2097
2098         std::ostringstream job_id_buf;
2099         job_id_buf << job_id;
2100         std::string job_id_ = job_id_buf.str();
2101
2102         DEBUG_open << "Starting script for job " << job_id << "... ";
2103         if (false)
2104         {
2105                 error:
2106                 DEBUG_close << "failed\n";
2107                 complete_job(job_id, false);
2108                 return false;
2109         }
2110
2111 #ifdef WINDOWS
2112         HANDLE pfd[2];
2113         if (false)
2114         {
2115                 error2:
2116                 CloseHandle(pfd[0]);
2117                 CloseHandle(pfd[1]);
2118                 goto error;
2119         }
2120         if (!CreatePipe(&pfd[0], &pfd[1], NULL, 0))
2121                 goto error;
2122         if (!SetHandleInformation(pfd[0], HANDLE_FLAG_INHERIT, HANDLE_FLAG_INHERIT))
2123                 goto error2;
2124         STARTUPINFO si;
2125         ZeroMemory(&si, sizeof(STARTUPINFO));
2126         si.cb = sizeof(STARTUPINFO);
2127         si.hStdError = GetStdHandle(STD_ERROR_HANDLE);
2128         si.hStdOutput = GetStdHandle(STD_OUTPUT_HANDLE);
2129         si.hStdInput = pfd[0];
2130         si.dwFlags |= STARTF_USESTDHANDLES;
2131         PROCESS_INFORMATION pi;
2132         ZeroMemory(&pi, sizeof(PROCESS_INFORMATION));
2133         if (!SetEnvironmentVariable("REMAKE_JOB_ID", job_id_.c_str()))
2134                 goto error2;
2135         char const *argv = echo_scripts ? "SH.EXE -e -s -v" : "SH.EXE -e -s";
2136         if (!CreateProcess(NULL, (char *)argv, NULL, NULL,
2137             true, 0, NULL, NULL, &si, &pi))
2138         {
2139                 goto error2;
2140         }
2141         CloseHandle(pi.hThread);
2142         DWORD len = script.length(), wlen;
2143         if (!WriteFile(pfd[1], script.c_str(), len, &wlen, NULL) || wlen < len)
2144                 std::cerr << "Unexpected failure while sending script to shell" << std::endl;
2145         CloseHandle(pfd[0]);
2146         CloseHandle(pfd[1]);
2147         ++running_jobs;
2148         job_pids[pi.hProcess] = job_id;
2149         return true;
2150 #else
2151         int pfd[2];
2152         if (false)
2153         {
2154                 error2:
2155                 close(pfd[0]);
2156                 close(pfd[1]);
2157                 goto error;
2158         }
2159         if (pipe(pfd) == -1)
2160                 goto error;
2161         if (setenv("REMAKE_JOB_ID", job_id_.c_str(), 1))
2162                 goto error2;
2163         if (pid_t pid = vfork())
2164         {
2165                 if (pid == -1) goto error2;
2166                 ssize_t len = script.length();
2167                 if (write(pfd[1], script.c_str(), len) < len)
2168                         std::cerr << "Unexpected failure while sending script to shell" << std::endl;
2169                 close(pfd[0]);
2170                 close(pfd[1]);
2171                 ++running_jobs;
2172                 job_pids[pid] = job_id;
2173                 return true;
2174         }
2175         // Child process starts here. Notice the use of vfork above.
2176         char const *argv[5] = { "sh", "-e", "-s", NULL, NULL };
2177         if (echo_scripts) argv[3] = "-v";
2178         if (pfd[0] != 0)
2179         {
2180                 dup2(pfd[0], 0);
2181                 close(pfd[0]);
2182         }
2183         close(pfd[1]);
2184         execve("/bin/sh", (char **)argv, environ);
2185         _exit(EXIT_FAILURE);
2186 #endif
2187 }
2188
2189 /**
2190  * Create a job for @a target according to the loaded rules.
2191  * Mark all the targets from the rule as running and reset their dependencies.
2192  * If the rule has dependencies, create a new client to build them just
2193  * before @a current, and change @a current so that it points to it.
2194  */
2195 static bool start(std::string const &target, client_list::iterator &current)
2196 {
2197         DEBUG_open << "Starting job " << job_counter << " for " << target << "... ";
2198         rule_t rule = find_rule(target);
2199         if (rule.targets.empty())
2200         {
2201                 status[target].status = Failed;
2202                 DEBUG_close << "failed\n";
2203                 std::cerr << "No rule for building " << target << std::endl;
2204                 return false;
2205         }
2206         for (string_list::const_iterator i = rule.targets.begin(),
2207              i_end = rule.targets.end(); i != i_end; ++i)
2208         {
2209                 status[*i].status = Running;
2210         }
2211         int job_id = job_counter++;
2212         job_targets[job_id] = rule.targets;
2213         DEBUG << "Setting variables of job: " << job_id << " (spawn by: "
2214               << current->job_id << ") to "
2215               << serialize_variables(job_variables[current->job_id], ' ')
2216               << std::endl;
2217         job_variables[job_id] = job_variables[current->job_id];
2218         if (!rule.deps.empty())
2219         {
2220                 current = clients.insert(current, client_t());
2221                 current->job_id = job_id;
2222                 current->pending = rule.deps;
2223                 current->delayed = new rule_t(rule);
2224                 return true;
2225         }
2226         return run_script(job_id, rule);
2227 }
2228
2229 /**
2230  * Send a reply to a client then remove it.
2231  * If the client was a dependency client, start the actual script.
2232  */
2233 static void complete_request(client_t &client, bool success)
2234 {
2235         DEBUG_open << "Completing request from client of job " << client.job_id << "... ";
2236         if (client.delayed)
2237         {
2238                 assert(client.socket == INVALID_SOCKET);
2239                 if (success)
2240                 {
2241                         if (still_need_rebuild(client.delayed->targets.front()))
2242                                 run_script(client.job_id, *client.delayed);
2243                         else complete_job(client.job_id, true);
2244                 }
2245                 else complete_job(client.job_id, false);
2246                 delete client.delayed;
2247         }
2248         else if (client.socket != INVALID_SOCKET)
2249         {
2250                 char res = success ? 1 : 0;
2251                 send(client.socket, &res, 1, 0);
2252         #ifdef WINDOWS
2253                 closesocket(client.socket);
2254         #else
2255                 close(client.socket);
2256         #endif
2257                 --waiting_jobs;
2258         }
2259
2260         if (client.job_id < 0 && !success) build_failure = true;
2261 }
2262
2263 /**
2264  * Return whether there are slots for starting new jobs.
2265  */
2266 static bool has_free_slots()
2267 {
2268         if (max_active_jobs <= 0) return true;
2269         return running_jobs - waiting_jobs < max_active_jobs;
2270 }
2271
2272 /**
2273  * Handle client requests:
2274  * - check for running targets that have finished,
2275  * - start as many pending targets as allowed,
2276  * - complete the request if there are neither running nor pending targets
2277  *   left or if any of them failed.
2278  *
2279  * @return true if some child processes are still running.
2280  *
2281  * @post If there are pending requests, at least one child process is running.
2282  */
2283 static bool handle_clients()
2284 {
2285         DEBUG_open << "Handling client requests... ";
2286         restart:
2287
2288         for (client_list::iterator i = clients.begin(), i_next = i,
2289              i_end = clients.end(); i != i_end && has_free_slots(); i = i_next)
2290         {
2291                 ++i_next;
2292                 DEBUG_open << "Handling client from job " << i->job_id << "... ";
2293                 if (false)
2294                 {
2295                         failed:
2296                         complete_request(*i, false);
2297                         clients.erase(i);
2298                         DEBUG_close << "failed\n";
2299                         continue;
2300                 }
2301
2302                 // Remove running targets that have finished.
2303                 for (string_set::iterator j = i->running.begin(), j_next = j,
2304                      j_end = i->running.end(); j != j_end; j = j_next)
2305                 {
2306                         ++j_next;
2307                         status_map::const_iterator k = status.find(*j);
2308                         assert(k != status.end());
2309                         switch (k->second.status)
2310                         {
2311                         case Running:
2312                                 break;
2313                         case Failed:
2314                                 if (!keep_going) goto failed;
2315                                 i->failed = true;
2316                                 // no break
2317                         case Uptodate:
2318                         case Remade:
2319                                 i->running.erase(j);
2320                                 break;
2321                         case Recheck:
2322                         case Todo:
2323                                 assert(false);
2324                         }
2325                 }
2326
2327                 // Start pending targets.
2328                 while (!i->pending.empty())
2329                 {
2330                         std::string target = i->pending.front();
2331                         i->pending.pop_front();
2332                         switch (get_status(target).status)
2333                         {
2334                         case Running:
2335                                 i->running.insert(target);
2336                                 break;
2337                         case Failed:
2338                                 pending_failed:
2339                                 if (!keep_going) goto failed;
2340                                 i->failed = true;
2341                                 // no break
2342                         case Uptodate:
2343                         case Remade:
2344                                 break;
2345                         case Recheck:
2346                         case Todo:
2347                                 client_list::iterator j = i;
2348                                 if (!start(target, i)) goto pending_failed;
2349                                 j->running.insert(target);
2350                                 if (!has_free_slots()) return true;
2351                                 // Job start might insert a dependency client.
2352                                 i_next = i;
2353                                 ++i_next;
2354                                 break;
2355                         }
2356                 }
2357
2358                 // Try to complete the request.
2359                 // (This might start a new job if it was a dependency client.)
2360                 if (i->running.empty())
2361                 {
2362                         if (i->failed) goto failed;
2363                         complete_request(*i, true);
2364                         clients.erase(i);
2365                         DEBUG_close << "finished\n";
2366                 }
2367
2368         }
2369
2370         if (running_jobs != waiting_jobs) return true;
2371         if (running_jobs == 0 && clients.empty()) return false;
2372
2373         // There is a circular dependency.
2374         // Try to break it by completing one of the requests.
2375         assert(!clients.empty());
2376         std::cerr << "Circular dependency detected" << std::endl;
2377         client_list::iterator i = clients.begin();
2378         complete_request(*i, false);
2379         clients.erase(i);
2380         goto restart;
2381 }
2382
2383 /**
2384  * Create a named unix socket that listens for build requests. Also set
2385  * the REMAKE_SOCKET environment variable that will be inherited by all
2386  * the job scripts.
2387  */
2388 static void create_server()
2389 {
2390         if (false)
2391         {
2392                 error:
2393                 perror("Failed to create server");
2394 #ifndef WINDOWS
2395                 error2:
2396 #endif
2397                 exit(EXIT_FAILURE);
2398         }
2399         DEBUG_open << "Creating server... ";
2400
2401 #ifdef WINDOWS
2402         // Prepare a windows socket.
2403         struct sockaddr_in socket_addr;
2404         socket_addr.sin_family = AF_INET;
2405         socket_addr.sin_addr.s_addr = inet_addr("127.0.0.1");
2406         socket_addr.sin_port = 0;
2407
2408         // Create and listen to the socket.
2409         socket_fd = socket(AF_INET, SOCK_STREAM, 0);
2410         if (socket_fd == INVALID_SOCKET) goto error;
2411         if (!SetHandleInformation((HANDLE)socket_fd, HANDLE_FLAG_INHERIT, 0))
2412                 goto error;
2413         if (bind(socket_fd, (struct sockaddr *)&socket_addr, sizeof(sockaddr_in)))
2414                 goto error;
2415         int len = sizeof(sockaddr_in);
2416         if (getsockname(socket_fd, (struct sockaddr *)&socket_addr, &len))
2417                 goto error;
2418         std::ostringstream buf;
2419         buf << socket_addr.sin_port;
2420         if (!SetEnvironmentVariable("REMAKE_SOCKET", buf.str().c_str()))
2421                 goto error;
2422         if (listen(socket_fd, 1000)) goto error;
2423 #else
2424         // Set signal handlers for SIGCHLD and SIGINT.
2425         // Block SIGCHLD (unblocked during select).
2426         sigset_t sigmask;
2427         sigemptyset(&sigmask);
2428         sigaddset(&sigmask, SIGCHLD);
2429         if (sigprocmask(SIG_BLOCK, &sigmask, NULL) == -1) goto error;
2430         struct sigaction sa;
2431         sa.sa_flags = 0;
2432         sigemptyset(&sa.sa_mask);
2433         sa.sa_handler = &sigchld_handler;
2434         if (sigaction(SIGCHLD, &sa, NULL) == -1) goto error;
2435         sa.sa_handler = &sigint_handler;
2436         if (sigaction(SIGINT, &sa, NULL) == -1) goto error;
2437
2438         // Prepare a named unix socket in temporary directory.
2439         socket_name = tempnam(NULL, "rmk-");
2440         if (!socket_name) goto error2;
2441         struct sockaddr_un socket_addr;
2442         size_t len = strlen(socket_name);
2443         if (len >= sizeof(socket_addr.sun_path) - 1) goto error2;
2444         socket_addr.sun_family = AF_UNIX;
2445         strcpy(socket_addr.sun_path, socket_name);
2446         len += sizeof(socket_addr.sun_family);
2447         if (setenv("REMAKE_SOCKET", socket_name, 1)) goto error;
2448
2449         // Create and listen to the socket.
2450 #ifdef LINUX
2451         socket_fd = socket(AF_UNIX, SOCK_STREAM | SOCK_CLOEXEC, 0);
2452         if (socket_fd == INVALID_SOCKET) goto error;
2453 #else
2454         socket_fd = socket(AF_UNIX, SOCK_STREAM, 0);
2455         if (socket_fd == INVALID_SOCKET) goto error;
2456         if (fcntl(socket_fd, F_SETFD, FD_CLOEXEC) < 0) goto error;
2457 #endif
2458         if (bind(socket_fd, (struct sockaddr *)&socket_addr, len))
2459                 goto error;
2460         if (listen(socket_fd, 1000)) goto error;
2461 #endif
2462 }
2463
2464 /**
2465  * Accept a connection from a client, get the job it spawned from,
2466  * get the targets, and mark them as dependencies of the job targets.
2467  */
2468 void accept_client()
2469 {
2470         DEBUG_open << "Handling client request... ";
2471
2472         // Accept connection.
2473 #ifdef WINDOWS
2474         socket_t fd = accept(socket_fd, NULL, NULL);
2475         if (fd == INVALID_SOCKET) return;
2476         if (!SetHandleInformation((HANDLE)fd, HANDLE_FLAG_INHERIT, 0))
2477         {
2478                 error2:
2479                 std::cerr << "Unexpected failure while setting connection with client" << std::endl;
2480                 closesocket(fd);
2481                 return;
2482         }
2483         // WSAEventSelect puts sockets into nonblocking mode, so disable it here.
2484         u_long nbio = 0;
2485         if (ioctlsocket(fd, FIONBIO, &nbio)) goto error2;
2486 #elif defined(LINUX)
2487         int fd = accept4(socket_fd, NULL, NULL, SOCK_CLOEXEC);
2488         if (fd < 0) return;
2489 #else
2490         int fd = accept(socket_fd, NULL, NULL);
2491         if (fd < 0) return;
2492         if (fcntl(fd, F_SETFD, FD_CLOEXEC) < 0) return;
2493 #endif
2494         clients.push_front(client_t());
2495         client_list::iterator proc = clients.begin();
2496
2497         if (false)
2498         {
2499                 error:
2500                 DEBUG_close << "failed\n";
2501                 std::cerr << "Received an ill-formed client message" << std::endl;
2502         #ifdef WINDOWS
2503                 closesocket(fd);
2504         #else
2505                 close(fd);
2506         #endif
2507                 clients.erase(proc);
2508                 return;
2509         }
2510
2511         // Receive message. Stop when encountering two nuls in a row.
2512         std::vector<char> buf;
2513         size_t len = 0;
2514         while (len < sizeof(int) + 2 || buf[len - 1] || buf[len - 2])
2515         {
2516                 buf.resize(len + 1024);
2517                 ssize_t l = recv(fd, &buf[0] + len, 1024, 0);
2518                 if (l <= 0) goto error;
2519                 len += l;
2520         }
2521
2522         // Parse job that spawned the client.
2523         int job_id;
2524         memcpy(&job_id, &buf[0], sizeof(int));
2525         proc->socket = fd;
2526         proc->job_id = job_id;
2527         job_targets_map::const_iterator i = job_targets.find(job_id);
2528         if (i == job_targets.end()) goto error;
2529         DEBUG << "receiving request from job " << job_id << std::endl;
2530
2531         // Parse the targets and mark them as dependencies from the job targets.
2532         dependency_t &dep = *dependencies[job_targets[job_id].front()];
2533         // Retrieve the variables of the job, pass them to the client.
2534         //proc->variables = job_variables[job_id];
2535
2536         variable_map &vars = job_variables[job_id];
2537
2538         char const *p = &buf[0] + sizeof(int);
2539         while (true)
2540         {
2541                 len = strlen(p);
2542                 if (len == 1 && p[0] == 1)
2543                 {
2544                         //Finished parsing targets.
2545                         p += 2;
2546                         ++waiting_jobs;
2547                         break;
2548                 }
2549                 std::string target(p, p + len);
2550                 DEBUG << "adding dependency " << target << " to job\n";
2551                 proc->pending.push_back(target);
2552                 dep.deps.insert(target);
2553                 p += len + 1;
2554         }
2555
2556         while (true)
2557         {
2558                 len = strlen(p);
2559                 if (len == 0) return;
2560                 std::string line(p, p + len);
2561                 std::istringstream in (line);
2562                 std::string name = read_word(in);
2563                 if (expect_token(in, Equal) == Unexpected) {
2564                   std::cerr << '\'' << line << "'" << std::endl;
2565                   goto error;
2566                 }
2567                 DEBUG << "adding variable " << line << " to job " << job_id << std::endl;
2568                 vars[name].clear();
2569                 read_words(in, vars[name]);
2570                 p += len + 1;
2571         }
2572 }
2573
2574 /**
2575  * Handle child process exit status.
2576  */
2577 void finalize_job(pid_t pid, bool res)
2578 {
2579         pid_job_map::iterator i = job_pids.find(pid);
2580         assert(i != job_pids.end());
2581         int job_id = i->second;
2582         job_pids.erase(i);
2583         --running_jobs;
2584         complete_job(job_id, res);
2585 }
2586
2587 /**
2588  * Loop until all the jobs have finished.
2589  *
2590  * @post There are no client requests left, not even virtual ones.
2591  */
2592 void server_loop()
2593 {
2594         while (handle_clients())
2595         {
2596                 DEBUG_open << "Handling events... ";
2597         #ifdef WINDOWS
2598                 size_t len = job_pids.size() + 1;
2599                 HANDLE h[len];
2600                 int num = 0;
2601                 for (pid_job_map::const_iterator i = job_pids.begin(),
2602                      i_end = job_pids.end(); i != i_end; ++i, ++num)
2603                 {
2604                         h[num] = i->first;
2605                 }
2606                 WSAEVENT aev = WSACreateEvent();
2607                 h[num] = aev;
2608                 WSAEventSelect(socket_fd, aev, FD_ACCEPT);
2609                 DWORD w = WaitForMultipleObjects(len, h, false, INFINITE);
2610                 WSAEventSelect(socket_fd, aev, 0);
2611                 WSACloseEvent(aev);
2612                 if (len <= w)
2613                         continue;
2614                 if (w == len - 1)
2615                 {
2616                         accept_client();
2617                         continue;
2618                 }
2619                 pid_t pid = h[w];
2620                 DWORD s = 0;
2621                 bool res = GetExitCodeProcess(pid, &s) && s == 0;
2622                 CloseHandle(pid);
2623                 finalize_job(pid, res);
2624         #else
2625                 sigset_t emptymask;
2626                 sigemptyset(&emptymask);
2627                 fd_set fdset;
2628                 FD_ZERO(&fdset);
2629                 FD_SET(socket_fd, &fdset);
2630                 int ret = pselect(socket_fd + 1, &fdset, NULL, NULL, NULL, &emptymask);
2631                 if (ret > 0 /* && FD_ISSET(socket_fd, &fdset)*/) accept_client();
2632                 if (!got_SIGCHLD) continue;
2633                 got_SIGCHLD = 0;
2634                 pid_t pid;
2635                 int status;
2636                 while ((pid = waitpid(-1, &status, WNOHANG)) > 0)
2637                 {
2638                         bool res = WIFEXITED(status) && WEXITSTATUS(status) == 0;
2639                         finalize_job(pid, res);
2640                 }
2641         #endif
2642         }
2643
2644         assert(clients.empty());
2645 }
2646
2647 /**
2648  * Load dependencies and rules, listen to client requests, and loop until
2649  * all the requests have completed.
2650  * If Remakefile is obsolete, perform a first run with it only, then reload
2651  * the rules, and perform a second with the original clients.
2652  */
2653 void server_mode(std::string const &remakefile, string_list const &targets)
2654 {
2655         load_dependencies();
2656         load_rules(remakefile);
2657         create_server();
2658         if (get_status(remakefile).status != Uptodate)
2659         {
2660                 clients.push_back(client_t());
2661                 clients.back().pending.push_back(remakefile);
2662                 server_loop();
2663                 if (build_failure) goto early_exit;
2664                 variables.clear();
2665                 specific_rules.clear();
2666                 generic_rules.clear();
2667                 first_target.clear();
2668                 load_rules(remakefile);
2669         }
2670         clients.push_back(client_t());
2671         if (!targets.empty()) clients.back().pending = targets;
2672         else if (!first_target.empty())
2673                 clients.back().pending.push_back(first_target);
2674         server_loop();
2675         early_exit:
2676         close(socket_fd);
2677 #ifndef WINDOWS
2678         remove(socket_name);
2679         free(socket_name);
2680 #endif
2681         save_dependencies();
2682         exit(build_failure ? EXIT_FAILURE : EXIT_SUCCESS);
2683 }
2684
2685 /** @} */
2686
2687 /**
2688  * @defgroup client Client
2689  *
2690  * @{
2691  */
2692
2693 /**
2694  * Connect to the server @a socket_name, send a build request for @a targets,
2695  * and exit with the status returned by the server.
2696  */
2697 void client_mode(char *socket_name, string_list const &targets)
2698 {
2699         if (false)
2700         {
2701                 error:
2702                 perror("Failed to send targets to server");
2703                 exit(EXIT_FAILURE);
2704         }
2705         if (targets.empty()) exit(EXIT_SUCCESS);
2706         DEBUG_open << "Connecting to server... ";
2707
2708         // Connect to server.
2709 #ifdef WINDOWS
2710         struct sockaddr_in socket_addr;
2711         socket_fd = socket(AF_INET, SOCK_STREAM, 0);
2712         if (socket_fd == INVALID_SOCKET) goto error;
2713         socket_addr.sin_family = AF_INET;
2714         socket_addr.sin_addr.s_addr = inet_addr("127.0.0.1");
2715         socket_addr.sin_port = atoi(socket_name);
2716         if (connect(socket_fd, (struct sockaddr *)&socket_addr, sizeof(sockaddr_in)))
2717                 goto error;
2718 #else
2719         struct sockaddr_un socket_addr;
2720         size_t len = strlen(socket_name);
2721         if (len >= sizeof(socket_addr.sun_path) - 1) exit(EXIT_FAILURE);
2722         socket_fd = socket(AF_UNIX, SOCK_STREAM, 0);
2723         if (socket_fd == INVALID_SOCKET) goto error;
2724         socket_addr.sun_family = AF_UNIX;
2725         strcpy(socket_addr.sun_path, socket_name);
2726         if (connect(socket_fd, (struct sockaddr *)&socket_addr, sizeof(socket_addr.sun_family) + len))
2727                 goto error;
2728 #ifdef MACOSX
2729         int set_option = 1;
2730         if (setsockopt(socket_fd, SOL_SOCKET, SO_NOSIGPIPE, &set_option, sizeof(set_option)))
2731                 goto error;
2732 #endif
2733 #endif
2734
2735         // Send current job id.
2736         char *id = getenv("REMAKE_JOB_ID");
2737         int job_id = id ? atoi(id) : -1;
2738         if (send(socket_fd, (char *)&job_id, sizeof(job_id), MSG_NOSIGNAL) != sizeof(job_id))
2739                 goto error;
2740
2741         // Send tagets.
2742         for (string_list::const_iterator i = targets.begin(),
2743              i_end = targets.end(); i != i_end; ++i)
2744         {
2745                 DEBUG_open << "Sending " << *i << "... ";
2746                 ssize_t len = i->length() + 1;
2747                 if (send(socket_fd, i->c_str(), len, MSG_NOSIGNAL) != len)
2748                         goto error;
2749         }
2750         // send 10 as as separator between targets and variables.
2751         char result = 1;
2752         if (send(socket_fd, &result, 1, MSG_NOSIGNAL) != 1) goto error;
2753         result = 0;
2754         if (send(socket_fd, &result, 1, MSG_NOSIGNAL) != 1) goto error;
2755         // Send variables.
2756         // (maybe split vars in small chunks and send... seems overkil)
2757         std::string vars = serialize_variables(variables, 0);
2758         ssize_t sent = vars.size();
2759         DEBUG << "Sending variables: '" << vars << "' to the server" << std::endl;
2760         if (send(socket_fd, vars.data(), sent, MSG_NOSIGNAL) != sent)
2761           goto error;
2762
2763         // Send terminating nul and wait for reply.
2764         result = 0;
2765         if (send(socket_fd, &result, 1, MSG_NOSIGNAL) != 1) goto error;
2766         if (recv(socket_fd, &result, 1, 0) != 1) exit(EXIT_FAILURE);
2767         exit(result ? EXIT_SUCCESS : EXIT_FAILURE);
2768 }
2769
2770 /** @} */
2771
2772 /**
2773  * @defgroup ui User interface
2774  *
2775  * @{
2776  */
2777
2778 /**
2779  * Display usage and exit with @a exit_status.
2780  */
2781 void usage(int exit_status)
2782 {
2783         std::cerr << "Usage: remake [options] [target] ...\n"
2784                 "Options\n"
2785                 "  -d                     Echo script commands.\n"
2786                 "  -d -d                  Print lots of debugging information.\n"
2787                 "  -f FILE                Read FILE as Remakefile.\n"
2788                 "  -h, --help             Print this message and exit.\n"
2789                 "  -j[N], --jobs=[N]      Allow N jobs at once; infinite jobs with no arg.\n"
2790                 "  -k                     Keep going when some targets cannot be made.\n"
2791                 "  -v V=X, --var V=X      Initialize variable V with X.\n"
2792                 "  -r                     Look up targets from the dependencies on stdin.\n"
2793                 "  -s, --silent, --quiet  Do not echo targets.\n";
2794         exit(exit_status);
2795 }
2796
2797 /**
2798  * This program behaves in two different ways.
2799  *
2800  * - If the environment contains the REMAKE_SOCKET variable, the client
2801  *   connects to this socket and sends to the server its build targets.
2802  *   It exits once it receives the server reply.
2803  *
2804  * - Otherwise, it creates a server that waits for build requests. It
2805  *   also creates a pseudo-client that requests the targets passed on the
2806  *   command line.
2807  */
2808 int main(int argc, char *argv[])
2809 {
2810         init_working_dir();
2811
2812         std::string remakefile = "Remakefile";
2813         string_list targets;
2814         bool indirect_targets = false;
2815
2816         // Parse command-line arguments.
2817         for (int i = 1; i < argc; ++i)
2818         {
2819                 std::string arg = argv[i];
2820                 if (arg.empty()) usage(EXIT_FAILURE);
2821                 if (arg == "-h" || arg == "--help") usage(EXIT_SUCCESS);
2822                 if (arg == "-d")
2823                         if (echo_scripts) debug.active = true;
2824                         else echo_scripts = true;
2825                 else if (arg == "-k" || arg =="--keep-going")
2826                         keep_going = true;
2827                 else if (arg == "-s" || arg == "--silent" || arg == "--quiet")
2828                         show_targets = false;
2829                 else if (arg == "-r")
2830                         indirect_targets = true;
2831                 else if (arg == "-f")
2832                 {
2833                         if (++i == argc) usage(EXIT_FAILURE);
2834                         remakefile = argv[i];
2835                 }
2836                 else if (arg.compare(0, 2, "-j") == 0)
2837                         max_active_jobs = atoi(arg.c_str() + 2);
2838                 else if (arg.compare(0, 7, "--jobs=") == 0)
2839                         max_active_jobs = atoi(arg.c_str() + 7);
2840                 else if (arg == "-v" || arg == "--var")
2841                 {
2842                   ++i;
2843                   if (i == argc) usage(EXIT_FAILURE);
2844                   arg = argv[i];
2845                   std::istringstream in (arg);
2846                   std::string name = read_word(in);
2847                   if (expect_token(in, Equal) == Unexpected) {
2848                     std::cerr << "Invalid variable '" << arg << "'" << std::endl;
2849                     exit(EXIT_FAILURE);
2850                   }
2851                   read_words(in, variables[name]);
2852                 }
2853                 else
2854                 {
2855                         if (arg[0] == '-') usage(EXIT_FAILURE);
2856                         targets.push_back(normalize(arg));
2857                         DEBUG << "New target: " << arg << '\n';
2858                 }
2859         }
2860
2861         if (indirect_targets)
2862         {
2863                 load_dependencies(std::cin);
2864                 string_list l;
2865                 targets.swap(l);
2866                 if (l.empty() && !dependencies.empty())
2867                 {
2868                         l.push_back(dependencies.begin()->second->targets.front());
2869                 }
2870                 for (string_list::const_iterator i = l.begin(),
2871                      i_end = l.end(); i != i_end; ++i)
2872                 {
2873                         dependency_map::const_iterator j = dependencies.find(*i);
2874                         if (j == dependencies.end()) continue;
2875                         dependency_t const &dep = *j->second;
2876                         for (string_set::const_iterator k = dep.deps.begin(),
2877                              k_end = dep.deps.end(); k != k_end; ++k)
2878                         {
2879                                 targets.push_back(normalize(*k));
2880                         }
2881                 }
2882                 dependencies.clear();
2883         }
2884
2885 #ifdef WINDOWS
2886         WSADATA wsaData;
2887         if (WSAStartup(MAKEWORD(2,2), &wsaData))
2888         {
2889                 std::cerr << "Unexpected failure while initializing Windows Socket" << std::endl;
2890                 return 1;
2891         }
2892 #endif
2893
2894         // Run as client if REMAKE_SOCKET is present in the environment.
2895         if (char *sn = getenv("REMAKE_SOCKET")) client_mode(sn, targets);
2896
2897         // Otherwise run as server.
2898         server_mode(remakefile, targets);
2899 }
2900
2901 /** @} */