Windows编译OpenSSL.0.9.8g

环境:

  Windows平台:win10_x64家庭中文版,VS2015/VS2017/VS2019旗舰版

开始:

一、安装工具

  1. 安装ActivePerl

  2. 安装nasm

  验证安装是否安装成功:

  perl -version

   nasm -v

二、下载源码

  1. openssl-OpenSSL_0_9_8g.tar.gz          解压得到openssl-OpenSSL_0_9_8g目录

  查看openssl版本:opensslv.h                                           #define OPENSSL_VERSION_TEXT "OpenSSL 0.9.8g 19 Oct 2007"

三、编译脚本

  build_helper.py

#!/usr/bin/python

import os
import sys
import re
import shutil

if sys.version[0] == '3':
    import winreg as reg
else:
    import _winreg as reg

conf_prefix="##################################################"

def CheckCmdLineParameter(argv):
    if len(argv) < 3:
        Usage()
        raise ValueError("input parameter count error,the should be 3,count=%d" % len(argv))
    #Get cmdline parameter
    #platform
    print(conf_prefix)
    platform=argv[0]
    print("#platform=[%s]" % platform)
    #build_type
    print(conf_prefix)
    build_type=argv[1]
    print("#build_type=[%s]" % build_type)
    #source_dir
    print(conf_prefix)
    source_dir=argv[2]
    print("#source_dir=[%s]" % source_dir)
    
    #Check platform
    if platform != "x86" and platform != "x64":
        raise ValueError("platform type error,the should be x86 or x64,platform=%s" % platform)
    #Check build type
    if build_type != "Release" and build_type != "Debug":
        raise ValueError("build_type type error,the should be Release or Debug,build_type=%s" % build_type)
    #Check source dir
    if not os.path.isdir(source_dir):
        raise ValueError("source_dir not exist,source_dir=%s" % source_dir)
        
    return platform, build_type, source_dir

def GetVisualStudioEnvScript(version = None):
    dev = None
    key = reg.OpenKey(reg.HKEY_LOCAL_MACHINE, "SOFTWARE\\Microsoft\\Windows\\CurrentVersion\\App Paths\\devenv.exe")
    try:
        i = 0
        while True:
            name, value, type = reg.EnumValue(key, i)
            dev = value
            i += 1
    except WindowsError:
        pass

    if version is None:
        if dev.find("2019") != -1:
            dev = dev.replace("common7\\ide\\devenv.exe", "VC\\Auxiliary\\Build\\vcvarsall.bat")
        elif dev.find("2017") != -1:
            dev = dev.replace("common7\\ide\\devenv.exe", "VC\\Auxiliary\\Build\\vcvarsall.bat")
        elif dev.find("Microsoft Visual Studio 14.0") != -1:
            dev = dev.replace("common7\\ide\\devenv.exe", "VC\\vcvarsall.bat")
        else:
            raise ValueError("not install Visual Studio")
    else:
        if version.find("2019") != -1 and dev.find("2019") != -1:
            dev = dev.replace("common7\\ide\\devenv.exe", "VC\\Auxiliary\\Build\\vcvarsall.bat")
        elif version.find("2017") != -1 and dev.find("2017") != -1:
            dev = dev.replace("common7\\ide\\devenv.exe", "VC\\Auxiliary\\Build\\vcvarsall.bat")
        elif version.find("2015") != -1 and dev.find("Microsoft Visual Studio 14.0") != -1:
            dev = dev.replace("common7\\ide\\devenv.exe", "VC\\vcvarsall.bat")
        else:
            raise ValueError("not install Visual Studio,version=[%s]" % version)
    print(conf_prefix)
    print("#dev=[%s]" % dev)
    return dev

def Clean(path):
    if os.path.isdir(path):
        shutil.rmtree(path)

def Copy(dest, src, suffix):
    for f in os.listdir(src):
        if f.endswith(suffix):
            shutil.copy(os.path.join(src, f), dest)
    

  build_openssl.py

#!/usr/bin/python

import os
import sys
sys.dont_write_bytecode = True
import build_helper

def Clean(source_dir, platform = None):
    if platform is None:
        build_helper.Clean(os.path.join(sys.argv[2], "x86"))
        build_helper.Clean(os.path.join(sys.argv[2], "tmp_x86"))
        build_helper.Clean(os.path.join(sys.argv[2], "x64"))
        build_helper.Clean(os.path.join(sys.argv[2], "tmp_x64"))
    elif platform == "x86":
        build_helper.Clean(os.path.join(sys.argv[2], "x86"))
        build_helper.Clean(os.path.join(sys.argv[2], "tmp_x86"))
    elif platform == "x64":
        build_helper.Clean(os.path.join(sys.argv[2], "x64"))
        build_helper.Clean(os.path.join(sys.argv[2], "tmp_x64"))

def Build(source_dir, platform, build_type, dev):
    #configure
    configure = "perl Configure VC-WIN32 no-asm no-shared"
    if platform == "x64":
        configure = "perl Configure VC-WIN64A no-asm no-shared"
    #nmake_config 从ms\32all.bat文件中提取
    debug = "debug" if build_type == "Debug" else ""
    nmake_config = "perl util\mk1mf.pl no-asm %s VC-WIN32 >ms/nt.mak" % debug
    if platform == "x64":
        nmake_config = "perl util\mk1mf.pl no-asm %s VC-WIN64A >ms/nt.mak" % debug
    #build
    os.chdir(os.path.abspath(source_dir))
    os.system(configure)
    os.system(nmake_config)
    os.system("call %s %s & \
        nmake -f ms/nt.mak OUT_D=%s TMP_D=tmp_%s LIB_CFLAG=\"/MD /WX- /wd4005 /Zi\" APP_CFLAG=\"/MD /WX- /wd4005 /Zi\" " % (dev, platform, platform, platform))

