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
【推荐】还在用 ECharts 开发大屏?试试这款永久免费的开源 BI 工具!
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步