+void ExternalAction::launch()
+{
+ if(builder.get_verbose()>=2)
+ IO::print("%s\n", join(argv.begin(), argv.end()));
+
+ if(builder.get_dry_run())
+ pid = -1;
+ else
+ {
+ pid = fork();
+ if(pid==0)
+ {
+ char *argv_[argv.size()+1];
+
+ unsigned j = 0;
+ for(StringList::iterator i=argv.begin(); i!=argv.end(); ++i)
+ argv_[j++] = strdup(i->c_str());
+ argv_[j] = 0;
+
+ if(!work_dir.empty())
+ FS::chdir(work_dir);
+ execvp(argv_[0], argv_);
+ IO::print("Couldn't execute %s\n", argv.front());
+ exit(1);
+ }
+ else if(pid<0)
+ pid = 0;
+ }
+}
+