openssl-windows-crossbuild/compile

203 lines
5.5 KiB
Python
Executable File

#!/usr/bin/env python3
import sys, os
p = os.path.join
pUp = os.path.dirname
s = False
if getattr(sys, 'frozen', False) and hasattr(sys, '_MEIPASS'):
s = os.path.realpath(sys.executable)
else:
s = os.path.realpath(__file__)
sp = pUp(s)
import subprocess, shutil, shlex
# ENVIRONMENT
# All of these can be overridden by setting environment variables starting with ofw_
# So to set mirror, set ofw_mirror
mirror="https://github.com/openssl/openssl"
version="*" # * = newest stable version, 3 = newest stable 3.x.x version, 3.1 = newest stable 3.1.x version, etc...
target="x86" # x86 for 32-bit, x86-64 for 64-bit
config="" # Configuration for ./Configure script
os.environ["PATH"] = p(sp,"bin") + ":" + os.environ["PATH"]
def perr(rtn,cmd = None,op = None):
if rtn == 0: return
if cmd == None: cmd = []
exc = subprocess.CalledProcessError(rtn,cmd,op)
raise exc
def pcall(*args,**kwargs):
rtn = subprocess.Popen(*args,**kwargs).wait()
perr(rtn,args[0])
def pcallStr(*args,**kwargs):
proc = subprocess.Popen(*args,**kwargs, stdout=subprocess.PIPE)
response = proc.stdout.read().decode("utf-8").strip("\n")
rtn = proc.wait()
perr(rtn,args[0])
return response
def git(path,*args,gitwait=True,**kwargs):
cmd = ["git"] + list(args)
if gitwait == True:
pcall(cmd,cwd=path,**kwargs)
else:
return subprocess.Popen(cmd,cwd=path,**kwargs)
def splitAtNumber(st):
nrs = "0123456789"
for nr in nrs:
nst = st.split(nr,1)
if len(nst) > 1:
if nst[1] != "": continue
return [nst[0],int(nr + nst[1])]
return [st,0]
def splitLetterVersion(st):
version = [0,0]
letters = "abcdefghijklmnopqrstuvwxyz"
for letter in letters:
if st[-1] == letter:
version[1] = letters.find(letter) + 1
version[0] = int(st[0])
return version
version[0] = int(st)
return version
def parseTags(tags):
parsedTags = {}
for tag in tags:
tagType = -1
if tag.startswith("OpenSSL_1"): tagType = 1
if tag.startswith("openssl-"): tagType = 3
# major, minor, patch, oldpatch (1.x letter converted to integer), release type, release iteration
versionData = [-1,0,0,0,"stable",0]
try:
if tagType == 1:
version = tag.split("_",1)[-1]
version = version.split("-",1)
if len(version) > 1:
release = splitAtNumber(version[1])
else:
release = ["stable",0]
version = version[0].split("_")
letter = splitLetterVersion(version.pop(2))
version.append(letter[0])
version.append(letter[1])
version[0] = int(version[0])
version[1] = int(version[1])
versionData = version + release
if tagType == 3:
version = tag.split("-",1)[-1]
version = version.split("-")
if len(version) > 1:
release = splitAtNumber(version[1])
else:
release = ["stable",0]
version = version[0].split(".")
version[0] = int(version[0])
version[1] = int(version[1])
version[2] = int(version[2])
version.append(0)
versionData = version + release
except Exception:
pass
if versionData[0] == -1: continue
parsedTags[tag] = versionData
return parsedTags
def main():
global mirror,version,target,config
for e in os.environ:
if e.startswith("ofw_"):
globals()[e.replace("ofw_","",1)] = os.environ[e]
ossl_source = p(sp,"openssl_source")
ossl_source_tmp = ossl_source + ".tmp"
if os.path.isdir(ossl_source_tmp):
shutil.rmtree(ossl_source_tmp)
if version != "*":
version = version.split(".")
length = len(version)
index = 0
while index < length:
version[index] = int(version[index])
index += 1
ossl_target="mingw"
ossl_prefix="i686-w64-mingw32-"
if target == "x86-64":
ossl_target="mingw64"
ossl_prefix="x86_64-w64-mingw32-"
cmd = ["./config",ossl_target,"no-asm","--cross-compile-prefix=" +ossl_prefix,"--prefix=" +p(ossl_source,"usr")]
if config != "": cmd = cmd + shlex.split(config)
print("Config:",cmd)
print("Managing git repo ...")
if os.path.isdir(ossl_source):
git(ossl_source,"checkout","--",".")
git(ossl_source,"clean","-f","-d","-x")
git(ossl_source,"checkout","master")
git(ossl_source,"fetch","--tags")
git(ossl_source,"pull")
else:
git(sp,"clone",mirror,ossl_source_tmp)
os.rename(ossl_source_tmp,p(sp,ossl_source))
gitc = ["tag","-l"]
proc = git(ossl_source,*gitc,gitwait=False,stdout=subprocess.PIPE)
tags = proc.stdout.read().decode("utf-8").strip("\n").split("\n")
perr(proc.wait(),["git"] + gitc)
#for tag in tags:
# print(tag)
ossl_versions = parseTags(tags)
#for tag in ossl_versions:
# print(tag,ossl_versions[tag])
nversion = ["",[0,0,0,0]]
if version == "*":
for ver in ossl_versions:
versionData = ossl_versions[ver]
if versionData[:4] < nversion[1]: continue
if versionData[4] != "stable": continue
nversion[0] = ver
nversion[1] = versionData[:4]
else:
vlength = len(version)
for ver in ossl_versions:
versionData = ossl_versions[ver]
if versionData[:4] < nversion[1]: continue
if versionData[4] != "stable": continue
if versionData[:vlength] > version: continue
if versionData[:vlength] < version: continue
nversion[0] = ver
nversion[1] = versionData[:4]
if nversion[0] == "":
print("Matching version for '" +str(version)+ "' not found")
sys.exit(1)
print("Building OpenSSL " +nversion[0]+ " ...")
try:
git(ossl_source,"branch","-D","ofw-" +nversion[0])
except subprocess.CalledProcessError:
pass
git(ossl_source,"checkout","tags/" +nversion[0],"-b","ofw-" +nversion[0])
pcall(cmd,cwd=ossl_source)
pcall(["make","depend","-j" +pcallStr("nproc")],cwd=ossl_source)
pcall(["make","-j" +pcallStr("nproc")],cwd=ossl_source)
pcall(["make","install_sw"],cwd=ossl_source)
main()