# 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)
{
   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)
{
# 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 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}";
   $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='';
}

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