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