$version_header = "crypto/opensslv.h";
open(IN, "$version_header") or die "Couldn't open $version_header: $!";
while (<IN>) {
if (/^ {
$nlmvernum = "$1,".($2*10+$3).",".($4*1);
break;
}
}
close(IN) or die "Couldn't close $version_header: $!";
$readme_file = "README";
open(IN, $readme_file) or die "Couldn't open $readme_file: $!";
while (<IN>) {
if (/^[\s\t]+OpenSSL[\s\t]+(\d)\.(\d{1,2})\.(\d{1,2})([a-z])(.*)/)
{
$nlmverstr = "$1.$2.$3$4$5";
}
elsif (/^[\s\t]+(Copyright \(c\) \d{4}\-\d{4} The OpenSSL Project)$/)
{
$nlmcpystr = $1;
}
break if ($nlmvernum && $nlmcpystr);
}
close(IN) or die "Couldn't close $readme_file: $!";
$nlmstack = "32768";
$nlmvernum = "1,0,0" if (!$nlmvernum);
$nlmverstr = "OpenSSL" if (!$nlmverstr);
$nlmcpystr = "Copyright (c) 1998-now The OpenSSL Project" if (!$nlmcpystr);
@misc_imports = ("GetProcessSwitchCount", "RunningProcess",
"GetSuperHighResolutionTimer");
if ($LIBC)
{
@import_files = ("libc.imp");
@module_files = ("libc");
$libarch = "LIBC";
}
else
{
@import_files = ("clib.imp");
push(@import_files, "socklib.imp") if ($BSDSOCK);
@module_files = ("clib");
$libarch = "CLIB";
}
if ($BSDSOCK)
{
$libarch .= "-BSD";
}
else
{
$libarch .= "-WS2";
push(@import_files, "ws2nlm.imp");
}
$import_path = $ENV{"IMPORTS"} || die ("IMPORTS environment variable not set\n");
$prelude = $ENV{"PRELUDE"} || die ("PRELUDE environment variable not set\n");
$include_path = $ENV{"INCLUDE"} || die ("INCLUDES environment variable not set\n");
$include_path =~ s/\\/\//g;
$include_path = join(" -I", split(/;/, $include_path));
$gnuc = $ENV{"GNUC"};
if ($gnuc)
{
$cc='gcc';
$link='nlmconv';
$mklib='ar';
$o='/';
$cp='cp -af';
$rm='rm -f';
$mv='mv -f';
$mkdir='gmkdir';
}
else
{
$cc='mwccnlm';
$link='mwldnlm';
$mklib='mwldnlm';
$o='\\';
$cp='copy >nul:';
$rm='del /f /q';
}
if ($nw_nasm)
{
if ($gnuc)
{
$asm="nasmw -s -f elf";
}
else
{
$asm="nasmw -s -f coff";
}
$afile="-o ";
$asm.=" -g" if $debug;
}
elsif ($nw_mwasm)
{
$asm="mwasmnlm -maxerrors 20";
$afile="-o ";
$asm.=" -g" if $debug;
}
elsif ($nw_masm)
{
die("Support for masm assembler not yet functional\n");
}
else
{
$asm="";
$afile="";
}
if ($gnuc)
{
if ($debug)
{
$cflags="-g -DDEBUG";
}
else
{
$cflags="-O2";
}
$cflags.=" -nostdinc -I$include_path \\
-fno-builtin -fpcc-struct-return -fno-strict-aliasing \\
-funsigned-char -Wall -Wno-unused -Wno-uninitialized";
$lflags="-T";
}
else
{
if ($debug)
{
$cflags="-opt off -g -sym internal -DDEBUG";
}
else
{
}
$cflags.=" -nostdinc -ir crypto -ir engines -ir apps -I$include_path \\
-msgstyle gcc -align 4 -processor pentium -char unsigned \\
-w on -w nolargeargs -w nopossible -w nounusedarg -w nounusedexpr \\
-w noimplicitconv -relax_pointers -nosyspath -maxerrors 20";
$lflags="-msgstyle gcc -zerobss -nostdlib -sym internal -commandfile";
}
$cflags.=" -DL_ENDIAN -DOPENSSL_SYSNAME_NETWARE -U_WIN32";
if ($LIBC)
{
$cflags.=" -DNETWARE_LIBC";
$nlmstart = "_LibCPrelude";
$nlmexit = "_LibCPostlude";
@nlm_flags = ("pseudopreemption", "flag_on 64");
}
else
{
$cflags.=" -DNETWARE_CLIB";
$nlmstart = "_Prelude";
$nlmexit = "_Stop";
}
if ($BSDSOCK)
{
$cflags.=" -DNETWARE_BSDSOCK";
if (!$LIBC)
{
$cflags.=" -DNETDB_USE_INTERNET";
}
}
if ($shlib)
{
if ($LIBC)
{
$out_def.="_nw_libc_nlm";
$tmp_def.="_nw_libc_nlm";
$inc_def.="_nw_libc_nlm";
}
else {
$out_def.="_nw_clib_nlm";
$tmp_def.="_nw_clib_nlm";
$inc_def.="_nw_clib_nlm";
}
}
else
{
if ($gnuc) {
$libp=".a";
$shlibp=".a";
$lib_flags="-cr";
}
else {
$libp=".lib";
$shlibp=".lib";
$lib_flags="-nodefaults -type library -o";
}
if ($LIBC)
{
$out_def.="_nw_libc";
$tmp_def.="_nw_libc";
$inc_def.="_nw_libc";
}
else {
$out_def.="_nw_clib";
$tmp_def.="_nw_clib";
$inc_def.="_nw_clib";
}
}
$obj='.o';
$ofile='-o ';
$efile='';
$exep='.nlm';
$ex_libs='';
if (!$no_asm)
{
$bn_asm_obj="\$(OBJ_D)${o}bn-nw${obj}";
$bn_asm_src="crypto${o}bn${o}asm${o}bn-nw.asm";
$bnco_asm_obj="\$(OBJ_D)${o}co-nw${obj}";
$bnco_asm_src="crypto${o}bn${o}asm${o}co-nw.asm";
$aes_asm_obj="\$(OBJ_D)${o}a-nw${obj}";
$aes_asm_src="crypto${o}aes${o}asm${o}a-nw.asm";
$des_enc_obj="\$(OBJ_D)${o}d-nw${obj} \$(OBJ_D)${o}y-nw${obj}";
$des_enc_src="crypto${o}des${o}asm${o}d-nw.asm crypto${o}des${o}asm${o}y-nw.asm";
$bf_enc_obj="\$(OBJ_D)${o}b-nw${obj}";
$bf_enc_src="crypto${o}bf${o}asm${o}b-nw.asm";
$cast_enc_obj="\$(OBJ_D)${o}c-nw${obj}";
$cast_enc_src="crypto${o}cast${o}asm${o}c-nw.asm";
$rc4_enc_obj="\$(OBJ_D)${o}r4-nw${obj}";
$rc4_enc_src="crypto${o}rc4${o}asm${o}r4-nw.asm";
$rc5_enc_obj="\$(OBJ_D)${o}r5-nw${obj}";
$rc5_enc_src="crypto${o}rc5${o}asm${o}r5-nw.asm";
$md5_asm_obj="\$(OBJ_D)${o}m5-nw${obj}";
$md5_asm_src="crypto${o}md5${o}asm${o}m5-nw.asm";
$sha1_asm_obj="\$(OBJ_D)${o}s1-nw${obj}";
$sha1_asm_src="crypto${o}sha${o}asm${o}s1-nw.asm";
$rmd160_asm_obj="\$(OBJ_D)${o}rm-nw${obj}";
$rmd160_asm_src="crypto${o}ripemd${o}asm${o}rm-nw.asm";
$cpuid_asm_obj="\$(OBJ_D)${o}x86cpuid-nw${obj}";
$cpuid_asm_src="crypto${o}x86cpuid-nw.asm";
$cflags.=" -DOPENSSL_CPUID_OBJ -DBN_ASM -DOPENSSL_BN_ASM_PART_WORDS -DMD5_ASM -DSHA1_ASM";
$cflags.=" -DAES_ASM -DRMD160_ASM";
}
else
{
$bn_asm_obj='';
$bn_asm_src='';
$bnco_asm_obj='';
$bnco_asm_src='';
$aes_asm_obj='';
$aes_asm_src='';
$des_enc_obj='';
$des_enc_src='';
$bf_enc_obj='';
$bf_enc_src='';
$cast_enc_obj='';
$cast_enc_src='';
$rc4_enc_obj='';
$rc4_enc_src='';
$rc5_enc_obj='';
$rc5_enc_src='';
$md5_asm_obj='';
$md5_asm_src='';
$sha1_asm_obj='';
$sha1_asm_src='';
$rmd160_asm_obj='';
$rmd160_asm_src='';
$cpuid_asm_obj='';
$cpuid_asm_src='';
}
sub do_def_file
{
my($target) = bname(shift);
my($i);
if ($target =~ /(.*).nlm/)
{
$target = $1;
}
if ($target =~ /E_EXE/)
{
$target =~ s/\$\(E_EXE\)/openssl/;
}
my($def_file) = "netware${o}$target.def";
open(DEF_OUT, ">$def_file") || die("unable to open file $def_file\n");
print( DEF_OUT "# command file generated by netware.pl for NLM target.\n" );
print( DEF_OUT "# do not edit this file - all your changes will be lost!!\n" );
print( DEF_OUT "#\n");
print( DEF_OUT "DESCRIPTION \"$target ($libarch) - OpenSSL $nlmverstr\"\n");
print( DEF_OUT "COPYRIGHT \"$nlmcpystr\"\n");
print( DEF_OUT "VERSION $nlmvernum\n");
print( DEF_OUT "STACK $nlmstack\n");
print( DEF_OUT "START $nlmstart\n");
print( DEF_OUT "EXIT $nlmexit\n");
if ($target eq "openssl")
{
print( DEF_OUT "SCREENNAME \"OpenSSL $nlmverstr\"\n");
}
else
{
print( DEF_OUT "SCREENNAME \"DEFAULT\"\n");
}
foreach $i (@misc_imports)
{
print( DEF_OUT "IMPORT $i\n");
}
foreach $i (@import_files)
{
print( DEF_OUT "IMPORT \@$import_path${o}$i\n");
}
foreach $i (@module_files)
{
print( DEF_OUT "MODULE $i\n");
}
foreach $i (@nlm_flags)
{
print( DEF_OUT "$i\n");
}
if ($gnuc)
{
if ($target =~ /openssl/)
{
print( DEF_OUT "INPUT ${tmp_def}${o}openssl${obj}\n");
print( DEF_OUT "INPUT ${tmp_def}${o}openssl${libp}\n");
}
else
{
print( DEF_OUT "INPUT ${tmp_def}${o}${target}${obj}\n");
}
print( DEF_OUT "INPUT $prelude\n");
print( DEF_OUT "INPUT ${out_def}${o}${ssl}${libp} ${out_def}${o}${crypto}${libp}\n");
print( DEF_OUT "OUTPUT $target.nlm\n");
}
close(DEF_OUT);
return($def_file);
}
sub do_lib_rule
{
my($objs,$target,$name,$shlib)=@_;
my($ret);
$ret.="$target: $objs\n";
if (!$shlib)
{
$ret.="\t\@echo Building Lib: $name\n";
$ret.="\t\$(MKLIB) $lib_flags $target $objs\n";
$ret.="\t\@echo .\n"
}
else
{
die( "Building as NLM not currently supported!" );
}
$ret.="\n";
return($ret);
}
sub do_link_rule
{
my($target,$files,$dep_libs,$libs)=@_;
my($ret);
my($def_file) = do_def_file($target);
$ret.="$target: $files $dep_libs\n";
if ($target =~ /E_EXE/)
{
my($target2) = $target;
$target2 =~ s/\(E_EXE\)/\(E_EXE\)2/;
my($def_file2) = do_def_file($target2);
if ($gnuc)
{
$ret.="\t\$(MKLIB) $lib_flags \$(TMP_D)${o}\$(E_EXE).a \$(filter-out \$(TMP_D)${o}\$(E_EXE)${obj},$files)\n";
$ret.="\t\$(LINK) \$(LFLAGS) $def_file2\n";
$ret.="\t\@$mv \$(E_EXE)2.nlm \$(TEST_D)\n";
}
else
{
$ret.="\t\$(LINK) \$(LFLAGS) $def_file2 $files \"$prelude\" $libs -o $target2\n";
}
}
if ($gnuc)
{
$ret.="\t\$(LINK) \$(LFLAGS) $def_file\n";
$ret.="\t\@$mv \$(\@F) \$(TEST_D)\n";
}
else
{
$ret.="\t\$(LINK) \$(LFLAGS) $def_file $files \"$prelude\" $libs -o $target\n";
}
$ret.="\n";
return($ret);
}
1;