#!/usr/local/bin/perl # # unix.pl - the standard unix makefile stuff. # $o='/'; $cp='/bin/cp'; $rm='/bin/rm -f'; # C compiler stuff if ($gcc) { $cc='gcc'; if ($debug) { $cflags="-g2 -ggdb"; } else { $cflags="-O3 -fomit-frame-pointer"; } } else { $cc='cc'; if ($debug) { $cflags="-g"; } else { $cflags="-O"; } } $obj='.o'; $asm_suffix='.s'; $ofile='-o '; # EXE linking stuff $link='${CC}'; $lflags='${CFLAG}'; $efile='-o '; $exep=''; $ex_libs=""; # static library stuff $mklib='ar r'; $mlflags=''; $ranlib=&which("ranlib") or $ranlib="true"; $plib='lib'; $libp=".a"; $shlibp=".a"; $lfile=''; $asm='as'; $afile='-o '; $bn_asm_obj=""; $bn_asm_src=""; $des_enc_obj=""; $des_enc_src=""; $bf_enc_obj=""; $bf_enc_src=""; %perl1 = ( 'md5-x86_64' => 'crypto/md5', 'x86_64-mont' => 'crypto/bn', 'x86_64-mont5' => 'crypto/bn', 'x86_64-gf2m' => 'crypto/bn', 'aes-x86_64' => 'crypto/aes', 'vpaes-x86_64' => 'crypto/aes', 'bsaes-x86_64' => 'crypto/aes', 'aesni-x86_64' => 'crypto/aes', 'aesni-sha1-x86_64' => 'crypto/aes', 'sha1-x86_64' => 'crypto/sha', 'e_padlock-x86_64' => 'engines', 'rc4-x86_64' => 'crypto/rc4', 'rc4-md5-x86_64' => 'crypto/rc4', 'ghash-x86_64' => 'crypto/modes', 'aesni-gcm-x86_64' => 'crypto/modes', 'aesni-sha256-x86_64' => 'crypto/aes', 'rsaz-x86_64' => 'crypto/bn', 'rsaz-avx2' => 'crypto/bn', 'aesni-mb-x86_64' => 'crypto/aes', 'sha1-mb-x86_64' => 'crypto/sha', 'sha256-mb-x86_64' => 'crypto/sha', 'ecp_nistz256-x86_64' => 'crypto/ec', 'wp-x86_64' => 'crypto/whrlpool', 'cmll-x86_64' => 'crypto/camellia', ); # If I were feeling more clever, these could probably be extracted # from makefiles. sub platform_perlasm_compile_target { local($target, $source, $bname) = @_; for $p (keys %perl1) { # FIXME: export CC so rsaz-avx2 can test for it, since BSD make does # not export variables, unlike GNU make. But this also requires fixing # the .s.o rule to use CC! if ($target eq "\$(OBJ_D)/$p.o") { return << "EOF"; \$(TMP_D)/$p.s: $perl1{$p}/asm/$p.pl \$(PERL) $perl1{$p}/asm/$p.pl \$(PERLASM_SCHEME) > \$@ EOF } } if ($target eq '$(OBJ_D)/x86_64cpuid.o') { return << 'EOF'; $(TMP_D)/x86_64cpuid.s: crypto/x86_64cpuid.pl $(PERL) crypto/x86_64cpuid.pl $(PERLASM_SCHEME) > $@ EOF } elsif ($target eq '$(OBJ_D)/sha256-x86_64.o') { return << 'EOF'; $(TMP_D)/sha256-x86_64.s: crypto/sha/asm/sha512-x86_64.pl $(PERL) crypto/sha/asm/sha512-x86_64.pl $(PERLASM_SCHEME) $@ EOF } elsif ($target eq '$(OBJ_D)/sha512-x86_64.o') { return << 'EOF'; $(TMP_D)/sha512-x86_64.s: crypto/sha/asm/sha512-x86_64.pl $(PERL) crypto/sha/asm/sha512-x86_64.pl $(PERLASM_SCHEME) $@ EOF } elsif ($target eq '$(OBJ_D)/sha512-x86_64.o') { return << 'EOF'; $(TMP_D)/sha512-x86_64.s: crypto/sha/asm/sha512-x86_64.pl $(PERL) crypto/sha/asm/sha512-x86_64.pl $(PERLASM_SCHEME) $@ EOF } die $target; } sub special_compile_target { local($target) = @_; if ($target eq 'crypto/bn/x86_64-gcc') { return << "EOF"; \$(TMP_D)/x86_64-gcc.o: crypto/bn/asm/x86_64-gcc.c \$(CC) \$(LIB_CFLAGS) -c -o \$@ crypto/bn/asm/x86_64-gcc.c EOF } return undef; } sub do_lib_rule { local($obj,$target,$name,$shlib)=@_; local($ret,$_,$Name); $target =~ s/\//$o/g if $o ne '/'; $target="$target"; ($Name=$name) =~ tr/a-z/A-Z/; $ret.="$target: \$(${Name}OBJ)\n"; $ret.="\t\$(RM) $target\n"; $ret.="\t\$(MKLIB) $target \$(${Name}OBJ)\n"; $ret.="\t\$(RANLIB) $target\n\n"; } sub do_link_rule { local($target,$files,$dep_libs,$libs)=@_; local($ret,$_); $file =~ s/\//$o/g if $o ne '/'; $n=&bname($target); $ret.="$target: $files $dep_libs\n"; $ret.="\t\$(LINK) ${efile}$target \$(LFLAGS) $files $libs\n\n"; return($ret); } sub which { my ($name)=@_; my $path; foreach $path (split /:/, $ENV{PATH}) { if (-x "$path/$name") { return "$path/$name"; } } } sub do_rehash_rule { my ($target, $deps) = @_; my $ret = <<"EOF"; $target: $deps (OPENSSL="`pwd`/util/opensslwrap.sh"; \\ OPENSSL_DEBUG_MEMORY=on; \\ export OPENSSL OPENSSL_DEBUG_MEMORY; \\ \$(PERL) tools/c_rehash certs/demo; \\ touch $target) EOF return $ret } sub do_test_rule { my ($target, $deps, $test_cmd) = @_; my $ret = <<"EOF"; $target: $deps force.$target TOP=. BIN_D=\$(BIN_D) TEST_D=\$(TEST_D) \\ PERL=\$(PERL) \$(PERL) test/$test_cmd force.$target: EOF return $ret; } 1;