Status & FAQ상태와 FAQ
What works today, measured against the maintainer's example build file. “Implemented” means a test in this repository exercises it.
지금 되는 것을 메인테이너의 예시 빌드 파일에 대어 본 것입니다. “구현” 은 이 저장소의 테스트가 그것을 실행한다는 뜻입니다.
Feature status기능 상태
| Feature기능 | Status상태 | Evidence근거 |
|---|---|---|
Applying the plugin: python extension and tasks플러그인 적용: python 확장과 태스크 | implemented구현 | PythonPluginApplyTest |
compileSdk parsing: alpha · rc · normalcompileSdk 파싱: alpha · rc · normal | implemented구현 | PythonVersionTest |
| Platform → triple mapping, Kotlin target check, min SDK플랫폼 → 트리플 매핑, Kotlin 타깃 확인, 최소 SDK | implemented구현 | PythonExtensionPlatformDslTest, PlatformTargetMappingTest, PythonPluginPlatformsTest |
debug / release, -Ppython.buildTypedebug / release, -Ppython.buildType | implemented구현 | PythonPluginBuildTypeTest |
| Per-variant task graph변형별 태스크 그래프 | implemented구현 | PythonPluginVariantGraphTest |
compileLevel = instant · bytecode (.venv and compileSdk minor checked); others rejected per variantcompileLevel = instant · bytecode (.venv 와 compileSdk 마이너 버전 확인); 나머지는 변형별 거부 | implemented구현 | PythonPluginBuildLevelTest, BytecodeLevelTest |
srcDirs / metaDirs / libDirssrcDirs / metaDirs / libDirs | implemented구현 | PythonPluginSourceSetTest |
implementation / integration → uv addimplementation / integration → uv add | implemented구현 | PythonPluginDependencyTest, InstallDependenciesTaskTest |
| Bundling via pypackpack's resource bundlerpypackpack 리소스 번들러로 번들링 | implemented구현 | BuildPythonArtifactTaskTest |
packagePython zippackagePython zip | implemented구현 | AssemblePythonPackageTaskTest |
| Staging copy rule and variant selection스테이징 복사 규칙과 변형 선택 | implemented구현 | StagePythonBundleTaskTest, PythonPluginStagingTest |
tcl installtcl install | implemented구현 | CliArgsTest, InstallerTest |
tcl --help, tcl --versiontcl --help, tcl --version | implemented구현 | CliArgsTest |
toolchain-lite on PyPI (uv tool install toolchain-lite)PyPI 의 toolchain-lite (uv tool install toolchain-lite) | partial부분 | CI builds and smoke-tests the wheels; not uploaded yetCI 가 휠을 빌드하고 스모크 테스트함. 아직 업로드 안 됨 |
| Staging into the desktop jar데스크톱 jar 로의 스테이징 | implemented구현 | PythonPluginAttachmentTest |
| Staging into the APKAPK 로의 스테이징 | partial부분 | asset root tested (PythonPluginAttachmentTest); task dependency untested에셋 루트는 테스트됨 (PythonPluginAttachmentTest), 태스크 의존성은 테스트 없음 |
| Hot reload핫 리로드 | partial부분 | Android, adb only; serverHost unusedAndroid, adb 만; serverHost 미사용 |
| Code push코드 푸시 | partial부분 | validation only검증만 |
| Dependencies per source set, installed for each variant's own triple into its bundle소스셋별 의존성을 변형마다 그 트리플용으로 설치해 번들에 포함 | implemented구현 | TargetDependenciesTest, PythonPluginTargetDependenciesTest, InstallTargetDependenciesTaskTest |
integration(): warn when the wheel has no KLIBDEPENSintegration(): 휠에 KLIBDEPENS 가 없으면 경고 | implemented구현 | KlibDepensTest, PythonPluginIntegrationListTest |
native / mixednative / mixed | planned계획 | needs pypackpack#19pypackpack#19 선행 필요 |
iOS: attaching the staged payload (stagePythonBundleIosForXcode prints the path; the Xcode phase is python-multiplatform's, #59)iOS: 스테이징된 페이로드 연결 (stagePythonBundleIosForXcode 가 경로 출력, Xcode 단계는 python-multiplatform #59 소유) | partial부분 | StagePythonBundleIosForXcodeTaskTest, StagePythonPayloadScriptTest |
buildFeatures { metaclass } and excludeMetaclass: metaDirs forwarded or droppedbuildFeatures { metaclass } 와 excludeMetaclass: metaDirs 전달 또는 제외 | implemented구현 | BuildFeaturesTest, PythonPluginBuildFeaturesTest |
buildFeatures { compose }: installs pythonx-compose, adds python-multiplatform-compose to commonMainbuildFeatures { compose }: pythonx-compose 설치, commonMain 에 python-multiplatform-compose 추가 | implemented구현 | BuildFeaturesTest, PythonPluginBuildFeaturesTest; locations from two Gradle propertiesBuildFeaturesTest, PythonPluginBuildFeaturesTest; 위치는 Gradle 속성 두 개로 지정 |
embedLevel: 0/1/2 resolved per platform (Android and iOS raise to 2 with a warning), -Ppython.embedLevel override, recorded in embed.json with the expected interpreter version; level 2 means python-multiplatform embeds the interpreter, and the bundle stays python/ onlyembedLevel: 플랫폼별 0/1/2 결정 (Android, iOS 는 경고와 함께 2 로 상향), -Ppython.embedLevel 재정의, 기대 인터프리터 버전과 함께 embed.json 에 기록; 레벨 2 는 python-multiplatform 이 인터프리터를 내장한다는 뜻이고, 번들은 python/ 만 담음 | implemented구현 | EmbedLevelTest, PythonPluginEmbedLevelTest, PythonPluginPythonOnlyTest |
useCodeMinifieruseCodeMinifier | planned계획 | declared, unread선언만, 읽히지 않음 |
defaultConfig { pip }: central · local · autoUpdatedefaultConfig { pip }: central · local · autoUpdate | implemented구현 | PipRepositoriesTest |
pip { jit }pip { jit } | planned계획 | - |
compileSdk constants (PY3_14_7); unprovided versions refused per taskcompileSdk 상수(PY3_14_7); 제공되지 않는 버전은 태스크에서 거부 | implemented구현 | PythonSdkTest, BuildPythonSdkRejectionTest |
projectFlavors in the variant graph; -Ppython.flavor변형 그래프의 projectFlavors; -Ppython.flavor | implemented구현 | PythonPluginFlavorsTest |
defaultConfig { versionCode, versionName } → bundle manifestdefaultConfig { versionCode, versionName } → 번들 manifest | implemented구현 | PythonPluginPayloadVersionTest, BuildPythonArtifactTaskTest |
toolchain ships only python/: compileSdk selects the wheels' Python version and fetches no interpreter; the interpreter and stdlib come from python-multiplatformtoolchain 은 python/ 만 실음: compileSdk 는 wheel 의 Python 버전을 고를 뿐 인터프리터를 받지 않음; 인터프리터와 stdlib 는 python-multiplatform 이 제공 | implemented구현 | PythonPluginTargetDependenciesTest, PythonPluginPythonOnlyTest |
compileSdk checked against python-multiplatform's pythonVersion at level 2 (a mismatch fails only that variant's buildPython…); read from -Ppython.multiplatform.pythonVersion, the :python-multiplatform project's extension, or the published dependency's metadata or jar레벨 2 에서 compileSdk 를 python-multiplatform 의 pythonVersion 과 대조 (다르면 그 변형의 buildPython… 만 실패); -Ppython.multiplatform.pythonVersion, :python-multiplatform 프로젝트의 확장, 또는 배포된 의존의 메타데이터나 jar 에서 읽음 | implemented구현 | PythonVersionAgreementTest, PythonPluginPythonOnlyTest, PublishedPythonVersionTest |
FAQ자주 묻는 질문
Why does my compileLevel = "bytecode" fail?왜 compileLevel = "bytecode" 가 실패하나요?
It needs a Python to compile with: a .venv at or above the package directory, whose minor version matches compileSdk. If there is none, or the versions differ, that variant's task fails and its message names the directory and the fix. native and mixed fail the same way until pypackpack's compile slot (pypackpack#19) exists.
컴파일할 Python 이 필요합니다. 패키지 디렉터리나 그 위에 있는 .venv 이고, 그 마이너 버전이 compileSdk 와 같아야 합니다. 없거나 버전이 다르면 그 변형의 태스크가 실패하고, 메시지에 디렉터리와 해결 방법이 나옵니다. native 와 mixed 는 pypackpack 의 컴파일 슬롯(pypackpack#19)이 생길 때까지 같은 방식으로 실패합니다.
Why does androidArm32() not compile?왜 androidArm32() 가 컴파일되지 않나요?
Android support follows CPython's official Android support (PEP 738): aarch64-linux-android and x86_64-linux-android. The example build file lists 32-bit and x86 variants because it was written before that was settled.
안드로이드 지원은 CPython 공식 안드로이드 지원(PEP 738)인 aarch64-linux-android 와 x86_64-linux-android 를 따릅니다. 예시 빌드 파일에 32비트와 x86 변형이 있는 것은 그 결정 전에 쓰였기 때문입니다.
Does hot reload work on iOS or desktop?핫 리로드가 iOS 나 데스크톱에서 되나요?
Not yet. hotReloadPython pushes .py files with adb and sends the org.thisisthepy.python.RELOAD_PYTHON broadcast; reloading the modules is the runtime's job.
아직입니다. hotReloadPython 은 adb 로 .py 파일을 밀어 넣고 org.thisisthepy.python.RELOAD_PYTHON 브로드캐스트를 보냅니다. 모듈을 다시 불러오는 것은 런타임의 일입니다.
Is the DSL final?DSL 은 확정인가요?
The example build file is the contract, and the plugin is being brought to it. Platforms already follow it: they are declared directly inside python { }. What still differs is listed on this page and in the specification.
예시 빌드 파일이 계약이고, 플러그인을 그쪽에 맞추는 중입니다. 플랫폼은 이미 맞췄습니다. python { } 바로 안에 선언합니다. 아직 다른 부분은 이 페이지와 스펙에 적혀 있습니다.
Contributing기여하기
Changes go intent → spec → test → code. A behaviour change begins as a change to the specification; its test is written first and seen failing; then the code makes it pass. A DSL value is never accepted silently: it is wired to a task, or rejected with a reason.
변경은 의도 → 스펙 → 테스트 → 코드 순서로 갑니다. 동작 변경은 스펙 변경에서 시작하고, 테스트를 먼저 써서 실패를 확인한 뒤, 코드로 통과시킵니다. DSL 값은 조용히 받아들이지 않습니다: 태스크에 연결하거나, 이유와 함께 거부합니다.
./gradlew :toolchain:test --rerun # plugin; needs packpack in Maven Local, uv and network
./gradlew :toolchain:cliTest --rerun # tcl; needs uv and network
python3 docs/guide/check_guide.py # this site
Run each module on its own, and count results from build/test-results/ rather than from the console.
모듈은 따로따로 실행하고, 결과는 콘솔이 아니라 build/test-results/ 에서 세세요.