@@ -378,6 +378,53 @@ def test_archflags_envvar_parsing_invalid(package_purelib_and_platlib, monkeypat
378378 os .environ .pop ('_PYTHON_HOST_PLATFORM' , None )
379379
380380
381+ @pytest .mark .parametrize (
382+ ('cpu' , 'cpu_family' ),
383+ [
384+ ('aarch64' , 'aarch64' ),
385+ ('armv7l' , 'arm' ),
386+ ('armv8l' , 'arm' ),
387+ ('i686' , 'x86' ),
388+ ('x86_64' , 'x86_64' ),
389+ ],
390+ )
391+ @pytest .mark .parametrize ('cross' , [True , False ])
392+ def test_android_project (package_simple , monkeypatch , tmp_path , cpu , cpu_family , cross ):
393+ # Mock being on Android
394+ monkeypatch .setattr (sys , 'platform' , 'android' )
395+ monkeypatch .setattr (sys , 'byteorder' , 'little' )
396+ monkeypatch .setattr (platform , 'system' , Mock (return_value = 'Android' ))
397+ monkeypatch .setattr (platform , 'machine' , Mock (return_value = cpu ))
398+ monkeypatch .setattr (sysconfig , 'get_platform' , Mock (return_value = 'android-24' ))
399+ if cross :
400+ monkeypatch .setenv ('CIBUILDWHEEL' , '1' )
401+
402+ # Meson may require some tools to be configured when fatal warnings are enabled.
403+ # Set the same set of variables as cibuildwheel.
404+ for name in ['ar' , 'as' , 'cc' , 'cxx' , 'ld' , 'nm' , 'ranlib' , 'readelf' , 'strip' ]:
405+ monkeypatch .setenv (name .upper (), f'/path/to/{ name } ' )
406+
407+ # Create a project.
408+ project = mesonpy .Project (source_dir = package_simple , build_dir = tmp_path )
409+
410+ # When cross-compiling, a cross file should be generated and used.
411+ setup_args = project ._meson_args ['setup' ]
412+ cross_path = tmp_path / 'meson-python-cross-file.ini'
413+ if cross :
414+ assert setup_args [- 2 :] == ['--cross-file' , str (cross_path )]
415+ cross_config = cross_path .read_text ().splitlines ()
416+ assert "system = 'android'" in cross_config
417+ assert "subsystem = 'android'" in cross_config
418+ assert "kernel = 'linux'" in cross_config
419+ assert f"cpu_family = '{ cpu_family } '" in cross_config
420+ assert f"cpu = '{ cpu } '" in cross_config
421+ assert "endian = 'little'" in cross_config
422+ assert 'needs_exe_wrapper = true' in cross_config
423+ else :
424+ assert '--cross-file' not in setup_args
425+ assert not cross_path .exists ()
426+
427+
381428@pytest .mark .skipif (sys .version_info < (3 , 13 ), reason = 'requires Python 3.13 or higher' )
382429@pytest .mark .parametrize ('multiarch' , [
383430 'arm64-iphoneos' ,
0 commit comments