1# Metrowerks Codewarrior for NetWare 2# 3 4# The import files and other misc imports needed to link 5@misc_imports = ("GetProcessSwitchCount", "RunningProcess", 6 "GetSuperHighResolutionTimer"); 7if ($LIBC) 8{ 9 @import_files = ("libc.imp"); 10 @module_files = ("libc"); 11} 12else 13{ 14 # clib build 15 @import_files = ("clib.imp"); 16 @module_files = ("clib"); 17 push(@misc_imports, "_rt_modu64%16", "_rt_divu64%16"); 18} 19if (!$BSDSOCK) 20{ 21 push(@import_files, "ws2nlm.imp"); 22} 23 24 25# The "IMPORTS" environment variable must be set and point to the location 26# where import files (*.imp) can be found. 27# Example: set IMPORTS=c:\ndk\nwsdk\imports 28$import_path = $ENV{"IMPORTS"} || die ("IMPORTS environment variable not set\n"); 29 30 31# The "PRELUDE" environment variable must be set and point to the location 32# and name of the prelude source to link with ( nwpre.obj is recommended ). 33# Example: set PRELUDE=c:\codewar\novell support\metrowerks support\libraries\runtime\nwpre.obj 34$prelude = $ENV{"PRELUDE"} || die ("PRELUDE environment variable not set\n"); 35 36#$ssl= "ssleay32"; 37#$crypto="libeay32"; 38 39$o='\\\\'; 40$cp='copy >nul:'; 41$rm='del'; 42 43# C compiler 44$cc="mwccnlm"; 45 46# Linker 47$link="mwldnlm"; 48 49# librarian 50$mklib="mwldnlm"; 51 52# assembler 53if ($nw_nasm) 54{ 55 $asm="nasmw -s -f coff"; 56 $afile="-o "; 57 $asm.=" -g" if $debug; 58} 59elsif ($nw_mwasm) 60{ 61 $asm="mwasmnlm -maxerrors 20"; 62 $afile="-o "; 63 $asm.=" -g" if $debug; 64} 65elsif ($nw_masm) 66{ 67# masm assembly settings - it should be possible to use masm but haven't 68# got it working. 69# $asm='ml /Cp /coff /c /Cx'; 70# $asm.=" /Zi" if $debug; 71# $afile='/Fo'; 72 die("Support for masm assembler not yet functional\n"); 73} 74else 75{ 76 $asm=""; 77 $afile=""; 78} 79 80 81 82# compile flags 83# 84# NOTES: Several c files in the crypto subdirectory include headers from 85# their local directories. Metrowerks wouldn't find these h files 86# without adding individual include directives as compile flags 87# or modifying the c files. Instead of adding individual include 88# paths for each subdirectory a recursive include directive 89# is used ( -ir crypto ). 90# 91# A similar issue exists for the engines and apps subdirectories. 92# 93# Turned off the "possible" warnings ( -w nopossible ). Metrowerks 94# complained a lot about various stuff. May want to turn back 95# on for further development. 96$cflags="-ir crypto -ir engines -ir apps -msgstyle gcc -align 4 -processor pentium \\ 97 -char unsigned -w on -w nolargeargs -w nopossible -w nounusedarg \\ 98 -w noimplicitconv -relax_pointers -nosyspath -DL_ENDIAN \\ 99 -DOPENSSL_SYSNAME_NETWARE -U_WIN32 -maxerrors 20 "; 100 101# link flags 102$lflags="-msgstyle gcc -zerobss -stacksize 32768 -nostdlib -sym internal "; 103 104 105# additional flags based upon debug | non-debug 106if ($debug) 107{ 108 $cflags.=" -opt off -g -sym internal -DDEBUG"; 109} 110else 111{ 112# CodeWarrior compiler has a problem with optimizations for floating 113# points - no optimizations until further investigation 114# $cflags.=" -opt all"; 115} 116 117# If LibC build add in NKS_LIBC define and set the entry/exit 118# routines - The default entry/exit routines are for CLib and don't exist 119# in LibC 120if ($LIBC) 121{ 122 $cflags.=" -DNETWARE_LIBC"; 123 $lflags.=" -entry _LibCPrelude -exit _LibCPostlude -flags pseudopreemption"; 124} 125else 126{ 127 $cflags.=" -DNETWARE_CLIB"; 128 $lflags.=" -entry _Prelude -exit _Stop"; 129} 130 131# If BSD Socket support is requested, set a define for the compiler 132if ($BSDSOCK) 133{ 134 $cflags.=" -DNETWARE_BSDSOCK"; 135} 136 137 138# linking stuff 139# for the output directories use the mk1mf.pl values with "_nw" appended 140if ($shlib) 141{ 142 if ($LIBC) 143 { 144 $out_def.="_nw_libc_nlm"; 145 $tmp_def.="_nw_libc_nlm"; 146 $inc_def.="_nw_libc_nlm"; 147 } 148 else # NETWARE_CLIB 149 { 150 $out_def.="_nw_clib_nlm"; 151 $tmp_def.="_nw_clib_nlm"; 152 $inc_def.="_nw_clib_nlm"; 153 } 154} 155else 156{ 157 $libp=".lib"; 158 $shlibp=".lib"; 159 $lib_flags="-nodefaults -type library"; 160 if ($LIBC) 161 { 162 $out_def.="_nw_libc"; 163 $tmp_def.="_nw_libc"; 164 $inc_def.="_nw_libc"; 165 } 166 else # NETWARE_CLIB 167 { 168 $out_def.="_nw_clib"; 169 $tmp_def.="_nw_clib"; 170 $inc_def.="_nw_clib"; 171 } 172} 173 174# used by mk1mf.pl 175$obj='.obj'; 176$ofile='-o '; 177$efile=''; 178$exep='.nlm'; 179$ex_libs=''; 180 181if (!$no_asm) 182{ 183 $bn_asm_obj="crypto${o}bn${o}asm${o}bn-nw.obj"; 184 $bn_asm_src="crypto${o}bn${o}asm${o}bn-nw.asm"; 185 $des_enc_obj="crypto${o}des${o}asm${o}d-nw.obj crypto${o}des${o}asm${o}y-nw.obj"; 186 $des_enc_src="crypto${o}des${o}asm${o}d-nw.asm crypto${o}des${o}asm${o}y-nw.asm"; 187 $bf_enc_obj="crypto${o}bf${o}asm${o}b-nw.obj"; 188 $bf_enc_src="crypto${o}bf${o}asm${o}b-nw.asm"; 189 $cast_enc_obj="crypto${o}cast${o}asm${o}c-nw.obj"; 190 $cast_enc_src="crypto${o}cast${o}asm${o}c-nw.asm"; 191 $rc4_enc_obj="crypto${o}rc4${o}asm${o}r4-nw.obj"; 192 $rc4_enc_src="crypto${o}rc4${o}asm${o}r4-nw.asm"; 193 $rc5_enc_obj="crypto${o}rc5${o}asm${o}r5-nw.obj"; 194 $rc5_enc_src="crypto${o}rc5${o}asm${o}r5-nw.asm"; 195 $md5_asm_obj="crypto${o}md5${o}asm${o}m5-nw.obj"; 196 $md5_asm_src="crypto${o}md5${o}asm${o}m5-nw.asm"; 197 $sha1_asm_obj="crypto${o}sha${o}asm${o}s1-nw.obj"; 198 $sha1_asm_src="crypto${o}sha${o}asm${o}s1-nw.asm"; 199 $rmd160_asm_obj="crypto${o}ripemd${o}asm${o}rm-nw.obj"; 200 $rmd160_asm_src="crypto${o}ripemd${o}asm${o}rm-nw.asm"; 201 $cflags.=" -DBN_ASM -DMD5_ASM -DSHA1_ASM -DRMD160_ASM"; 202} 203else 204{ 205 $bn_asm_obj=''; 206 $bn_asm_src=''; 207 $des_enc_obj=''; 208 $des_enc_src=''; 209 $bf_enc_obj=''; 210 $bf_enc_src=''; 211 $cast_enc_obj=''; 212 $cast_enc_src=''; 213 $rc4_enc_obj=''; 214 $rc4_enc_src=''; 215 $rc5_enc_obj=''; 216 $rc5_enc_src=''; 217 $md5_asm_obj=''; 218 $md5_asm_src=''; 219 $sha1_asm_obj=''; 220 $sha1_asm_src=''; 221 $rmd160_asm_obj=''; 222 $rmd160_asm_src=''; 223} 224 225# create the *.def linker command files in \openssl\netware\ directory 226sub do_def_file 227{ 228 # strip off the leading path 229 my($target) = bname(@_); 230 my($def_file); 231 my($mod_file); 232 my($i); 233 234 if ($target =~ /(.*).nlm/) 235 { 236 $target = $1; 237 } 238 239 # special case for openssl - the mk1mf.pl defines E_EXE = openssl 240 if ($target =~ /E_EXE/) 241 { 242 $target = "openssl"; 243 } 244 245 # Note: originally tried to use full path ( \openssl\netware\$target.def ) 246 # Metrowerks linker choked on this with an assertion failure. bug??? 247 # 248 $def_file = "netware\\$target.def"; 249 250 open(DEF_OUT, ">$def_file") || die("unable to open file $def_file\n"); 251 252 print( DEF_OUT "# command file generated by netware.pl for Metrowerks build\n" ); 253 print( DEF_OUT "#\n"); 254 print( DEF_OUT "DESCRIPTION \"$target\"\n"); 255 256 foreach $i (@misc_imports) 257 { 258 print( DEF_OUT "IMPORT $i\n"); 259 } 260 261 foreach $i (@import_files) 262 { 263 print( DEF_OUT "IMPORT \@$import_path\\$i\n"); 264 } 265 266 foreach $i (@module_files) 267 { 268 print( DEF_OUT "MODULE $i\n"); 269 } 270 271 close(DEF_OUT); 272 return($def_file); 273} 274 275sub do_lib_rule 276{ 277 my($objs,$target,$name,$shlib)=@_; 278 my($ret); 279 280 $ret.="$target: $objs\n"; 281 if (!$shlib) 282 { 283 $ret.="\t\@echo Building Lib: $name\n"; 284 $ret.="\t\$(MKLIB) $lib_flags -o $target $objs\n"; 285 $ret.="\t\@echo .\n" 286 } 287 else 288 { 289 die( "Building as NLM not currently supported!" ); 290 } 291 292 $ret.="\n"; 293 return($ret); 294} 295 296sub do_link_rule 297{ 298 my($target,$files,$dep_libs,$libs)=@_; 299 my($ret); 300 my($def_file); 301 302 $def_file = do_def_file($target); 303 304 # special case for openssl - the mk1mf.pl defines E_EXE = openssl 305 306 # NOTE: When building the test nlms no screen name is given 307 # which causes the console screen to be used. By using the console 308 # screen there is no "<press any key to continue>" message which 309 # requires user interaction. The test script ( tests.pl ) needs to be 310 # able to run the tests without requiring user interaction. 311 # 312 # However, the sample program "openssl.nlm" is used by the tests and is 313 # a interactive sample so a screen is desired when not be run by the 314 # tests. To solve the problem, two versions of the program are built: 315 # openssl2 - no screen used by tests 316 # openssl - default screen - use for normal interactive modes 317 # 318 if ($target =~ /E_EXE/) 319 { 320 my($target2) = $target; 321 322 $target2 =~ s/\(E_EXE\)/\(E_EXE\)2/; 323 324 $ret.="$target: $files $dep_libs\n"; 325 326 # openssl 327 $ret.="\t\$(LINK) \$(LFLAGS) -screenname openssl -commandfile $def_file $files \"$prelude\" $libs -o $target\n"; 328 # openssl2 329 $ret.="\t\$(LINK) \$(LFLAGS) -commandfile $def_file $files \"$prelude\" $libs -o $target2\n"; 330 } 331 else 332 { 333 $ret.="$target: $files $dep_libs\n"; 334 $ret.="\t\$(LINK) \$(LFLAGS) -commandfile $def_file $files \"$prelude\" $libs -o $target\n"; 335 } 336 337 $ret.="\n"; 338 return($ret); 339} 340 3411; 342