# Metrowerks Codewarrior or gcc / nlmconv for NetWare
#

$version_header = "crypto/opensslv.h";
open(IN, "$version_header") or die "Couldn't open $version_header: $!";
while (<IN>) {
  if (/^#define[\s\t]+OPENSSL_VERSION_NUMBER[\s\t]+0x(\d)(\d{2})(\d{2})(\d{2})/)
  {
    # die "OpenSSL version detected: $1.$2.$3.$4\n";
    #$nlmvernum = "$1,$2,$3";
    $nlmvernum = "$1,".($2*10+$3).",".($4*1);
    #$nlmverstr = "$1.".($2*1).".".($3*1).($4?(chr(96+$4)):"");
    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])(.*)/)
  {
    #$nlmvernum = "$1,$2,$3";
    #$nlmvernum = "$1,".($2*10+$3).",".($4*1);
    $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: $!";

# Define stacksize here
$nlmstack = "32768";

# some default settings here in case we failed to find them in README
$nlmvernum = "1,0,0" if (!$nlmvernum);
$nlmverstr = "OpenSSL" if (!$nlmverstr);
$nlmcpystr = "Copyright (c) 1998-now The OpenSSL Project" if (!$nlmcpystr);

# die "OpenSSL copyright: $nlmcpystr\nOpenSSL verstring: $nlmverstr\nOpenSSL vernumber: $nlmvernum\n";

# The import files and other misc imports needed to link
@misc_imports = ("GetProcessSwitchCount", "RunningProcess",
                 "GetSuperHighResolutionTimer");
if ($LIBC)
{
   @import_files = ("libc.imp");
   @module_files = ("libc");
   $libarch = "LIBC";
}
else
{
   # clib build
   @import_files = ("clib.imp");
   push(@import_files, "socklib.imp") if ($BSDSOCK);
   @module_files = ("clib");
   # push(@misc_imports, "_rt_modu64%16", "_rt_divu64%16");
   $libarch = "CLIB";
}
if ($BSDSOCK)
{
   $libarch .= "-BSD";
}
else
{
   $libarch .= "-WS2";
   push(@import_files, "ws2nlm.imp");
}

# The "IMPORTS" environment variable must be set and point to the location
# where import files (*.imp) can be found.
# Example:  set IMPORTS=c:\ndk\nwsdk\imports
$import_path = $ENV{"IMPORTS"} || die ("IMPORTS environment variable not set\n");


# The "PRELUDE" environment variable must be set and point to the location
# and name of the prelude source to link with ( nwpre.obj is recommended ).
# Example: set PRELUDE=c:\codewar\novell support\metrowerks support\libraries\runtime\nwpre.obj
$prelude = $ENV{"PRELUDE"} || die ("PRELUDE environment variable not set\n");

# The "INCLUDES" environment variable must be set and point to the location
# where import files (*.imp) can be found.
$include_path = $ENV{"INCLUDE"} || die ("INCLUDES environment variable not set\n");
$include_path =~ s/\\/\//g;
$include_path = join(" -I", split(/;/, $include_path));

# check for gcc compiler
$gnuc = $ENV{"GNUC"};

#$ssl=   "ssleay32";
#$crypto="libeay32";

if ($gnuc)
{
   # C compiler
   $cc='gcc';
   # Linker
   $link='nlmconv';
   # librarian
   $mklib='ar';
   $o='/';
   # cp command
   $cp='cp -af';
   # rm command
   $rm='rm -f';
   # mv command
   $mv='mv -f';
   # mkdir command
   $mkdir='gmkdir';
   #$ranlib='ranlib';
}
else
{
   # C compiler
   $cc='mwccnlm';
   # Linker
   $link='mwldnlm';
   # librarian
   $mklib='mwldnlm';
   # Path separator
   $o='\\';
   # cp command
   $cp='copy >nul:';
   # rm command
   $rm='del /f /q';
}

# assembler
if ($nw_nasm)
{
   $asm=(`nasm -v 2>NUL` gt `nasmw -v 2>NUL`?"nasm":"nasmw");
   if ($gnuc)
   {
      $asm.=" -s -f elf";
   }
   else
   {
      $asm.=" -s -f coff -d __coff__";
   }
   $afile="-o ";
   $asm.=" -g" if $debug;
}
elsif ($nw_mwasm)
{
   $asm="mwasmnlm -maxerrors 20";
   $afile="-o ";
   $asm.=" -g" if $debug;
}
elsif ($nw_masm)
{
# masm assembly settings - it should be possible to use masm but haven't
# got it working.
# $asm='ml /Cp /coff /c /Cx';
# $asm.=" /Zi" if $debug;
# $afile='/Fo';
   die("Support for masm assembler not yet functional\n");
}
else
{
   $asm="";
   $afile="";
}



if ($gnuc)
{
   # compile flags for GNUC
   # additional flags based upon debug | non-debug
   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";

   # link flags
   $lflags="-T";
}
else
{
   # compile flags for CodeWarrior
   # additional flags based upon debug | non-debug
   if ($debug)
   {
      $cflags="-opt off -g -sym internal -DDEBUG";
   }
   else
   {
   # CodeWarrior compiler has a problem with optimizations for floating
   # points - no optimizations until further investigation
   #      $cflags="-opt all";
   }

   # NOTES: Several c files in the crypto subdirectory include headers from
   #        their local directories.  Metrowerks wouldn't find these h files
   #        without adding individual include directives as compile flags
   #        or modifying the c files.  Instead of adding individual include
   #        paths for each subdirectory a recursive include directive
   #        is used ( -ir crypto ).
   #
   #        A similar issue exists for the engines and apps subdirectories.
   #
   #        Turned off the "possible" warnings ( -w nopossible ).  Metrowerks
   #        complained a lot about various stuff.  May want to turn back
   #        on for further development.
   $cflags.=" -nostdinc -ir crypto -ir ssl -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";

   # link flags
   $lflags="-msgstyle gcc -zerobss -nostdlib -sym internal -commandfile";
}

# common defines
$cflags.=" -DL_ENDIAN -DOPENSSL_SYSNAME_NETWARE -U_WIN32";

# If LibC build add in NKS_LIBC define and set the entry/exit
# routines - The default entry/exit routines are for CLib and don't exist
# in LibC
if ($LIBC)
{
   $cflags.=" -DNETWARE_LIBC";
   $nlmstart = "_LibCPrelude";
   $nlmexit = "_LibCPostlude";
   @nlm_flags = ("pseudopreemption", "flag_on 64");
}
else
{
   $cflags.=" -DNETWARE_CLIB";
   $nlmstart = "_Prelude";
   $nlmexit = "_Stop";
}

# If BSD Socket support is requested, set a define for the compiler
if ($BSDSOCK)
{
   $cflags.=" -DNETWARE_BSDSOCK";
   if (!$LIBC)
   {
      $cflags.=" -DNETDB_USE_INTERNET";
   }
}


# linking stuff
# for the output directories use the mk1mf.pl values with "_nw" appended
if ($shlib)
{
   if ($LIBC)
   {
      $out_def.="_nw_libc_nlm";
      $tmp_def.="_nw_libc_nlm";
      $inc_def.="_nw_libc_nlm";
   }
   else  # NETWARE_CLIB
   {
      $out_def.="_nw_clib_nlm";
      $tmp_def.="_nw_clib_nlm";
      $inc_def.="_nw_clib_nlm";
   }
}
else
{
   if ($gnuc) # GNUC Tools
   {
      $libp=".a";
      $shlibp=".a";
      $lib_flags="-cr";
   }
   else       # CodeWarrior
   {
      $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  # NETWARE_CLIB
   {
      $out_def.="_nw_clib";
      $tmp_def.="_nw_clib";
      $inc_def.="_nw_clib";
   }
}

# used by mk1mf.pl
$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} \$(OBJ_D)${o}sha256-nw${obj} \$(OBJ_D)${o}sha512-nw${obj}";
   $sha1_asm_src="crypto${o}sha${o}asm${o}s1-nw.asm crypto${o}sha${o}asm${o}sha256-nw.asm crypto${o}sha${o}asm${o}sha512-nw.asm";
   $rmd160_asm_obj="\$(OBJ_D)${o}rm-nw${obj}";
   $rmd160_asm_src="crypto${o}ripemd${o}asm${o}rm-nw.asm";
   $whirlpool_asm_obj="\$(OBJ_D)${o}wp-nw${obj}";
   $whirlpool_asm_src="crypto${o}whrlpool${o}asm${o}wp-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 -DWHIRLPOOL_ASM";
   $cflags.=" -DSHA1_ASM -DSHA256_ASM -DSHA512_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='';
   $whirlpool_asm_obj='';
   $whirlpool_asm_src='';
   $cpuid_asm_obj='';
   $cpuid_asm_src='';
}

