You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
182 lines
6.1 KiB
182 lines
6.1 KiB
#!/bin/echo "This module must be imported by other Python scripts." |
|
|
|
import argparse, configparser, os, platform, re, sys |
|
|
|
import Detail.Utility as utility |
|
|
|
assert sys.version_info >= ( 3, 8 ) |
|
|
|
class Configuration(): |
|
|
|
upstreamURL = "" |
|
toplevelPath = "" |
|
binariesPath = "" |
|
toolsPath = "" |
|
|
|
libQtPath = "" |
|
openSSLPath = "" |
|
vcvarsallPath = "" |
|
cmakeGenerator = "" |
|
linuxdeployURL = "" |
|
|
|
platformVersion = "" |
|
|
|
productName = "Synergy" |
|
productVersion = "unknown-version" |
|
productStage = "snapshot" |
|
productRevision = "0" |
|
productPackageName = "-".join( [ productName, productVersion, productStage ] ).lower() |
|
productRepoPath = "" |
|
productBuildPath = "" |
|
productCheckout = "" |
|
|
|
# Constructor |
|
|
|
def __init__( self, configPath ): |
|
|
|
def programOptions( self ): |
|
|
|
parser = argparse.ArgumentParser( description = |
|
"This utility builds the Synergy-Core binaries. The product version is extracted from the most recent Git tag. One can also build older versions " |
|
"by checking out specific git tags, see options below." ) |
|
|
|
parser.add_argument( "--checkout", dest = "productCheckout", help = "Checkout and build a specific Git tag (or commit hash) for the Synergy-Core submodule." ) |
|
|
|
for key, value in vars( parser.parse_args() ).items(): |
|
setattr( self, key, value ) |
|
|
|
def loadConfiguration( self, configPath ): |
|
|
|
utility.printItem( "configPath: ", configPath ) |
|
|
|
parser = configparser.ConfigParser( |
|
dict_type = dict, |
|
allow_no_value = True, |
|
default_section = "All" ) |
|
|
|
parser.read( configPath ) |
|
|
|
section = platform.system() |
|
|
|
for name in self.propertyList(): |
|
value = parser.get( section, name, fallback = getattr( self, name ) ) |
|
setattr( self, name, value ) |
|
|
|
def validateToplevelPath( self ): |
|
|
|
queriedURL = utility.captureCommandOutput( "git config --get remote.origin.url" ) |
|
|
|
self.toplevelPath = utility.captureCommandOutput( "git rev-parse --show-toplevel" ) |
|
|
|
utility.printItem( "toplevelPath: ", self.toplevelPath ) |
|
utility.printItem( "upstreamURL: ", self.upstreamURL ) |
|
utility.printItem( "queriedURL: ", queriedURL ) |
|
|
|
if not os.path.exists( self.toplevelPath ): |
|
utility.printError( "Git top level path does not exist:\n\t", self.toplevelPath ) |
|
raise SystemExit( 1 ) |
|
|
|
if queriedURL != self.upstreamURL: |
|
utility.printError( "The upstream URL at the current working directory does not match project upstream URL:\n\t", queriedURL ) |
|
raise SystemExit( 1 ) |
|
|
|
def validateConfigurationPaths( self ): |
|
|
|
def resolvePath( self, name, mustExist = True ): |
|
|
|
path = getattr( self, name ) |
|
if not path: return |
|
|
|
path = utility.joinPath( self.toplevelPath, os.path.expanduser( path ) ) |
|
|
|
utility.printItem( name + ": ", path ) |
|
|
|
if not os.path.exists( path ) and mustExist: |
|
utility.printError( "Required path does not exist:\n\t", path ) |
|
raise SystemExit( 1 ) |
|
|
|
setattr( self, name, path ) |
|
|
|
resolvePath( self, "productRepoPath" ) |
|
resolvePath( self, "productBuildPath", mustExist = False ) |
|
resolvePath( self, "binariesPath" ) |
|
resolvePath( self, "toolsPath" ) |
|
resolvePath( self, "libQtPath" ) |
|
resolvePath( self, "openSSLPath" ) |
|
resolvePath( self, "vcvarsallPath" ) |
|
|
|
def configurePlatformVersion( self ): |
|
|
|
if platform.system() == "Windows": |
|
|
|
self.platformVersion = "-".join( [ platform.system(), platform.release(), platform.machine() ] ) |
|
|
|
else: |
|
|
|
import distro # TODO: Move this to global scope when distro supports Windows |
|
platformInfo = list( distro.linux_distribution( full_distribution_name = False ) ) |
|
|
|
while "" in platformInfo: |
|
platformInfo.remove( "" ) |
|
|
|
platformInfo.append( platform.machine() ) |
|
self.platformVersion = "-".join( platformInfo ) |
|
|
|
utility.printItem( "platformVersion: ", self.platformVersion ) |
|
|
|
def configureProductVersion( self ): |
|
|
|
self.updateProductVersion() |
|
|
|
programOptions( self ) |
|
|
|
utility.printHeading( "Loading configuration..." ) |
|
|
|
loadConfiguration( self, configPath ) |
|
|
|
utility.printHeading( "Git configuration..." ) |
|
|
|
validateToplevelPath( self ) |
|
|
|
utility.printHeading( "Path configuration..." ) |
|
|
|
validateConfigurationPaths( self ) |
|
|
|
utility.printHeading( "Version configuration..." ) |
|
|
|
configurePlatformVersion( self ) |
|
configureProductVersion( self ) |
|
|
|
def updateProductVersion( self ): |
|
|
|
os.chdir( self.productRepoPath ) |
|
|
|
lastTag = utility.captureCommandOutput( "git describe --tags --abbrev=0" ) |
|
|
|
utility.printItem( "lastTag: ", lastTag ) |
|
|
|
matches = re.search( "v?(\d+(?:\.\d+)+)(?:-(\w+))?", lastTag ) |
|
|
|
if not matches: |
|
utility.printError( "Unable to extract version information from Git tags." ) |
|
raise SystemExit( 1 ) |
|
|
|
self.productVersion = matches.group( 1 ) |
|
self.productRevision = utility.captureCommandOutput( "git rev-parse --short=8 HEAD" ) |
|
self.productStage = matches.group( 2 ) if matches.group( 2 ) else self.productRevision |
|
self.productPackageName = "-".join( [ self.productName, self.productVersion, self.productStage, self.platformVersion ] ).lower() |
|
|
|
utility.printItem( "productVersion: ", self.productVersion ) |
|
utility.printItem( "productStage: ", self.productStage ) |
|
utility.printItem( "productRevision: ", self.productRevision ) |
|
utility.printItem( "productPackageName: ", self.productPackageName ) |
|
|
|
os.chdir( self.toplevelPath ) |
|
|
|
# Property list |
|
|
|
def propertyList( self ): |
|
|
|
return dict( ( name, getattr( self, name ) ) for name in dir( self ) if not callable( getattr( self, name ) ) and not name.startswith( '__' ) ) |
|
|
|
config = Configuration( utility.joinPath( utility.basePathAtSource( __file__ ), "..", "config.txt" ) )
|
|
|