1 | /* $Id: gccenv.cmd 3376 2007-06-05 21:05:46Z bird $
|
---|
2 | *
|
---|
3 | * GCC environment script.
|
---|
4 | *
|
---|
5 | * Copyright (c) 2003 InnoTek Systemberatung GmbH
|
---|
6 | * Author: knut st. osmundsen <bird-srcspam@anduin.net>
|
---|
7 | *
|
---|
8 | *
|
---|
9 | * This program is free software; you can redistribute it and/or modify
|
---|
10 | * it under the terms of the GNU General Public License as published by
|
---|
11 | * the Free Software Foundation; either version 2 of the License, or
|
---|
12 | * (at your option) any later version.
|
---|
13 | *
|
---|
14 | * This program is distributed in the hope that it will be useful,
|
---|
15 | * but WITHOUT ANY WARRANTY; without even the implied warranty of
|
---|
16 | * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
---|
17 | * GNU General Public License for more details.
|
---|
18 | *
|
---|
19 | * You should have received a copy of the GNU General Public License
|
---|
20 | * along with This program; if not, write to the Free Software
|
---|
21 | * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
|
---|
22 | *
|
---|
23 | */
|
---|
24 |
|
---|
25 | /*
|
---|
26 | * Typical init.
|
---|
27 | */
|
---|
28 | signal on novalue name NoValueHandler
|
---|
29 | if (RxFuncQuery('SysLoadFuncs') = 1) then
|
---|
30 | do
|
---|
31 | call RxFuncAdd 'SysLoadFuncs', 'RexxUtil', 'SysLoadFuncs';
|
---|
32 | call SysLoadFuncs;
|
---|
33 | end
|
---|
34 | call FixCMDEnv
|
---|
35 |
|
---|
36 | /*
|
---|
37 | * Parse any args.
|
---|
38 | */
|
---|
39 | parse arg sPath sLinker sDummy
|
---|
40 | if (sPath = '') then
|
---|
41 | do
|
---|
42 | /* Default is that this script resides in /usr/bin/. */
|
---|
43 | parse source . . sSrc
|
---|
44 | sPath = filespec('drive', sSrc)||strip(filespec('path', strip(filespec('path', sSrc), 'T', '\')), 'T', '\');
|
---|
45 | end
|
---|
46 |
|
---|
47 | sLinker = translate(sLinker);
|
---|
48 | if (sLinker <> '' & sLinker <> 'VAC308' & sLinker <> 'VAC365' & sLinker <> 'LINK386' & sLinker <> 'WLINK') then
|
---|
49 | do
|
---|
50 | say 'Syntax error: Invalid linker '''sLinker''' specified.';
|
---|
51 | say ''
|
---|
52 | call Usage;
|
---|
53 | exit 8;
|
---|
54 | end
|
---|
55 |
|
---|
56 |
|
---|
57 | /*
|
---|
58 | * Do work.
|
---|
59 | */
|
---|
60 | call GCC322plus sPath, 'gcc452', 0, sLinker;
|
---|
61 | exit 0;
|
---|
62 |
|
---|
63 |
|
---|
64 | /**
|
---|
65 | * Display usage info for script.
|
---|
66 | */
|
---|
67 | Usage: procedure
|
---|
68 | say 'syntax: gccenv.cmd [gcc-usr-path [linker]]';
|
---|
69 | say ''
|
---|
70 | say '[gcc-usr-path] is the path to the /usr directory of the gcc distro.'
|
---|
71 | say 'If [gcc-usr-path] isn''t specified, the script assumes it''s located'
|
---|
72 | say 'in /usr/bin of the gcc distro and deducts the path based on that.'
|
---|
73 | say ''
|
---|
74 | say '[linker] is the EMXOMFLD_TYPE as described by emxomfld.exe usage. It''s'
|
---|
75 | say 'thus either LINK386, VAC308 or VAC365.'
|
---|
76 | say ''
|
---|
77 | say 'Copyright (c) 2003 InnoTek Systemberatung GmbH'
|
---|
78 | say ''
|
---|
79 | return 0;
|
---|
80 |
|
---|
81 |
|
---|
82 |
|
---|
83 | /**
|
---|
84 | * Innotek GCC 3.2.x and higher - this environment is EMX RT free.
|
---|
85 | * @param sPath The path of the /usr directory in the GCC distro.
|
---|
86 | * @param sToolId Tool identificator. gcc335
|
---|
87 | * @param fRM If set we'll remove the environment setup.
|
---|
88 | * If clear we'll install it.
|
---|
89 | * @param sLinker Which linker to use. If blank use emxomfld default linker.
|
---|
90 | */
|
---|
91 | GCC322plus: procedure
|
---|
92 | parse arg sPath, sToolId, fRM, sLinker
|
---|
93 |
|
---|
94 | /*
|
---|
95 | * EMX/GCC main directory.
|
---|
96 | */
|
---|
97 |
|
---|
98 | /* parse out the version / constants */
|
---|
99 | chMajor = '4';
|
---|
100 | chMinor = '5';
|
---|
101 | chRel = '2';
|
---|
102 | sVer = chMajor'.'chMinor'.'chRel
|
---|
103 | sVerShrt = chMajor||chMinor||chRel;
|
---|
104 | sTrgt = 'i386-pc-os2-emx'
|
---|
105 | chNewMajor = left(right(sToolId, 3), 1);
|
---|
106 | chNewMinor = left(right(sToolId, 2), 1);
|
---|
107 | chNewRel = right(sToolId, 1);
|
---|
108 | sNewVer = chNewMajor'.'chNewMinor'.'chNewRel;
|
---|
109 | sNewDir = 'local'||chNewMajor||chNewMinor||chNewRel;
|
---|
110 |
|
---|
111 | sGCCBack = translate(sPath, '\', '/');
|
---|
112 | sGCCForw = translate(sPath, '/', '\');
|
---|
113 |
|
---|
114 | if (stream(sGCCBack'\bin\gcc.exe', 'c', 'query exist') = '' &,
|
---|
115 | stream(sGCCBack'\'sNewDir'\bin\gcc.exe', 'c', 'query exist') = '') then
|
---|
116 | do
|
---|
117 | say 'Error: cannot find gcc.exe in '''sGCCBack'\bin'' or in '''sGCCBack'\'sNewDir'\bin''!';
|
---|
118 | say ''
|
---|
119 | call Usage;
|
---|
120 | exit 8;
|
---|
121 | end
|
---|
122 |
|
---|
123 | call EnvSet fRM, 'PATH_EMXPGCC', sGCCBack;
|
---|
124 | call EnvSet fRM, 'CCENV', 'EMX'
|
---|
125 | call EnvSet fRM, 'BUILD_ENV', 'EMX'
|
---|
126 | call EnvSet fRM, 'BUILD_PLATFORM', 'OS2'
|
---|
127 |
|
---|
128 | call EnvAddFront fRM, 'BEGINLIBPATH', sGCCBack'\lib;'
|
---|
129 | call EnvAddFront fRM, 'BEGINLIBPATH', sGCCBack'\'sNewDir'\lib;'
|
---|
130 | call EnvAddFront fRM, 'DPATH', sGCCBack'\lib;'
|
---|
131 | call EnvAddFront fRM, 'DPATH', sGCCBack'\'sNewDir'\lib;'
|
---|
132 | /*call EnvAddFront fRM, 'HELP', sGCCBack'\lib;'*/
|
---|
133 | call EnvAddFront fRM, 'PATH', sGCCBack'\bin;'
|
---|
134 | call EnvAddFront fRM, 'PATH', sGCCBack'\'sNewDir'\bin;'
|
---|
135 | call EnvAddFront fRM, 'PATH', sGCCBack'\'sNewDir'\libexec\gcc\'sTrgt'\'sNewVer';'
|
---|
136 | /*call EnvAddFront fRM, 'DPATH', sGCCBack'\book;'
|
---|
137 | call EnvAddFront fRM, 'BOOKSHELF', sGCCBack'\book;'
|
---|
138 | call EnvAddFront fRM, 'HELP', sGCCBack'\help;' */
|
---|
139 | call EnvAddFront fRM, 'C_INCLUDE_PATH', sGCCForw'/include;'
|
---|
140 | call EnvAddFront fRM, 'C_INCLUDE_PATH', sGCCForw'/'sNewDir'/include;'
|
---|
141 | call EnvAddFront fRM, 'C_INCLUDE_PATH', sGCCForw'/'sNewDir'/lib/gcc/'sTrgt'/'sNewVer'/include;'
|
---|
142 | call EnvAddFront fRM, 'CPLUS_INCLUDE_PATH', sGCCForw'/include;'
|
---|
143 | call EnvAddFront fRM, 'CPLUS_INCLUDE_PATH', sGCCForw'/'sNewDir'/include;'
|
---|
144 | call EnvAddFront fRM, 'CPLUS_INCLUDE_PATH', sGCCForw'/'sNewDir'/include/c++/'sNewVer'/backward;'
|
---|
145 | call EnvAddFront fRM, 'CPLUS_INCLUDE_PATH', sGCCForw'/'sNewDir'/include/c++/'sNewVer'/'sTrgt';'
|
---|
146 | call EnvAddFront fRM, 'CPLUS_INCLUDE_PATH', sGCCForw'/'sNewDir'/include/c++/'sNewVer';'
|
---|
147 | call EnvAddFront fRM, 'LIBRARY_PATH', sGCCForw'/lib;'
|
---|
148 | call EnvAddFront fRM, 'LIBRARY_PATH', sGCCForw'/'sNewDir'/lib;'
|
---|
149 | call EnvAddFront fRM, 'LIBRARY_PATH', sGCCForw'/'sNewDir'/lib/gcc/'sTrgt'/'sNewVer';'
|
---|
150 | call EnvAddFront fRM, 'INFOPATH', sGCCForw'/info;'
|
---|
151 | call EnvAddFront fRM, 'INFOPATH', sGCCForw'/'sNewDir'/info;'
|
---|
152 | /* is this used? */
|
---|
153 | call EnvSet fRM, 'PROTODIR', sGCCForw'/include/c++/gen'
|
---|
154 |
|
---|
155 | /* use wlink? */
|
---|
156 | if (sLinker = 'WLINK') then
|
---|
157 | do
|
---|
158 | call EnvSet fRM, 'EMXOMFLD_TYPE', 'WLINK';
|
---|
159 | call EnvSet fRM, 'EMXOMFLD_LINKER', 'wl.exe';
|
---|
160 | /* call EnvSet fRM, 'EMXOMFLD_LINKER', 'wl.exe'; - comment this in if you use an official OpenWatcom wlink. */
|
---|
161 | end
|
---|
162 |
|
---|
163 | /* use link386? */
|
---|
164 | if (sLinker = 'LINK386') then
|
---|
165 | do
|
---|
166 | call EnvSet fRM, 'EMXOMFLD_TYPE', 'LINK386';
|
---|
167 | call EnvSet fRM, 'EMXOMFLD_LINKER', 'link386.exe';
|
---|
168 | end
|
---|
169 |
|
---|
170 | /* use vac308? */
|
---|
171 | if (sLinker = 'VAC308') then
|
---|
172 | do
|
---|
173 | call EnvSet fRM, 'EMXOMFLD_TYPE', 'VAC308';
|
---|
174 | call EnvSet fRM, 'EMXOMFLD_LINKER', 'ilink.exe';
|
---|
175 | end
|
---|
176 |
|
---|
177 | /* use default or VAC365? */
|
---|
178 | if (sLinker = '' | sLinker = 'VAC365') then
|
---|
179 | do
|
---|
180 | call EnvSet 1, 'EMXOMFLD_TYPE';
|
---|
181 | call EnvSet 1, 'EMXOMFLD_LINKER';
|
---|
182 | end
|
---|
183 |
|
---|
184 | return 0;
|
---|
185 |
|
---|
186 |
|
---|
187 | /**
|
---|
188 | * Add sToAdd in front of sEnvVar. sToAdd may be a list.
|
---|
189 | *
|
---|
190 | * See EnvAddFrontOrBack for details.
|
---|
191 | */
|
---|
192 | EnvAddFront: procedure
|
---|
193 | parse arg fRM, sEnvVar, sToAdd, sSeparator
|
---|
194 | return EnvAddFrontOrBack(1, fRM, sEnvVar, sToAdd, sSeparator);
|
---|
195 |
|
---|
196 |
|
---|
197 | /**
|
---|
198 | * Add sToAdd in front of sEnvVar. sToAdd may be a list.
|
---|
199 | *
|
---|
200 | * See EnvAddFrontOrBack for details.
|
---|
201 | */
|
---|
202 | EnvAddEnd: procedure
|
---|
203 | parse arg fRM, sEnvVar, sToAdd, sSeparator
|
---|
204 | return EnvAddFrontOrBack(0, fRM, sEnvVar, sToAdd, sSeparator);
|
---|
205 |
|
---|
206 |
|
---|
207 | /**
|
---|
208 | * Add sToAdd in front or at the end of sEnvVar. sToAdd may be a list.
|
---|
209 | *
|
---|
210 | * Note: This function will remove leading and trailing semicolons, as well
|
---|
211 | * as duplcate semicolons somewhere in the middle. See
|
---|
212 | *
|
---|
213 | * http://gcc.gnu.org/onlinedocs/gcc-4.4.2/gcc/Environment-Variables.html
|
---|
214 | *
|
---|
215 | * (CPLUS_INCLUDE_PATH and friends) for the explaination why it is necessary to
|
---|
216 | * do. If you want to specifially mean the current working directory, use "."
|
---|
217 | * instead of an empty path element.
|
---|
218 | */
|
---|
219 | EnvAddFrontOrBack: procedure
|
---|
220 | parse arg fFront, fRM, sEnvVar, sToAdd, sSeparator
|
---|
221 |
|
---|
222 | /* sets default separator if not specified. */
|
---|
223 | if (sSeparator = '') then sSeparator = ';';
|
---|
224 |
|
---|
225 | /* get rid of extra ';' */
|
---|
226 | sToAdd = strip(sToAdd,, sSeparator);
|
---|
227 | sToAddClean = ''
|
---|
228 | do i = 1 to length(sToAdd)
|
---|
229 | ch = substr(sToAdd, i, 1);
|
---|
230 | if (ch == sSeparator & right(sToAddClean, 1) == sSeparator) then
|
---|
231 | iterate
|
---|
232 | sToAddClean = sToAddClean||ch
|
---|
233 | end
|
---|
234 |
|
---|
235 | /* Get original variable value */
|
---|
236 | sOrgEnvVar = EnvGet(sEnvVar);
|
---|
237 |
|
---|
238 | /* loop thru sToAddClean */
|
---|
239 | rc = 0;
|
---|
240 | i = length(sToAddClean);
|
---|
241 | do while (i > 0 & rc = 0)
|
---|
242 | j = lastpos(sSeparator, sToAddClean, i);
|
---|
243 | sOne = substr(sToAddClean, j+1, i - j);
|
---|
244 | cbOne = length(sOne);
|
---|
245 | /* Remove previous sOne if exists. (Changing sOrgEnvVar). */
|
---|
246 | s1 = 1;
|
---|
247 | do while (s1 <= length(sOrgEnvVar))
|
---|
248 | s2 = pos(sSeparator, sOrgEnvVar, s1);
|
---|
249 | if (s2 == 0) then
|
---|
250 | s2 = length(sOrgEnvVar) + 1;
|
---|
251 | if (translate(substr(sOrgEnvVar, s1, s2 - s1)) == translate(sOne)) then do
|
---|
252 | sOrgEnvVar = delstr(sOrgEnvVar, s1, s2 - s1 + 1 /*+sep*/);
|
---|
253 | s1 = s1 + 1;
|
---|
254 | end
|
---|
255 | else do
|
---|
256 | s1 = s2 + 1;
|
---|
257 | end
|
---|
258 | end
|
---|
259 | sOrgEnvVar = strip(sOrgEnvVar,, sSeparator);
|
---|
260 |
|
---|
261 | i = j - 1;
|
---|
262 | end
|
---|
263 |
|
---|
264 | /* set environment */
|
---|
265 | if (fRM) then
|
---|
266 | return EnvSet(0, sEnvVar, sOrgEnvVar);
|
---|
267 |
|
---|
268 | /* add sToAddClean in necessary mode */
|
---|
269 | if (fFront) then
|
---|
270 | do
|
---|
271 | if (sOrgEnvVar \== '' & left(sOrgEnvVar, 1) \== sSeparator) then
|
---|
272 | sOrgEnvVar = sSeparator||sOrgEnvVar;
|
---|
273 | sOrgEnvVar = sToAddClean||sOrgEnvVar;
|
---|
274 | end
|
---|
275 | else
|
---|
276 | do
|
---|
277 | if (sOrgEnvVar \== '' & right(sOrgEnvVar, 1) \== sSeparator) then
|
---|
278 | sOrgEnvVar = sOrgEnvVar||sSeparator;
|
---|
279 | sOrgEnvVar = sOrgEnvVar||sToAddClean;
|
---|
280 | end
|
---|
281 |
|
---|
282 | return EnvSet(0, sEnvVar, sOrgEnvVar);
|
---|
283 |
|
---|
284 |
|
---|
285 | /**
|
---|
286 | * Sets sEnvVar to sValue.
|
---|
287 | */
|
---|
288 | EnvSet: procedure
|
---|
289 | parse arg fRM, sEnvVar, sValue
|
---|
290 |
|
---|
291 | /* if we're to remove this, make valuestring empty! */
|
---|
292 | if (fRM) then
|
---|
293 | sValue = '';
|
---|
294 | sEnvVar = translate(sEnvVar);
|
---|
295 |
|
---|
296 | /*
|
---|
297 | * Begin/EndLibpath fix:
|
---|
298 | * We'll have to set internal these using both commandline 'SET'
|
---|
299 | * and internal VALUE in order to export it and to be able to
|
---|
300 | * get it (with EnvGet) again.
|
---|
301 | */
|
---|
302 | if ((sEnvVar = 'BEGINLIBPATH') | (sEnvVar = 'ENDLIBPATH')) then
|
---|
303 | do
|
---|
304 | if (length(sValue) >= 1024) then
|
---|
305 | say 'Warning: 'sEnvVar' is too long,' length(sValue)' char.';
|
---|
306 | return SysSetExtLibPath(sValue, substr(sEnvVar, 1, 1));
|
---|
307 | end
|
---|
308 |
|
---|
309 | if (length(sValue) >= 1024) then
|
---|
310 | do
|
---|
311 | say 'Warning: 'sEnvVar' is too long,' length(sValue)' char.';
|
---|
312 | say ' This may make CMD.EXE unstable after a SET operation to print the environment.';
|
---|
313 | end
|
---|
314 | sRc = VALUE(sEnvVar, sValue, 'OS2ENVIRONMENT');
|
---|
315 | return 0;
|
---|
316 |
|
---|
317 | /**
|
---|
318 | * Gets the value of sEnvVar.
|
---|
319 | */
|
---|
320 | EnvGet: procedure
|
---|
321 | parse arg sEnvVar
|
---|
322 | if ((translate(sEnvVar) = 'BEGINLIBPATH') | (translate(sEnvVar) = 'ENDLIBPATH')) then
|
---|
323 | return SysQueryExtLibPath(substr(sEnvVar, 1, 1));
|
---|
324 | return value(sEnvVar,, 'OS2ENVIRONMENT');
|
---|
325 |
|
---|
326 |
|
---|
327 | /**
|
---|
328 | * Workaround for bug in CMD.EXE.
|
---|
329 | * It messes up when REXX have expanded the environment.
|
---|
330 | */
|
---|
331 | FixCMDEnv: procedure
|
---|
332 | /* check for 4OS2 first */
|
---|
333 | Address CMD '@set 4os2test_env=%@eval[2 + 2]';
|
---|
334 | if (value('4os2test_env',, 'OS2ENVIRONMENT') = '4') then
|
---|
335 | return 0;
|
---|
336 |
|
---|
337 | /* force environment expansion by setting a lot of variables and freeing them. */
|
---|
338 | do i = 1 to 100
|
---|
339 | Address CMD '@set dummyenvvar'||i'=abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ';
|
---|
340 | end
|
---|
341 | do i = 1 to 100
|
---|
342 | Address CMD '@set dummyenvvar'||i'=';
|
---|
343 | end
|
---|
344 | return 0;
|
---|
345 |
|
---|