# create the *.def linker command files in \openssl\netware\ directory
sub do_def_file
{
   # strip off the leading path
   my($target) = bname(shift);
   my($i);

   if ($target =~ /(.*).nlm/)
   {
      $target = $1;
   }

   # special case for openssl - the mk1mf.pl defines E_EXE = openssl
   if ($target =~ /E_EXE/)
   {
      $target =~ s/\$\(E_EXE\)/openssl/;
   }

   # Note: originally tried to use full path ( \openssl\netware\$target.def )
   # Metrowerks linker choked on this with an assertion failure. bug???
   #
   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");

   # special case for openssl
   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";

   # NOTE:  When building the test nlms no screen name is given
   #  which causes the console screen to be used.  By using the console
   #  screen there is no "<press any key to continue>" message which
   #  requires user interaction.  The test script ( do_tests.pl ) needs
   #  to be able to run the tests without requiring user interaction.
   #
   #  However, the sample program "openssl.nlm" is used by the tests and is
   #  a interactive sample so a screen is desired when not be run by the
   #  tests.  To solve the problem, two versions of the program are built:
   #    openssl2 - no screen used by tests
   #    openssl - default screen - use for normal interactive modes
   #

   # special case for openssl - the mk1mf.pl defines E_EXE = openssl
   if ($target =~ /E_EXE/)
   {
      my($target2) = $target;

      $target2 =~ s/\(E_EXE\)/\(E_EXE\)2/;

      # openssl2
      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;
