annotate dmd/link.c @ 276:21f85bac0b1a trunk

[svn r297] Fixed: rewrote linker code to use LLVM's Program facilities instead of DMD's oldschool broken "native" approach.
author lindquist
date Fri, 20 Jun 2008 17:45:13 +0200
parents b77664331d06
children
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
159
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 133
diff changeset
1
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 133
diff changeset
2
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 133
diff changeset
3 // Copyright (c) 1999-2007 by Digital Mars
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 133
diff changeset
4 // All Rights Reserved
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 133
diff changeset
5 // written by Walter Bright
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 133
diff changeset
6 // http://www.digitalmars.com
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 133
diff changeset
7 // License for redistribution is by either the Artistic License
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 133
diff changeset
8 // in artistic.txt, or the GNU General Public License in gnu.txt.
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 133
diff changeset
9 // See the included readme.txt for details.
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 133
diff changeset
10
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 133
diff changeset
11
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 133
diff changeset
12 #include <stdio.h>
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 133
diff changeset
13 #include <ctype.h>
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 133
diff changeset
14 #include <assert.h>
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 133
diff changeset
15 #include <stdarg.h>
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 133
diff changeset
16 #include <string.h>
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 133
diff changeset
17 #include <stdlib.h>
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 133
diff changeset
18
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 133
diff changeset
19 #if _WIN32
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 133
diff changeset
20 #include <process.h>
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 133
diff changeset
21 #endif
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 133
diff changeset
22
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 133
diff changeset
23 #if linux
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 133
diff changeset
24 #include <sys/types.h>
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 133
diff changeset
25 #include <sys/wait.h>
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 133
diff changeset
26 #include <unistd.h>
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 133
diff changeset
27 #endif
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 133
diff changeset
28
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 133
diff changeset
29 #include "root.h"
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 133
diff changeset
30
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 133
diff changeset
31 #include "mars.h"
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 133
diff changeset
32
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 133
diff changeset
33 #include "mem.h"
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 133
diff changeset
34
160
b77664331d06 [svn r176] Fixed a bug with class constructors.
lindquist
parents: 159
diff changeset
35 #include "gen/logger.h"
b77664331d06 [svn r176] Fixed a bug with class constructors.
lindquist
parents: 159
diff changeset
36
159
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 133
diff changeset
37 int executecmd(char *cmd, char *args, int useenv);
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 133
diff changeset
38 int executearg0(char *cmd, char *args);
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 133
diff changeset
39
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 133
diff changeset
40 /**********************************
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 133
diff changeset
41 * Delete generated EXE file.
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 133
diff changeset
42 */
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 133
diff changeset
43
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 133
diff changeset
44 void deleteExeFile()
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 133
diff changeset
45 {
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 133
diff changeset
46 if (global.params.exefile)
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 133
diff changeset
47 {
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 133
diff changeset
48 //printf("deleteExeFile() %s\n", global.params.exefile);
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 133
diff changeset
49 remove(global.params.exefile);
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 133
diff changeset
50 }
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 133
diff changeset
51 }
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 133
diff changeset
52
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 133
diff changeset
53 /******************************
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 133
diff changeset
54 * Execute a rule. Return the status.
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 133
diff changeset
55 * cmd program to run
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 133
diff changeset
56 * args arguments to cmd, as a string
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 133
diff changeset
57 * useenv if cmd knows about _CMDLINE environment variable
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 133
diff changeset
58 */
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 133
diff changeset
59
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 133
diff changeset
60 #if _WIN32
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 133
diff changeset
61 int executecmd(char *cmd, char *args, int useenv)
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 133
diff changeset
62 {
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 133
diff changeset
63 int status;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 133
diff changeset
64 char *buff;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 133
diff changeset
65 size_t len;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 133
diff changeset
66
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 133
diff changeset
67 if (!global.params.quiet || global.params.verbose)
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 133
diff changeset
68 {
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 133
diff changeset
69 printf("%s %s\n", cmd, args);
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 133
diff changeset
70 fflush(stdout);
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 133
diff changeset
71 }
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 133
diff changeset
72
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 133
diff changeset
73 if ((len = strlen(args)) > 255)
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 133
diff changeset
74 { char *q;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 133
diff changeset
75 static char envname[] = "@_CMDLINE";
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 133
diff changeset
76
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 133
diff changeset
77 envname[0] = '@';
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 133
diff changeset
78 switch (useenv)
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 133
diff changeset
79 { case 0: goto L1;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 133
diff changeset
80 case 2: envname[0] = '%'; break;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 133
diff changeset
81 }
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 133
diff changeset
82 q = (char *) alloca(sizeof(envname) + len + 1);
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 133
diff changeset
83 sprintf(q,"%s=%s", envname + 1, args);
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 133
diff changeset
84 status = putenv(q);
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 133
diff changeset
85 if (status == 0)
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 133
diff changeset
86 args = envname;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 133
diff changeset
87 else
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 133
diff changeset
88 {
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 133
diff changeset
89 L1:
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 133
diff changeset
90 error("command line length of %d is too long",len);
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 133
diff changeset
91 }
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 133
diff changeset
92 }
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 133
diff changeset
93
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 133
diff changeset
94 status = executearg0(cmd,args);
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 133
diff changeset
95 #if _WIN32
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 133
diff changeset
96 if (status == -1)
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 133
diff changeset
97 status = spawnlp(0,cmd,cmd,args,NULL);
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 133
diff changeset
98 #endif
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 133
diff changeset
99 // if (global.params.verbose)
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 133
diff changeset
100 // printf("\n");
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 133
diff changeset
101 if (status)
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 133
diff changeset
102 {
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 133
diff changeset
103 if (status == -1)
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 133
diff changeset
104 printf("Can't run '%s', check PATH\n", cmd);
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 133
diff changeset
105 else
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 133
diff changeset
106 printf("--- errorlevel %d\n", status);
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 133
diff changeset
107 }
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 133
diff changeset
108 return status;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 133
diff changeset
109 }
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 133
diff changeset
110 #endif
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 133
diff changeset
111
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 133
diff changeset
112 /**************************************
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 133
diff changeset
113 * Attempt to find command to execute by first looking in the directory
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 133
diff changeset
114 * where DMD was run from.
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 133
diff changeset
115 * Returns:
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 133
diff changeset
116 * -1 did not find command there
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 133
diff changeset
117 * !=-1 exit status from command
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 133
diff changeset
118 */
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 133
diff changeset
119
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 133
diff changeset
120 #if _WIN32
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 133
diff changeset
121 int executearg0(char *cmd, char *args)
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 133
diff changeset
122 {
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 133
diff changeset
123 char *file;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 133
diff changeset
124 char *argv0 = global.params.argv0;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 133
diff changeset
125
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 133
diff changeset
126 //printf("argv0='%s', cmd='%s', args='%s'\n",argv0,cmd,args);
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 133
diff changeset
127
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 133
diff changeset
128 // If cmd is fully qualified, we don't do this
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 133
diff changeset
129 if (FileName::absolute(cmd))
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 133
diff changeset
130 return -1;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 133
diff changeset
131
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 133
diff changeset
132 file = FileName::replaceName(argv0, cmd);
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 133
diff changeset
133
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 133
diff changeset
134 //printf("spawning '%s'\n",file);
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 133
diff changeset
135 #if _WIN32
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 133
diff changeset
136 return spawnl(0,file,file,args,NULL);
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 133
diff changeset
137 #elif linux
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 133
diff changeset
138 char *full;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 133
diff changeset
139 int cmdl = strlen(cmd);
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 133
diff changeset
140
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 133
diff changeset
141 full = (char*) mem.malloc(cmdl + strlen(args) + 2);
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 133
diff changeset
142 if (full == NULL)
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 133
diff changeset
143 return 1;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 133
diff changeset
144 strcpy(full, cmd);
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 133
diff changeset
145 full [cmdl] = ' ';
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 133
diff changeset
146 strcpy(full + cmdl + 1, args);
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 133
diff changeset
147
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 133
diff changeset
148 int result = system(full);
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 133
diff changeset
149
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 133
diff changeset
150 mem.free(full);
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 133
diff changeset
151 return result;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 133
diff changeset
152 #else
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 133
diff changeset
153 assert(0);
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 133
diff changeset
154 #endif
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 133
diff changeset
155 }
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 133
diff changeset
156 #endif
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 133
diff changeset
157
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 133
diff changeset
158 /***************************************
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 133
diff changeset
159 * Run the compiled program.
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 133
diff changeset
160 * Return exit status.
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 133
diff changeset
161 */
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 133
diff changeset
162
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 133
diff changeset
163 int runProgram()
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 133
diff changeset
164 {
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 133
diff changeset
165 //printf("runProgram()\n");
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 133
diff changeset
166 if (global.params.verbose)
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 133
diff changeset
167 {
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 133
diff changeset
168 printf("%s", global.params.exefile);
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 133
diff changeset
169 for (size_t i = 0; i < global.params.runargs_length; i++)
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 133
diff changeset
170 printf(" %s", (char *)global.params.runargs[i]);
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 133
diff changeset
171 printf("\n");
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 133
diff changeset
172 }
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 133
diff changeset
173
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 133
diff changeset
174 // Build argv[]
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 133
diff changeset
175 Array argv;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 133
diff changeset
176
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 133
diff changeset
177 argv.push((void *)global.params.exefile);
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 133
diff changeset
178 for (size_t i = 0; i < global.params.runargs_length; i++)
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 133
diff changeset
179 { char *a = global.params.runargs[i];
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 133
diff changeset
180
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 133
diff changeset
181 #if _WIN32
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 133
diff changeset
182 // BUG: what about " appearing in the string?
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 133
diff changeset
183 if (strchr(a, ' '))
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 133
diff changeset
184 { char *b = (char *)mem.malloc(3 + strlen(a));
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 133
diff changeset
185 sprintf(b, "\"%s\"", a);
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 133
diff changeset
186 a = b;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 133
diff changeset
187 }
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 133
diff changeset
188 #endif
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 133
diff changeset
189 argv.push((void *)a);
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 133
diff changeset
190 }
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 133
diff changeset
191 argv.push(NULL);
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 133
diff changeset
192
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 133
diff changeset
193 #if _WIN32
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 133
diff changeset
194 char *ex = FileName::name(global.params.exefile);
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 133
diff changeset
195 if (ex == global.params.exefile)
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 133
diff changeset
196 ex = FileName::combine(".", ex);
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 133
diff changeset
197 else
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 133
diff changeset
198 ex = global.params.exefile;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 133
diff changeset
199 return spawnv(0,ex,(char **)argv.data);
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 133
diff changeset
200 #elif linux
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 133
diff changeset
201 pid_t childpid;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 133
diff changeset
202 int status;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 133
diff changeset
203
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 133
diff changeset
204 childpid = fork();
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 133
diff changeset
205 if (childpid == 0)
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 133
diff changeset
206 {
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 133
diff changeset
207 char *fn = (char *)argv.data[0];
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 133
diff changeset
208 if (!FileName::absolute(fn))
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 133
diff changeset
209 { // Make it "./fn"
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 133
diff changeset
210 fn = FileName::combine(".", fn);
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 133
diff changeset
211 }
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 133
diff changeset
212 execv(fn, (char **)argv.data);
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 133
diff changeset
213 perror(fn); // failed to execute
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 133
diff changeset
214 return -1;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 133
diff changeset
215 }
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 133
diff changeset
216
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 133
diff changeset
217 waitpid(childpid, &status, 0);
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 133
diff changeset
218
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 133
diff changeset
219 status = WEXITSTATUS(status);
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 133
diff changeset
220 return status;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 133
diff changeset
221 #else
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 133
diff changeset
222 assert(0);
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 133
diff changeset
223 #endif
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 133
diff changeset
224 }