mirror of
https://github.com/kunkundi/crossdesk.git
synced 2026-10-28 00:33:06 +08:00
[build] align mobile Xmake repository selection with desktop
This commit is contained in:
@@ -277,7 +277,7 @@
|
||||
);
|
||||
runOnlyForDeploymentPostprocessing = 0;
|
||||
shellPath = /bin/zsh;
|
||||
shellScript = "set -e\npython3 \"${PROJECT_DIR}/scripts/prepare_source_metadata.py\" --output \"${TARGET_BUILD_DIR}/${UNLOCALIZED_RESOURCES_FOLDER_PATH}/SourceMetadata.json\"\n\"${PROJECT_DIR}/scripts/build_minirtc_ios.sh\"\npython3 \"${PROJECT_DIR}/scripts/verify_native_build.py\" --inputs \"${PROJECT_DIR}/Vendor/${PLATFORM_NAME}/${CONFIGURATION}/libCrossDeskMiniRTC.a.inputs.sha256\" --xmake-version \"${PROJECT_DIR}/Vendor/${PLATFORM_NAME}/${CONFIGURATION}/xmake-version.txt\" --xmake-repository \"$(cat \"${PROJECT_DIR}/Vendor/${PLATFORM_NAME}/${CONFIGURATION}/xmake-repository.txt\")\"\npython3 \"${PROJECT_DIR}/scripts/package_openssl_ios.py\" --inputs \"${PROJECT_DIR}/Vendor/${PLATFORM_NAME}/${CONFIGURATION}/libCrossDeskMiniRTC.a.inputs.sha256\" --output \"${BUILT_PRODUCTS_DIR}/OpenSSL.framework\" --platform \"${PLATFORM_NAME}\"\n";
|
||||
shellScript = "set -e\npython3 \"${PROJECT_DIR}/scripts/prepare_source_metadata.py\" --output \"${TARGET_BUILD_DIR}/${UNLOCALIZED_RESOURCES_FOLDER_PATH}/SourceMetadata.json\"\n\"${PROJECT_DIR}/scripts/build_minirtc_ios.sh\"\npython3 \"${PROJECT_DIR}/scripts/verify_native_build.py\" --inputs \"${PROJECT_DIR}/Vendor/${PLATFORM_NAME}/${CONFIGURATION}/libCrossDeskMiniRTC.a.inputs.sha256\" --xmake-version \"${PROJECT_DIR}/Vendor/${PLATFORM_NAME}/${CONFIGURATION}/xmake-version.txt\"\npython3 \"${PROJECT_DIR}/scripts/package_openssl_ios.py\" --inputs \"${PROJECT_DIR}/Vendor/${PLATFORM_NAME}/${CONFIGURATION}/libCrossDeskMiniRTC.a.inputs.sha256\" --output \"${BUILT_PRODUCTS_DIR}/OpenSSL.framework\" --platform \"${PLATFORM_NAME}\"\n";
|
||||
};
|
||||
/* End PBXShellScriptBuildPhase section */
|
||||
|
||||
|
||||
+11
-16
@@ -72,22 +72,17 @@ tag's numeric version. Use the source tag or commit recorded in the app to
|
||||
identify its exact source.
|
||||
|
||||
Install [Xmake](https://xmake.io/guide/quick-start.html) 3.1.1 or newer,
|
||||
CMake, and a current Python 3 with setuptools/wheel. Pin the package repository
|
||||
in a separate Xmake global directory before building:
|
||||
CMake, and a current Python 3 with setuptools/wheel. Repository selection follows
|
||||
the Windows/macOS/Linux desktop build: Xmake uses its default package repository,
|
||||
or an explicit `XMAKE_GLOBALDIR` / `XMAKE_MAIN_REPO` supplied by the caller.
|
||||
No repository commit is pinned, checked out, or required to have a clean worktree.
|
||||
You can build directly from Xcode without preparing a separate recipe checkout.
|
||||
|
||||
```sh
|
||||
export XMAKE_GLOBALDIR="$HOME/.cache/crossdesk/xmake-ios"
|
||||
xmake repo --update
|
||||
git -C "$XMAKE_GLOBALDIR/.xmake/repositories/xmake-repo" fetch origin 121109352da272cd1a3d4ed52f2dcda34f839955
|
||||
git -C "$XMAKE_GLOBALDIR/.xmake/repositories/xmake-repo" checkout --detach 121109352da272cd1a3d4ed52f2dcda34f839955
|
||||
```
|
||||
|
||||
Keep `XMAKE_GLOBALDIR` set for command-line Xcode builds. For builds launched
|
||||
from the Xcode app, set it as a user-defined build setting on the target, or
|
||||
pin the default `~/.xmake/repositories/xmake-repo` instead. The build checks
|
||||
the minimum Xmake version, package repository commit and reviewed recipe hashes.
|
||||
Application dependencies are built from source, with Xmake precompiled
|
||||
package downloads disabled.
|
||||
Installed iOS packages and device/simulator build products still have separate
|
||||
caches to avoid mixing target architectures and deployment settings. The build
|
||||
retains the minimum Xmake version check, Xmake's source-download verification,
|
||||
and native archive input checks. Application dependencies are built from source,
|
||||
with Xmake precompiled package downloads disabled.
|
||||
|
||||
1. Open `apps/ios/CrossDeskMobile.xcodeproj` and select the `CrossDeskMobile`
|
||||
target and scheme.
|
||||
@@ -391,7 +386,7 @@ the resource when the notices need to change; regeneration does not select a
|
||||
new dependency version.
|
||||
|
||||
`scripts/verify_native_build.py` independently checks the native archive input
|
||||
hashes and pinned Xmake toolchain after compilation. These checks do not read
|
||||
hashes and the minimum supported Xmake version after compilation. These checks do not read
|
||||
the license catalog. Downloaded source archives retain their SHA-256 checks
|
||||
when manually regenerating notices.
|
||||
|
||||
|
||||
@@ -67,10 +67,15 @@ fi
|
||||
XMAKE_DEVELOPER_DIR="${DEVELOPER_DIR:-$(xcode-select -p)}"
|
||||
XMAKE_TOOLCHAIN_BIN="${XMAKE_DEVELOPER_DIR}/Toolchains/XcodeDefault.xctoolchain/usr/bin"
|
||||
run_xmake() {
|
||||
# Match desktop repository selection: use Xmake defaults unless explicitly
|
||||
# overridden by the caller. Only compiled iOS packages use a separate cache.
|
||||
local xmake_env=()
|
||||
if [[ -n "${XMAKE_GLOBALDIR:-}" ]]; then
|
||||
xmake_env+=("XMAKE_GLOBALDIR=${XMAKE_GLOBALDIR}")
|
||||
fi
|
||||
if [[ -n "${XMAKE_MAIN_REPO:-}" ]]; then
|
||||
xmake_env+=("XMAKE_MAIN_REPO=${XMAKE_MAIN_REPO}")
|
||||
fi
|
||||
/usr/bin/env -i \
|
||||
HOME="${HOME}" \
|
||||
PATH="${XMAKE_TOOLCHAIN_BIN}:${PATH}" \
|
||||
@@ -89,10 +94,10 @@ run_xmake() {
|
||||
|
||||
OUTPUT_DIR="${IOS_DIR}/Vendor/${SDK_NAME}/${CONFIG_NAME}"
|
||||
OUTPUT_LIBRARY="${OUTPUT_DIR}/libCrossDeskMiniRTC.a"
|
||||
XMAKE_REPOSITORY_DIR="$(run_xmake lua -c 'import("core.base.global"); print(path.join(global.directory(), "repositories", "xmake-repo"))')"
|
||||
mkdir -p "${OUTPUT_DIR}"
|
||||
print -r -- "${XMAKE_REPOSITORY_DIR}" > "${OUTPUT_DIR}/xmake-repository.txt"
|
||||
run_xmake --version > "${OUTPUT_DIR}/xmake-version.txt"
|
||||
python3 -B "${SCRIPT_DIR}/verify_native_build.py" \
|
||||
--xmake-version "${OUTPUT_DIR}/xmake-version.txt"
|
||||
MINIRTC_BUILD_DIR="${IOS_DIR}/.xmake/minirtc-build${CACHE_SUFFIX}"
|
||||
MINIRTC_LIBRARY="${MINIRTC_BUILD_DIR}/iphoneos/arm64/${MODE}/libminirtc.a"
|
||||
WIRE_BUILD_DIR="${IOS_DIR}/.xmake/wire-build${CACHE_SUFFIX}"
|
||||
@@ -109,7 +114,7 @@ fi
|
||||
# Still configure on every invocation: Xmake must see manifest edits and restore
|
||||
# the iOS configuration if MiniRTC was built standalone for another platform.
|
||||
CONFIG_SIGNATURE="$(print -r -- "${XMAKE_BIN}" "${XMAKE_DEVELOPER_DIR}" \
|
||||
"${MODE}" "${ARCH_NAME}" "${SDK_NAME}" "${APPLE_DEVICE}" "16.0" "${XMAKE_PKG_INSTALLDIR}" "${MINIRTC_ENABLE_AOM}"
|
||||
"${MODE}" "${ARCH_NAME}" "${SDK_NAME}" "${APPLE_DEVICE}" "16.0" "${XMAKE_PKG_INSTALLDIR}" "${MINIRTC_ENABLE_AOM}" "${XMAKE_GLOBALDIR:-}" "${XMAKE_MAIN_REPO:-}"
|
||||
run_xmake --version | sed -n '1p'
|
||||
DEVELOPER_DIR="${XMAKE_DEVELOPER_DIR}" xcodebuild -version
|
||||
DEVELOPER_DIR="${XMAKE_DEVELOPER_DIR}" xcrun --sdk "${SDK_NAME}" --show-sdk-path
|
||||
|
||||
@@ -5,28 +5,16 @@ import argparse
|
||||
import hashlib
|
||||
from pathlib import Path
|
||||
import re
|
||||
import subprocess
|
||||
import sys
|
||||
|
||||
XMAKE_MIN_VERSION = "3.1.1"
|
||||
XMAKE_REPOSITORY_REVISION = "121109352da272cd1a3d4ed52f2dcda34f839955"
|
||||
|
||||
|
||||
def verify(inputs=None, xmake_repository=None, xmake_version=None):
|
||||
def verify(inputs=None, xmake_version=None):
|
||||
if xmake_version is not None:
|
||||
version = re.search(r"xmake v(\d+)\.(\d+)\.(\d+)(?:\+|[,\s]|$)", xmake_version.read_text())
|
||||
if not version or tuple(map(int, version.groups())) < tuple(map(int, XMAKE_MIN_VERSION.split("."))):
|
||||
raise ValueError(f"Xmake {XMAKE_MIN_VERSION} or newer is required; see apps/ios/README.md")
|
||||
if xmake_repository is not None:
|
||||
revision = subprocess.check_output(
|
||||
["git", "-C", str(xmake_repository), "rev-parse", "HEAD"], text=True).strip()
|
||||
if revision != XMAKE_REPOSITORY_REVISION:
|
||||
raise ValueError("Xmake package repository differs from the pinned iOS toolchain")
|
||||
changes = subprocess.check_output(
|
||||
["git", "-C", str(xmake_repository), "status", "--porcelain", "--untracked-files=normal"],
|
||||
text=True).strip()
|
||||
if changes:
|
||||
raise ValueError("Xmake package repository has local changes; use the unmodified pinned revision")
|
||||
if inputs is not None:
|
||||
for line in inputs.read_text().splitlines():
|
||||
sha, name = line.split(maxsplit=1)
|
||||
@@ -37,18 +25,17 @@ def verify(inputs=None, xmake_repository=None, xmake_version=None):
|
||||
def main():
|
||||
parser = argparse.ArgumentParser(description=__doc__)
|
||||
parser.add_argument("--inputs", type=Path, help="native archive .inputs.sha256 manifest")
|
||||
parser.add_argument("--xmake-repository", type=Path, help="active pinned Xmake package repository")
|
||||
parser.add_argument("--xmake-version", type=Path, help="Xmake version output recorded by the native build")
|
||||
args = parser.parse_args()
|
||||
if not any((args.inputs, args.xmake_repository, args.xmake_version)):
|
||||
parser.error("provide --inputs, --xmake-repository or --xmake-version")
|
||||
verify(args.inputs, args.xmake_repository, args.xmake_version)
|
||||
if not any((args.inputs, args.xmake_version)):
|
||||
parser.error("provide --inputs or --xmake-version")
|
||||
verify(args.inputs, args.xmake_version)
|
||||
print("Verified iOS native build inputs and toolchain")
|
||||
|
||||
|
||||
if __name__ == "__main__":
|
||||
try:
|
||||
main()
|
||||
except (OSError, ValueError, subprocess.CalledProcessError) as error:
|
||||
except (OSError, ValueError) as error:
|
||||
print(f"iOS native build: {error}", file=sys.stderr)
|
||||
sys.exit(1)
|
||||
|
||||
@@ -22,6 +22,9 @@ class NativeBuildTest(unittest.TestCase):
|
||||
source = Path(__file__).resolve().parents[1] / "scripts/build_minirtc_ios.sh"
|
||||
self.script = scripts / source.name
|
||||
shutil.copy2(source, self.script)
|
||||
# This fixture exercises archive/configuration behavior with fake Xmake.
|
||||
# Keep the version-check dependency inside the same temporary sandbox.
|
||||
(scripts / "verify_native_build.py").write_text("# Toolchain validation is outside this fixture's scope.\n")
|
||||
(self.root / "xmake.lua").write_text('-- fixture\n')
|
||||
(self.root / "deps/submodules/minirtc").mkdir(parents=True)
|
||||
self.bin = self.root / "bin"
|
||||
|
||||
Reference in New Issue
Block a user