Skip to content

Commit 560e3ec

Browse files
committed
Updated fsbuild
1 parent b0f3a1e commit 560e3ec

File tree

8 files changed

+316
-185
lines changed

8 files changed

+316
-185
lines changed

fsbuild/.gitignore

+5-1
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,8 @@
11
# fsbuild/.gitignore
22
# This file is automatically generated by fs-package
33

4-
/_*
4+
/_build/
5+
/_dist/
6+
*.pyc
7+
__pycache__/
8+
/_sources/

fsbuild/__init__.py

+239
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,239 @@
1+
# Helper functions for fsbuild
2+
# This file is automatically generated by fs-package
3+
4+
import os
5+
import platform
6+
import subprocess
7+
import sys
8+
import time
9+
from os import path
10+
import xml.etree.ElementTree as ET
11+
from typing import Dict, List, Optional
12+
13+
14+
class PackageInformation:
15+
def __init__(self):
16+
self.values: Dict[str, str] = {}
17+
18+
@property
19+
def bundleId(self) -> str:
20+
return self.values.get(
21+
"PACKAGE_BUNDLE_ID", self.values.get("PACKAGE_MACOS_BUNDLE_ID", "")
22+
)
23+
24+
@property
25+
def displayName(self) -> str:
26+
"""E.g. FS-UAE Launcher."""
27+
return self.values.get("PACKAGE_DISPLAY_NAME", self.prettyName)
28+
29+
@property
30+
def name(self) -> str:
31+
"""E.g. fs-uae-launcher."""
32+
return self.values["PACKAGE_NAME"]
33+
34+
@property
35+
def prettyName(self) -> str:
36+
"""E.g. FS-UAE-Launcher."""
37+
return self.values["PACKAGE_NAME_PRETTY"]
38+
39+
@property
40+
def type(self):
41+
return self.values["PACKAGE_TYPE"]
42+
43+
@property
44+
def version(self):
45+
return self.values["PACKAGE_VERSION"]
46+
47+
48+
_packageInformation: Optional[PackageInformation] = None
49+
50+
51+
def checkNotarizationResult(requestUuid: str):
52+
for _ in range(60):
53+
time.sleep(10.0)
54+
result = run(
55+
[
56+
"xcrun",
57+
"altool",
58+
"--notarization-info",
59+
requestUuid,
60+
"-u",
61+
getNotarizationUserName(),
62+
"-p",
63+
"@env:NOTARIZATION_PASSWORD",
64+
"-itc_provider",
65+
getNotarizationItcProvider(),
66+
"--output-format",
67+
"xml",
68+
]
69+
)
70+
if "<string>success</string>" in result:
71+
break
72+
elif "<string>in progress</string>" in result:
73+
print("in progress...")
74+
continue
75+
else:
76+
print(result)
77+
raise Exception("Unknown notarization result")
78+
else:
79+
raise Exception("Gave up notarization")
80+
81+
82+
def getPackageInformation() -> PackageInformation:
83+
global _packageInformation
84+
if _packageInformation is None:
85+
_packageInformation = PackageInformation()
86+
with open("PACKAGE.FS", "r") as f:
87+
for line in f:
88+
try:
89+
key, value = line.split("=", 1)
90+
key = key.strip()
91+
value = value.strip()
92+
value = value.strip('"')
93+
_packageInformation.values[key] = value
94+
except ValueError:
95+
pass
96+
return _packageInformation
97+
98+
99+
def getAppName() -> str:
100+
return getPackageInformation().displayName + ".app"
101+
102+
103+
def getArchitecture() -> str:
104+
machine = platform.machine()
105+
if machine == "arm64":
106+
arch = "ARM64"
107+
else:
108+
arch = "x86-64" # FIXME
109+
return arch
110+
111+
112+
def getBundleName() -> str:
113+
packageInformation = getPackageInformation()
114+
if packageInformation.type == "fs-library-plugin":
115+
return getFrameworkName()
116+
else:
117+
return getAppName()
118+
119+
120+
def getBundlePath(prefix: str = "fsbuild/_build/") -> str:
121+
prettyName = getPackageInformation().prettyName
122+
bundleName = getBundleName()
123+
arch = getArchitecture()
124+
path = f"{prefix}{prettyName}/macOS/{arch}/{bundleName}"
125+
return path
126+
127+
128+
def getDmgPath() -> str:
129+
packageInformation = getPackageInformation()
130+
prettyName = packageInformation.prettyName
131+
version = packageInformation.version
132+
arch = getArchitecture()
133+
osDist = getOperatingSystemDist()
134+
path = f"fsbuild/_dist/{prettyName}_{version}_{osDist}_{arch}.dmg"
135+
return path
136+
137+
138+
def getFrameworkName() -> str:
139+
return getPackageInformation().prettyName + ".framework"
140+
141+
142+
def getNotarizationItcProvider() -> str:
143+
return os.environ.get("NOTARIZATION_PROVIDER", "")
144+
145+
146+
def getNotarizationUserName() -> str:
147+
return os.environ.get("NOTARIZATION_USERNAME", "")
148+
149+
150+
def getOperatingSystemDist() -> str:
151+
envValue = os.environ.get("SYSTEM_OS_DIST", "")
152+
if envValue:
153+
return envValue
154+
elif sys.platform == "linux":
155+
return "Linux"
156+
elif sys.platform == "darwin":
157+
return "macOS"
158+
elif sys.platform == "win32":
159+
return "Windows"
160+
return "Unknown"
161+
162+
163+
def isMacOS() -> bool:
164+
return sys.platform == "darwin"
165+
166+
167+
def notarizeApp(pathToNotarize: str, bundleId: str) -> str:
168+
assert path.exists(pathToNotarize)
169+
print(f"Notarizing {path.basename(pathToNotarize)}")
170+
171+
result = shell(
172+
"xcrun altool --notarize-app -t osx "
173+
"-f {pathToNotarize} "
174+
"--primary-bundle-id {bundleId} "
175+
"-u {appleIdUser} "
176+
"-p @env:NOTARIZATION_PASSWORD "
177+
"-itc_provider {itcProvider} "
178+
"--output-format xml".format(
179+
appleIdUser=getNotarizationUserName(),
180+
bundleId=bundleId,
181+
itcProvider=getNotarizationItcProvider(),
182+
pathToNotarize=pathToNotarize,
183+
)
184+
)
185+
print(result)
186+
root = ET.fromstring(result)
187+
dictNode = root.find("dict")
188+
assert dictNode is not None
189+
dictNode2 = dictNode.find("dict")
190+
assert dictNode2 is not None
191+
stringNode = dictNode2.find("string")
192+
assert stringNode is not None
193+
requestUuid = stringNode.text
194+
assert requestUuid
195+
print(requestUuid)
196+
return requestUuid
197+
198+
199+
def run(args: List[str]) -> str:
200+
print(quoteArgs(args))
201+
# p = subprocess.Popen(args, stdout = subprocess.PIPE)
202+
# assert p.wait() == 0
203+
# assert p.stdout
204+
# output = p.stdout.read().decode("UTF-8")
205+
# assert p.wait() == 0
206+
# return output
207+
return subprocess.check_output(args).decode("UTF-8")
208+
209+
210+
def runCodeSign(args: List[str]) -> None:
211+
# Signing sometimes fails due to Apple errors (timeouts, etc). So we try
212+
# multiple times before giving up.
213+
for i in range(20):
214+
try:
215+
shell(quoteArgs(args))
216+
except Exception:
217+
time.sleep(1.0 * i)
218+
print("Attempt", i + 2)
219+
else:
220+
break
221+
else:
222+
raise Exception("Giving up signing")
223+
224+
225+
def quoteArg(arg: str) -> str:
226+
if " " in arg:
227+
return f'"{arg}"'
228+
return arg
229+
230+
231+
def quoteArgs(args: List[str]) -> str:
232+
return " ".join(f"{quoteArg(a)}" for a in args)
233+
234+
235+
def shell(cmd: str) -> str:
236+
print(cmd)
237+
return subprocess.run(
238+
cmd, shell=True, check=True, stdout=subprocess.PIPE
239+
).stdout.decode("UTF-8")

fsbuild/archive

+3-2
Original file line numberDiff line numberDiff line change
@@ -10,10 +10,11 @@ if [ $PACKAGE_TYPE = "fs-data-plugin" ]; then
1010
OS=Any
1111
ARCH=Any
1212
else
13-
OS=$SYSTEM_OS
14-
ARCH=$SYSTEM_ARCH
13+
OS=$SYSTEM_OS_DIST
14+
ARCH=$SYSTEM_ARCH_DIST
1515
fi
1616

17+
rm -Rf fsbuild/_dist
1718
mkdir -p fsbuild/_dist
1819

1920
cd fsbuild/_build

0 commit comments

Comments
 (0)