Primitive SOURCE_DATE_EPOCH support for reproducible builds (patches 294)
git-svn-id: https://svn.code.sf.net/p/nsis/code/NSIS/trunk@7188 212acab6-be3b-0410-9dea-997c60f758d6
This commit is contained in:
parent
6cd1e7d908
commit
7e2be76681
6 changed files with 95 additions and 24 deletions
|
@ -4,13 +4,13 @@ Import('defenv')
|
|||
|
||||
### imports
|
||||
|
||||
Import('FlagsConfigure GetOptionOrEnv')
|
||||
Import('FlagsConfigure GetOptionOrEnv GetStdSysEnvVarList')
|
||||
|
||||
### HACKS!
|
||||
if GetOptionOrEnv('NSIS_SCONS_GNU_ENVPATHHACK'):
|
||||
import os
|
||||
defenv['ENV']['PATH'] = os.getenv('PATH') # Major hack!
|
||||
import_env = ['SystemDrive', 'SystemRoot', 'TEMP', 'TMP', 'PATHEXT']
|
||||
import_env = GetStdSysEnvVarList(path=True, temp=True)
|
||||
for var in import_env:
|
||||
if var in os.environ:
|
||||
defenv['ENV'][var] = os.environ.get(var, '')
|
||||
|
|
|
@ -290,7 +290,7 @@ def generate(env):
|
|||
targ_arc = env.get('TARGET_ARCH', 'x86')
|
||||
|
||||
if "None" == env.get('MSVC_USE_SCRIPT', '!'):
|
||||
for x in ['INCLUDE', 'LIB', 'PATH', 'CL', 'LINK', 'ML']: env['ENV'][x] = ""
|
||||
for x in ['INCLUDE', 'LIB', 'PATH', 'CL', '_CL_', 'LINK', '_LINK_', 'ML']: env['ENV'][x] = ""
|
||||
if not env.WhereIs('cl', os.environ['PATH']):
|
||||
raise SCons.Errors.InternalError("CL not found in %s" % os.environ['PATH'])
|
||||
include_path = os.environ['INCLUDE']
|
||||
|
@ -312,6 +312,7 @@ def generate(env):
|
|||
env.PrependENVPath('INCLUDE', include_path)
|
||||
env.PrependENVPath('LIB', lib_path)
|
||||
env.PrependENVPath('PATH', exe_path)
|
||||
# 'LIBPATH' = ?
|
||||
|
||||
env['ENV']['CPU'] = (targ_arc.upper(), 'i386')['x86' in targ_arc.lower()] # AMD64/ARM64 or i386
|
||||
env['ENV']['TARGETOS'] = 'BOTH'
|
||||
|
|
|
@ -1,3 +1,31 @@
|
|||
def IsExecutingOnWindows():
|
||||
import sys, os
|
||||
if sys.platform.startswith('win') or os.name == 'nt': return True
|
||||
return False
|
||||
|
||||
def GetWindowsStdSysEnvVarList(path=False, temp=True, user=True, os=True, shell=True, cpu=True):
|
||||
ret = []
|
||||
if os: ret += 'OS WINDIR SYSTEMDRIVE SYSTEMROOT ALLUSERSPROFILE Public ProgramData CommonProgramFiles CommonProgramFiles(x86) CommonProgramW6432 ProgramFiles ProgramFiles(x86) ProgramW6432'.split()
|
||||
if cpu: ret += 'NUMBER_OF_PROCESSORS PROCESSOR_ARCHITECTURE PROCESSOR_ARCHITEW6432 PROCESSOR_IDENTIFIER PROCESSOR_LEVEL PROCESSOR_REVISION'.split()
|
||||
if user: ret += 'COMPUTERNAME USERNAME USERPROFILE APPDATA LOCALAPPDATA HOMEDRIVE HOMESHARE HOMEPATH LOGONSERVER USERDNSDOMAIN USERDOMAIN USERDOMAIN_ROAMINGPROFILE ClientName SessionName'.split()
|
||||
if shell: ret += 'COMSPEC PATHEXT PSModulePath'.split() # PROMPT
|
||||
if temp: ret += 'TEMP TMP'.split()
|
||||
if path: ret += 'PATH'.split()
|
||||
return ret
|
||||
def GetPosixStdSysEnvVarList(path=False, temp=True, user=True, os=True, shell=True, cpu=True):
|
||||
ret = []
|
||||
if os: ret += 'HOSTALIASES'.split()
|
||||
if user: ret += 'HOME USER LOGNAME DATEMSK UID'.split() # XDG_* TZ LANGUAGE LANG LC_* NLSPATH
|
||||
if shell: ret += 'SHELL TERM TERMCAP'.split()
|
||||
if temp: ret += 'TMPDIR'.split()
|
||||
if path: ret += 'PATH MANPATH'.split()
|
||||
return ret
|
||||
def GetStdSysEnvVarList(path=False, temp=True, user=True, os=True, shell=True, cpu=True):
|
||||
func = GetPosixStdSysEnvVarList
|
||||
if IsExecutingOnWindows(): func = GetWindowsStdSysEnvVarList
|
||||
return func(path=path, temp=temp, user=user, os=os, shell=shell, cpu=cpu)
|
||||
|
||||
|
||||
def AddAvailableLibs(env, libs):
|
||||
"""
|
||||
Scans through a list of libraries and adds
|
||||
|
@ -145,10 +173,10 @@ def ReadU32LE(f, fpos=None, defval=None):
|
|||
return FileUnpackRead("<I", 4, f, fpos, defval)
|
||||
def WriteU16LE(f, v, fpos):
|
||||
if not fpos is None: f.seek(fpos)
|
||||
f.write(struct.pack("<H", v))
|
||||
return f.write(struct.pack("<H", v))
|
||||
def WriteU32LE(f, v, fpos):
|
||||
if not fpos is None: f.seek(fpos)
|
||||
f.write(struct.pack("<I", v))
|
||||
return f.write(struct.pack("<I", v))
|
||||
|
||||
class MSPE:
|
||||
def __init__(self, path=None, open_for_write=False):
|
||||
|
@ -177,16 +205,24 @@ class MSPE:
|
|||
self.IsPEP = 0x20b == self.NTOHMagic # IMAGE_NT_OPTIONAL_HDR64_MAGIC?
|
||||
def ReadMachine(self):
|
||||
return ReadU16LE(self._f, self.NTHOffset+4+0)
|
||||
def WriteTimeDateStamp(self, value):
|
||||
return WriteU32LE(self._f, value, self.NTHOffset+4+4)
|
||||
def ReadCharacteristics(self):
|
||||
return ReadU16LE(self._f, self.NTHOffset+4+18)
|
||||
def WriteCharacteristics(self, value):
|
||||
WriteU16LE(self._f, value, self.NTHOffset+4+18)
|
||||
return WriteU16LE(self._f, value, self.NTHOffset+4+18)
|
||||
def ReadDllCharacteristics(self):
|
||||
return ReadU16LE(self._f, self.NTHOffset+4+20+70)
|
||||
def WriteDllCharacteristics(self, value):
|
||||
WriteU16LE(self._f, value, self.NTHOffset+4+20+70)
|
||||
return WriteU16LE(self._f, value, self.NTHOffset+4+20+70)
|
||||
def WriteChecksum(self, value):
|
||||
WriteU32LE(self._f, value, self.NTHOffset+4+20+64)
|
||||
return WriteU32LE(self._f, value, self.NTHOffset+4+20+64)
|
||||
def InvalidateChecksum(self):
|
||||
return self.WriteChecksum(0) and 0
|
||||
|
||||
def IsPE(pe):
|
||||
if not isinstance(pe, MSPE): pe = MSPE(pe)
|
||||
if not pe.NTOHMagic is None: return True
|
||||
|
||||
def IsPEExecutable(pe):
|
||||
if not isinstance(pe, MSPE): pe = MSPE(pe)
|
||||
|
@ -211,8 +247,25 @@ def SetPESecurityFlagsWorker(filepath):
|
|||
ioh_dc |= 0x0040 # +IMAGE_DLLCHARACTERISTICS_DYNAMIC_BASE (ASLR)
|
||||
if pe.IsPEP: ioh_dc |= 0x0020 # +IMAGE_DLLCHARACTERISTICS_HIGH_ENTROPY_VA (HEASLR)
|
||||
pe.WriteDllCharacteristics(ioh_dc)
|
||||
pe.WriteChecksum(0)
|
||||
pe.InvalidateChecksum()
|
||||
finally:
|
||||
return
|
||||
|
||||
Export('AddAvailableLibs AddZLib FlagsConfigure GetAvailableLibs GetOptionOrEnv IsPEExecutable SetPESecurityFlagsWorker')
|
||||
def SetPETimestamp(filepath, timestamp):
|
||||
pe = MSPE(filepath, open_for_write=True)
|
||||
try:
|
||||
if not IsPE(pe): return
|
||||
pe.WriteTimeDateStamp(int(timestamp or 0))
|
||||
pe.InvalidateChecksum()
|
||||
return True
|
||||
finally:
|
||||
return
|
||||
|
||||
def MakeReproducibleAction(target, source, env):
|
||||
if env.get('SOURCE_DATE_EPOCH','') is not '':
|
||||
SetPETimestamp(target[0].path, env['SOURCE_DATE_EPOCH'])
|
||||
|
||||
def SilentActionEcho(target, source, env):
|
||||
return None
|
||||
|
||||
Export('GetStdSysEnvVarList AddAvailableLibs AddZLib FlagsConfigure GetAvailableLibs GetOptionOrEnv SilentActionEcho IsPEExecutable SetPESecurityFlagsWorker MakeReproducibleAction')
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue