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 | |
---|