def Install(source_dir, output_dir):

    if not os.path.isdir(output_dir):
        os.mkdir(output_dir)

    #output_dir/include
    dest = os.path.join(output_dir, "include")
    if not os.path.isdir(dest):
        os.mkdir(dest)
    #output_dir/include/openssl
    dest = os.path.join(output_dir, "include", "openssl")
    if not os.path.isdir(dest):
        os.mkdir(dest)
    source = os.path.join(source_dir, "inc32", "openssl", "*.h")
    os.system("copy /y %s %s" % (source, dest))
    
    #output_dir/lib
    dest = os.path.join(output_dir, "lib")
    if not os.path.isdir(dest):
        os.mkdir(dest)
    #output_dir/lib/x86
    dest = os.path.join(output_dir, "lib", "x86")
    if not os.path.isdir(dest):
        os.mkdir(dest)
    source = os.path.join(source_dir, "x86", "*.lib")
    os.system("copy /y %s %s" % (source, dest))
    #output_dir/lib/x64
    dest = os.path.join(output_dir, "lib", "x64")
    if not os.path.isdir(dest):
        os.mkdir(dest)
    source = os.path.join(source_dir, "x64", "*.lib")
    os.system("copy /y %s %s" % (source, dest))
    
    source = os.path.join(output_dir, "include" ,"openssl", "opensslconf.h")
    dest = os.path.join(output_dir, "include" ,"openssl", "opensslconf_windows.h")
    os.system("move %s %s" % (source, dest))
    dest = os.path.join(output_dir, "include", "openssl", "opensslconf.h")
    os.system("echo #if WIN32 > %s" % dest)
    os.system("echo     #include \"openssl/opensslconf_windows.h\" >> %s" % dest)
    os.system("echo #else >> %s" % dest)
    os.system("echo     #include \"openssl/opensslconf_unix.h\" >> %s" % dest)
    os.system("echo #endif >> %s" % dest)

def main():
    
    if len(sys.argv) < 2:
        Usage()
        return
    
    #Make
    if sys.argv[1] == 'make':
        if len(sys.argv) != 5:
            Usage("make")
            return
        #Get Visual Studio
        try:
            dev = build_helper.GetVisualStudioEnvScript()
        except ValueError as e:
            print(e)
            return
        #CheckCmdLineParameter
        try:
            platform, build_type, source_dir = build_helper.CheckCmdLineParameter(sys.argv[2:])
        except ValueError as e:
            print(e)
            Usage("make")
            return
        #Build
        Build(source_dir, platform, build_type, dev)
    #Install
    elif sys.argv[1] == 'install':
        if len(sys.argv) != 4:
            Usage("install")
            return
        Install(sys.argv[2], sys.argv[3])
    #Clean
    elif sys.argv[1] == 'clean':
        if len(sys.argv) != 3:
            Usage("clean");
            return
        Clean(sys.argv[2], sys.argv[3] if len(sys.argv) > 4 else None)
    else:
        Usage()
    return
    
def Usage(type = None):
    if type is None:
        print("usage:")
        print("    python build_openssl.py make    [x86|x64]    [Release|Debug] [source_dir]")
        print("    python build_openssl.py install [source_dir] [output_dir]")
        print("    python build_openssl.py clean   [source_dir]")
        print("example:")
        print("    python build_openssl.py make   x86 Release openssl-OpenSSL_0_9_8g")
        print("    python build_openssl.py install openssl-OpenSSL_0_9_8g openssl-0.9.8")
        print("    python build_openssl.py clean   openssl-OpenSSL_0_9_8g")
    elif type == "make":
        print("usage:")
        print("    python build_openssl.py make [x86|x64] [Release|Debug] [source_dir]")
        print("example:")
        print("    python build_openssl.py make x86 Release openssl-OpenSSL_0_9_8g")
    elif type == "install":
        print("usage:")
        print("    python build_openssl.py install [source_dir] [output_dir]")
        print("example:")
        print("    python build_openssl.py install openssl-OpenSSL_0_9_8g openssl-0.9.8")
    elif type == "clean":
        print("usage:")
        print("    python build_openssl.py clean [source_dir]")
        print("example:")
        print("    python build_openssl.py clean openssl-OpenSSL_0_9_8g")

def Copy(source, dest):
    if os.path.isdir(source) and os.path.isdir(dest):
        for root, dir, files in os.walk(source):
            for file in files:
                print("copy(%s,%s)" % (os.path.join(root, file), os.path.join(dest, file)))
                #shutil.copyfile(os.path.join(root, file), os.path.join(dest, file))
    elif os.path.isfile(source) and os.path.isfile(dest):
        #shutil.copyfile(source, dest)
        pass
    elif (os.path.isfile(source) and os.path.isdir(dest)):
        #shutil.copyfile(source, os.path.join(dest, os.path.basename(source)))
        pass
    else:
        raise IOError("copy file or dir failed")

if __name__ == '__main__':
    main()
    

四、编译

usage:
    python build_openssl.py make    [x86|x64]    [Release|Debug] [source_dir]
    python build_openssl.py install [source_dir] [output_dir]
    python build_openssl.py clean   [source_dir]
example:
    python build_openssl.py make   x86 Release openssl-OpenSSL_0_9_8g
    python build_openssl.py install openssl-OpenSSL_0_9_8g openssl-0.9.8
    python build_openssl.py clean   openssl-OpenSSL_0_9_8g

 

posted on 2020-07-30 11:01  dchao  阅读(526)  评论(0编辑  收藏  举报

导航