203 lines
5.5 KiB
Python
Executable File
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()
|