From 20333aad70e84d8e70e029ac64a50e97002acf1d Mon Sep 17 00:00:00 2001 From: O01eg Date: Sat, 25 Jan 2020 02:09:41 +0300 Subject: [PATCH 1/9] Start initial Android support --- CMakeLists.txt | 2 +- CROSS-COMPILING.rst | 39 +++++++++++++++++++++++++++++++++++++ cmake/ConfigureChecks.cmake | 12 +++++++++++- cmake/Extensions.cmake | 2 +- cmake/platform.c | 16 +++++++++++++++ cmake/python/CMakeLists.txt | 2 +- 6 files changed, 69 insertions(+), 4 deletions(-) create mode 100644 CROSS-COMPILING.rst diff --git a/CMakeLists.txt b/CMakeLists.txt index 1c752fd3b..3fb33d175 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -738,7 +738,7 @@ if(UNIX) # Makefile set(MAKEFILE_LDSHARED_FLAGS "-shared") - if(APPLE) + if(CMAKE_CXX_COMPILER_ID MATCHES "Clang") set(MAKEFILE_LDSHARED_FLAGS "-dynamiclib -headerpad_max_install_names -undefined dynamic_lookup") endif() configure_file(cmake/makefile-variables.in diff --git a/CROSS-COMPILING.rst b/CROSS-COMPILING.rst new file mode 100644 index 000000000..6365a58df --- /dev/null +++ b/CROSS-COMPILING.rst @@ -0,0 +1,39 @@ +Cross-compiling +=============== + +Android target from Linux host +.............................. + +*This is is under active development. Its content, API and behavior may change at any time. We mean it!* + +To build Python with Android NDK set up emulator, toolchain and ABI (see `Android CMake +Guide `_). + +.. code:: bash + + # Unix + cmake \ + -DCMAKE_INSTALL_PREFIX:PATH=${HOME}/scratch/python-install \ + -DCMAKE_TOOLCHAIN_FILE=${ANDROID_NDK}/build/cmake/android.toolchain.cmake \ + -DANDROID_ABI=armeabi-v7a \ + -DCMAKE_CROSSCOMPILING_EMULATOR=adb-emu.sh \ + -DANDROID_ALLOW_UNDEFINED_SYMBOLS=ON \ + -DENABLE_DECIMAL=OFF \ + -DENABLE_CTYPES=OFF \ + -DANDROID_PLATFORM=21 \ + ../python-cmake-buildsystem + +``adb-emu.sh`` sends executable configuration files and launches them on connected device or launched +emulator. Ensure device or emulator have same architecture you builds python: + +.. code:: bash + + #!/bin/sh + adb push "$1" /data/local/tmp/ 1>/dev/null 2>/dev/null + if [ $# -eq 1 ]; then + adb shell /data/local/tmp/$(basename $1) + elif [ $# -eq 3 ]; then + adb push "$2" /data/local/tmp/ 1>/dev/null 2>/dev/null + adb shell /data/local/tmp/$(basename $1) /data/local/tmp/$(basename $2) /data/local/tmp/$(basename $3) + adb pull /data/local/tmp/$(basename $3) "$3" 1>/dev/null 2>/dev/null + fi diff --git a/cmake/ConfigureChecks.cmake b/cmake/ConfigureChecks.cmake index a57ee8315..1b12a7062 100644 --- a/cmake/ConfigureChecks.cmake +++ b/cmake/ConfigureChecks.cmake @@ -270,7 +270,12 @@ check_include_files(grp.h HAVE_GRP_H) check_include_files(ieeefp.h HAVE_IEEEFP_H) check_include_files(inttypes.h HAVE_INTTYPES_H) # libffi and cpython check_include_files(io.h HAVE_IO_H) -check_include_files(langinfo.h HAVE_LANGINFO_H) +if (${CMAKE_SYSTEM_NAME} MATCHES "^Android") + set(HAVE_LANGINFO_H 0) # Android cann't link functions from langinfo.h +else() + check_include_files(langinfo.h HAVE_LANGINFO_H) +endif() + check_include_files(libintl.h HAVE_LIBINTL_H) check_include_files(libutil.h HAVE_LIBUTIL_H) check_include_files(linux/tipc.h HAVE_LINUX_TIPC_H) @@ -436,6 +441,11 @@ if(CMAKE_SYSTEM MATCHES "VxWorks\\-7$") set(HAVE_LIBUTIL 0) endif() +if(CMAKE_SYSTEM MATCHES "^Android") + set(LIBUTIL_EXPECTED 0) + set(HAVE_LIBUTIL 0) +endif() + if(LIBUTIL_EXPECTED) check_function_exists("openpty" HAVE_BUILTIN_OPENPTY) if(HAVE_BUILTIN_OPENPTY) diff --git a/cmake/Extensions.cmake b/cmake/Extensions.cmake index d9adc80b1..8ea59607b 100644 --- a/cmake/Extensions.cmake +++ b/cmake/Extensions.cmake @@ -196,7 +196,7 @@ function(add_python_extension name) ) endif() - if(APPLE) + if(CMAKE_CXX_COMPILER_ID MATCHES "Clang") set_target_properties(${target_name} PROPERTIES LINK_FLAGS -Wl,-undefined,dynamic_lookup SUFFIX .so diff --git a/cmake/platform.c b/cmake/platform.c index 4c8278967..7530a33e3 100644 --- a/cmake/platform.c +++ b/cmake/platform.c @@ -18,16 +18,28 @@ char *PLATFORM_TRIPLET = #if defined(__linux__) # if defined(__x86_64__) && defined(__LP64__) +# if defined(__ANDROID_NDK__) + "x86_64-linux-android" +# else "x86_64-linux-gnu" +# endif # elif defined(__x86_64__) && defined(__ILP32__) "x86_64-linux-gnux32" # elif defined(__i386__) +# if defined(__ANDROID_NDK__) + "i686-linux-android" +# else "i386-linux-gnu" +# endif # elif defined(__aarch64__) && defined(__AARCH64EL__) # if defined(__ILP32__) "aarch64_ilp32-linux-gnu" # else +# if defined(__ANDROID_NDK__) + "aarch64-linux-android" +# else "aarch64-linux-gnu" +# endif # endif # elif defined(__aarch64__) && defined(__AARCH64EB__) # if defined(__ILP32__) @@ -45,7 +57,11 @@ char *PLATFORM_TRIPLET = # endif # elif defined(__ARM_EABI__) && !defined(__ARM_PCS_VFP) # if defined(__ARMEL__) +# if defined(__ANDROID_NDK__) + "arm-linux-androideabi" +# else "arm-linux-gnueabi" +# endif # else "armeb-linux-gnueabi" # endif diff --git a/cmake/python/CMakeLists.txt b/cmake/python/CMakeLists.txt index 7850be5ae..d6175b4e6 100644 --- a/cmake/python/CMakeLists.txt +++ b/cmake/python/CMakeLists.txt @@ -50,7 +50,7 @@ if(WIN32) ) endif() -if(UNIX AND PY_VERSION VERSION_GREATER "2.7.4") +if(UNIX AND PY_VERSION VERSION_GREATER "2.7.4" AND NOT ${CMAKE_SYSTEM_NAME} MATCHES "^Android") # Setup landmark allowing to run the interpreter from a build tree. See 'getpath.c' for details. set(_sysconfigdata_py "_sysconfigdata.py") if("${PY_VERSION}" VERSION_GREATER_EQUAL "3.6.0") From 579232db8ed7702497261bf3d1d1b769455429fa Mon Sep 17 00:00:00 2001 From: O01eg Date: Sat, 25 Jan 2020 02:28:39 +0300 Subject: [PATCH 2/9] Don't try to call python in Adroid cross-compilation --- cmake/lib/CMakeLists.txt | 32 +++++++++++++++++--------------- 1 file changed, 17 insertions(+), 15 deletions(-) diff --git a/cmake/lib/CMakeLists.txt b/cmake/lib/CMakeLists.txt index 82e8ec89c..d951bc89f 100644 --- a/cmake/lib/CMakeLists.txt +++ b/cmake/lib/CMakeLists.txt @@ -43,20 +43,22 @@ endif() # Generate grammar tables in install directory # XXX Should a custom target be added to generate file at built time ? -install(CODE "find_program( - PYTHON_EXECUTABLE python - HINTS \$ENV{DESTDIR}\${CMAKE_INSTALL_PREFIX}/${BIN_INSTALL_DIR} - NO_DEFAULT_PATH) -set(wrapper) -if(UNIX) - set(_envvar LD_LIBRARY_PATH) - if(APPLE) - set(_envvar DYLD_LIBRARY_PATH) +if(NOT ${CMAKE_SYSTEM_NAME} MATCHES "^Android") + install(CODE "find_program( + PYTHON_EXECUTABLE python + HINTS \$ENV{DESTDIR}\${CMAKE_INSTALL_PREFIX}/${BIN_INSTALL_DIR} + NO_DEFAULT_PATH) + set(wrapper) + if(UNIX) + set(_envvar LD_LIBRARY_PATH) + if(APPLE) + set(_envvar DYLD_LIBRARY_PATH) + endif() + set(wrapper env \${_envvar}=\$ENV{DESTDIR}\${CMAKE_INSTALL_PREFIX}/${LIBPYTHON_LIBDIR}) endif() - set(wrapper env \${_envvar}=\$ENV{DESTDIR}\${CMAKE_INSTALL_PREFIX}/${LIBPYTHON_LIBDIR}) + execute_process(COMMAND \${wrapper} \${PYTHON_EXECUTABLE} -m lib2to3.pgen2.driver + \$ENV{DESTDIR}\${CMAKE_INSTALL_PREFIX}/${PYTHONHOME}/lib2to3/Grammar.txt) + execute_process(COMMAND \${wrapper} \${PYTHON_EXECUTABLE} -m lib2to3.pgen2.driver + \$ENV{DESTDIR}\${CMAKE_INSTALL_PREFIX}/${PYTHONHOME}/lib2to3/PatternGrammar.txt) + ") endif() -execute_process(COMMAND \${wrapper} \${PYTHON_EXECUTABLE} -m lib2to3.pgen2.driver - \$ENV{DESTDIR}\${CMAKE_INSTALL_PREFIX}/${PYTHONHOME}/lib2to3/Grammar.txt) -execute_process(COMMAND \${wrapper} \${PYTHON_EXECUTABLE} -m lib2to3.pgen2.driver - \$ENV{DESTDIR}\${CMAKE_INSTALL_PREFIX}/${PYTHONHOME}/lib2to3/PatternGrammar.txt) -") From 49152b1e5ee8695536dadb7f60d85f60e91384ee Mon Sep 17 00:00:00 2001 From: Victor Paleologue Date: Thu, 9 Apr 2020 18:04:25 +0200 Subject: [PATCH 3/9] Fix disabling the compilation of decimal It was not effective, and it was visible using Android Studio. --- cmake/extensions/CMakeLists.txt | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/cmake/extensions/CMakeLists.txt b/cmake/extensions/CMakeLists.txt index cdc1520bf..638e29164 100644 --- a/cmake/extensions/CMakeLists.txt +++ b/cmake/extensions/CMakeLists.txt @@ -545,7 +545,7 @@ endif() if(ENABLE_DECIMAL) message(STATUS "extension_decimal: libmpdec_config [${libmpdec_config}]") -endif() + add_python_extension(_decimal SOURCES _decimal/_decimal.c @@ -562,6 +562,8 @@ endif() endif() +endif() + # Build expat using the system expat if it's installed, otherwise use the # builtin version. if(EXPAT_LIBRARIES AND EXPAT_INCLUDE_DIRS) From 11bbbe2d57c725094ab12af9e2fece8c02029984 Mon Sep 17 00:00:00 2001 From: Victor Paleologue Date: Thu, 9 Apr 2020 18:06:52 +0200 Subject: [PATCH 4/9] Integrate the script for running executables on Android targets --- CROSS-COMPILING.rst | 18 +++--------------- run_on_android.sh | 9 +++++++++ 2 files changed, 12 insertions(+), 15 deletions(-) create mode 100755 run_on_android.sh diff --git a/CROSS-COMPILING.rst b/CROSS-COMPILING.rst index 6365a58df..4c84b2179 100644 --- a/CROSS-COMPILING.rst +++ b/CROSS-COMPILING.rst @@ -16,24 +16,12 @@ Guide `_). -DCMAKE_INSTALL_PREFIX:PATH=${HOME}/scratch/python-install \ -DCMAKE_TOOLCHAIN_FILE=${ANDROID_NDK}/build/cmake/android.toolchain.cmake \ -DANDROID_ABI=armeabi-v7a \ - -DCMAKE_CROSSCOMPILING_EMULATOR=adb-emu.sh \ + -DCMAKE_CROSSCOMPILING_EMULATOR=../python-cmake-buildsystem/run_on_android.sh \ -DANDROID_ALLOW_UNDEFINED_SYMBOLS=ON \ -DENABLE_DECIMAL=OFF \ -DENABLE_CTYPES=OFF \ -DANDROID_PLATFORM=21 \ ../python-cmake-buildsystem -``adb-emu.sh`` sends executable configuration files and launches them on connected device or launched -emulator. Ensure device or emulator have same architecture you builds python: - -.. code:: bash - - #!/bin/sh - adb push "$1" /data/local/tmp/ 1>/dev/null 2>/dev/null - if [ $# -eq 1 ]; then - adb shell /data/local/tmp/$(basename $1) - elif [ $# -eq 3 ]; then - adb push "$2" /data/local/tmp/ 1>/dev/null 2>/dev/null - adb shell /data/local/tmp/$(basename $1) /data/local/tmp/$(basename $2) /data/local/tmp/$(basename $3) - adb pull /data/local/tmp/$(basename $3) "$3" 1>/dev/null 2>/dev/null - fi +``run_on_android.sh`` sends executable configuration files and launches them on connected device or launched +emulator. Ensure device or emulator have same architecture you builds python. diff --git a/run_on_android.sh b/run_on_android.sh new file mode 100755 index 000000000..d5e849f97 --- /dev/null +++ b/run_on_android.sh @@ -0,0 +1,9 @@ +#!/bin/sh +adb push "$1" /data/local/tmp/ 1>/dev/null 2>/dev/null +if [ $# -eq 1 ]; then + adb shell /data/local/tmp/$(basename $1) +elif [ $# -eq 3 ]; then + adb push "$2" /data/local/tmp/ 1>/dev/null 2>/dev/null + adb shell /data/local/tmp/$(basename $1) /data/local/tmp/$(basename $2) /data/local/tmp/$(basename $3) + adb pull /data/local/tmp/$(basename $3) "$3" 1>/dev/null 2>/dev/null +fi From 31eb5db78b9f1c7133460ba1394e49a23783ba55 Mon Sep 17 00:00:00 2001 From: Victor Paleologue Date: Fri, 17 Apr 2020 18:20:40 +0200 Subject: [PATCH 5/9] Fix floating point endianness checks Translated to CMake from a patch on the Yocto project: http://cgit.openembedded.org/openembedded-core/tree/meta/recipes-devtools/python/python3/0002-Don-t-do-runtime-test-to-get-float-byte-order.patch?h=zeus It avoids the execution of a program on the target device, and produces a clearer endianness result. --- cmake/ConfigureChecks.cmake | 80 ++++++++++++++----------------------- 1 file changed, 29 insertions(+), 51 deletions(-) diff --git a/cmake/ConfigureChecks.cmake b/cmake/ConfigureChecks.cmake index 1b12a7062..38b9a3596 100644 --- a/cmake/ConfigureChecks.cmake +++ b/cmake/ConfigureChecks.cmake @@ -1094,60 +1094,38 @@ endif() # Check for various properties of floating point # ####################################################################### - -# Check whether C doubles are little-endian IEEE 754 binary64 -set(check_src ${PROJECT_BINARY_DIR}/CMakeFiles/ac_cv_little_endian_double.c) -file(WRITE ${check_src} "#include -int main() { - double x = 9006104071832581.0; - if (memcmp(&x, \"\\x05\\x04\\x03\\x02\\x01\\xff\\x3f\\x43\", 8) == 0) - return 0; - else - return 1; -} -") -python_platform_test_run( - DOUBLE_IS_LITTLE_ENDIAN_IEEE754 - "Checking whether C doubles are little-endian IEEE 754 binary64" - ${check_src} - DIRECT - ) - -# Check whether C doubles are big-endian IEEE 754 binary64 set(check_src ${PROJECT_BINARY_DIR}/CMakeFiles/ac_cv_big_endian_double.c) -file(WRITE ${check_src} "#include -int main() { - double x = 9006104071832581.0; - if (memcmp(&x, \"\\x43\\x3f\\xff\\x01\\x02\\x03\\x04\\x05\", 8) == 0) - return 0; - else - return 1; -} +file(WRITE ${check_src} " +double d = 90904234967036810337470478905505011476211692735615632014797120844053488865816695273723469097858056257517020191247487429516932130503560650002327564517570778480236724525140520121371739201496540132640109977779420565776568942592.0; ") -python_platform_test_run( - DOUBLE_IS_BIG_ENDIAN_IEEE754 - "Checking whether C doubles are big-endian IEEE 754 binary64" - ${check_src} - DIRECT - ) -# Check whether C doubles are ARM mixed-endian IEEE 754 binary64 -set(check_src ${PROJECT_BINARY_DIR}/CMakeFiles/ac_cv_mixed_endian_double.c) -file(WRITE ${check_src} "#include -int main() { - double x = 9006104071832581.0; - if (memcmp(&x, \"\\x01\\xff\\x3f\\x43\\x05\\x04\\x03\\x02\", 8) == 0) - return 0; - else - return 1; -} -") -python_platform_test_run( - DOUBLE_IS_ARM_MIXED_ENDIAN_IEEE754 - "Checking doubles are ARM mixed-endian IEEE 754 binary64" - ${check_src} - DIRECT - ) +# TODO: factorize this try_compile statement +try_compile(DOUBLE_BIG_ENDIAN_TEST_COMPILED + ${CMAKE_CURRENT_BINARY_DIR} + ${check_src} + COMPILE_DEFINITIONS ${CMAKE_REQUIRED_DEFINITIONS} + COMPILE_DEFINITIONS ${CMAKE_REQUIRED_DEFINITIONS} + CMAKE_FLAGS -DCOMPILE_DEFINITIONS:STRING=${MACRO_CHECK_FUNCTION_DEFINITIONS} + "${CHECK_C_SOURCE_COMPILES_ADD_LIBRARIES}" + "${CHECK_C_SOURCE_COMPILES_ADD_INCLUDES}" + COPY_FILE ${CMAKE_CURRENT_BINARY_DIR}/double_big_endian.bin) + +if(DOUBLE_BIG_ENDIAN_TEST_COMPILED) + file(READ ${CMAKE_CURRENT_BINARY_DIR}/double_big_endian.bin DOUBLE_BIG_ENDIAN_DATA) + string(FIND ${DOUBLE_BIG_ENDIAN_DATA} "noonsees" NOONSEES) + if(NOONSEES) + set(DOUBLE_IS_BIG_ENDIAN_IEEE754 1) + set(DOUBLE_IS_LITTLE_ENDIAN_IEEE754 0) + else() + string(FIND ${DOUBLE_BIG_ENDIAN_DATA} "seesnoon" SEESNOON) + if(SEESNOON) + set(DOUBLE_IS_BIG_ENDIAN_IEEE754 0) + set(DOUBLE_IS_LITTLE_ENDIAN_IEEE754 1) + else() + message(WARNING "Could not determine if double precision floats endianness") + endif() + endif() +endif() # The short float repr introduced in Python 3.1 requires the # correctly-rounded string <-> double conversion functions from From b661d3478831e90fa755e43307339d724468ce77 Mon Sep 17 00:00:00 2001 From: Victor Paleologue Date: Mon, 20 Apr 2020 11:45:51 +0200 Subject: [PATCH 6/9] On Android, use variables to deduce target platform's triple It avoids the need for checking it by running a program on the target platform. --- cmake/ConfigureChecks.cmake | 21 ++++++++++++++------- 1 file changed, 14 insertions(+), 7 deletions(-) diff --git a/cmake/ConfigureChecks.cmake b/cmake/ConfigureChecks.cmake index 38b9a3596..ec9ff9104 100644 --- a/cmake/ConfigureChecks.cmake +++ b/cmake/ConfigureChecks.cmake @@ -204,11 +204,16 @@ endif() message(STATUS "${_msg} - ${ABIFLAGS}") set(_msg "Checking SOABI") -try_run(PLATFORM_RUN PLATFORM_COMPILE - ${PROJECT_BINARY_DIR} ${PROJECT_SOURCE_DIR}/cmake/platform.c - RUN_OUTPUT_VARIABLE PLATFORM_TRIPLET) -if(NOT PLATFORM_COMPILE) - message(FATAL_ERROR "We could not determine the platform. Please clean the ${CMAKE_PROJECT_NAME} environment and try again...") +set(PLATFORM_TRIPLET ) +if (ANDROID) + set(PLATFORM_TRIPLET "${CMAKE_ANDROID_ARCH_ABI}-linux-android") +else() + try_run(PLATFORM_RUN PLATFORM_COMPILE + ${PROJECT_BINARY_DIR} ${PROJECT_SOURCE_DIR}/cmake/platform.c + RUN_OUTPUT_VARIABLE PLATFORM_TRIPLET) + if(NOT PLATFORM_COMPILE) + message(FATAL_ERROR "We could not determine the platform. Please clean the ${CMAKE_PROJECT_NAME} environment and try again...") + endif() endif() set(SOABI "cpython-${PY_VERSION_MAJOR}${PY_VERSION_MINOR}${ABIFLAGS}-${PLATFORM_TRIPLET}") @@ -1274,8 +1279,9 @@ check_c_source_compiles(" int main() {int a = MAP_ANONYMOUS;}" HAVE_MMAP_ANON) -# libffi specific: Check for /dev/zero support for anonymous memory maps -check_c_source_runs(" +# libffi specific: Check for /dev/zero support as a fallback for anonymous memory maps +if(NOT HAVE_MMAP_ANON) + check_c_source_runs(" #include #include #include @@ -1293,6 +1299,7 @@ int main(void) { } exit(0); }" HAVE_MMAP_DEV_ZERO) +endif() if(IS_PY3) From 3a9d6d50cd59c7e87dc95e97aceca7b1a8c16aa0 Mon Sep 17 00:00:00 2001 From: Victor Paleologue Date: Mon, 20 Apr 2020 13:31:10 +0200 Subject: [PATCH 7/9] Do not regenerate importlib.h and importlib_external.h when cross-compiling They are already present in source releases, so it is possible to ignore the regeneration step. We do that only when cross-compiling, because it is not possible to build for both the host and the target with a single pass of CMake. --- cmake/libpython/CMakeLists.txt | 7 ++++++- 1 file changed, 6 insertions(+), 1 deletion(-) diff --git a/cmake/libpython/CMakeLists.txt b/cmake/libpython/CMakeLists.txt index 40d32f8c5..1ac7beb83 100644 --- a/cmake/libpython/CMakeLists.txt +++ b/cmake/libpython/CMakeLists.txt @@ -455,7 +455,7 @@ if(WIN32 AND IS_PY3) endif() set(LIBPYTHON_FROZEN_SOURCES ) -if(IS_PY3) +if(IS_PY3 AND NOT CMAKE_CROSSCOMPILING) # Build _freeze_importlib executable add_executable(_freeze_importlib @@ -512,6 +512,11 @@ endif() # the frozen sources. add_custom_target(freeze_modules DEPENDS ${LIBPYTHON_FROZEN_SOURCES}) +elseif(IS_PY3 AND CMAKE_CROSSCOMPILING) + +# KLUDGE: suppose importlib.h and importlib_external.h are already present. +add_custom_target(freeze_modules) + endif() if(PY_VERSION VERSION_LESS "3.8") From fbbbd989bbcecbac96d8954d9827635d6361bd9c Mon Sep 17 00:00:00 2001 From: Iyad Ahmed Date: Thu, 26 Jan 2023 22:29:10 +0200 Subject: [PATCH 8/9] Disable looking for libutil on Android --- cmake/ConfigureChecks.cmake | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/cmake/ConfigureChecks.cmake b/cmake/ConfigureChecks.cmake index ec9ff9104..1b30f7728 100644 --- a/cmake/ConfigureChecks.cmake +++ b/cmake/ConfigureChecks.cmake @@ -441,7 +441,7 @@ find_library(HAVE_LIBTERMCAP termcap) set(LIBUTIL_LIBRARIES ) set(LIBUTIL_EXPECTED 1) -if(CMAKE_SYSTEM MATCHES "VxWorks\\-7$") +if((CMAKE_SYSTEM MATCHES "VxWorks\\-7$") OR ANDROID) set(LIBUTIL_EXPECTED 0) set(HAVE_LIBUTIL 0) endif() From 6b3e42d71b9cec34c6b6024c960a15ca3b0f4e48 Mon Sep 17 00:00:00 2001 From: Iyad Ahmed Date: Sat, 28 Jan 2023 23:04:34 +0200 Subject: [PATCH 9/9] Refactor Android related CMake configuration --- CMakeLists.txt | 2 +- cmake/ConfigureChecks.cmake | 7 +------ cmake/Extensions.cmake | 2 +- cmake/lib/CMakeLists.txt | 2 +- cmake/python/CMakeLists.txt | 2 +- 5 files changed, 5 insertions(+), 10 deletions(-) diff --git a/CMakeLists.txt b/CMakeLists.txt index 3fb33d175..c4c650c45 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -738,7 +738,7 @@ if(UNIX) # Makefile set(MAKEFILE_LDSHARED_FLAGS "-shared") - if(CMAKE_CXX_COMPILER_ID MATCHES "Clang") + if(APPLE OR ANDROID) set(MAKEFILE_LDSHARED_FLAGS "-dynamiclib -headerpad_max_install_names -undefined dynamic_lookup") endif() configure_file(cmake/makefile-variables.in diff --git a/cmake/ConfigureChecks.cmake b/cmake/ConfigureChecks.cmake index 1b30f7728..ec1188c48 100644 --- a/cmake/ConfigureChecks.cmake +++ b/cmake/ConfigureChecks.cmake @@ -275,7 +275,7 @@ check_include_files(grp.h HAVE_GRP_H) check_include_files(ieeefp.h HAVE_IEEEFP_H) check_include_files(inttypes.h HAVE_INTTYPES_H) # libffi and cpython check_include_files(io.h HAVE_IO_H) -if (${CMAKE_SYSTEM_NAME} MATCHES "^Android") +if (ANDROID) set(HAVE_LANGINFO_H 0) # Android cann't link functions from langinfo.h else() check_include_files(langinfo.h HAVE_LANGINFO_H) @@ -446,11 +446,6 @@ if((CMAKE_SYSTEM MATCHES "VxWorks\\-7$") OR ANDROID) set(HAVE_LIBUTIL 0) endif() -if(CMAKE_SYSTEM MATCHES "^Android") - set(LIBUTIL_EXPECTED 0) - set(HAVE_LIBUTIL 0) -endif() - if(LIBUTIL_EXPECTED) check_function_exists("openpty" HAVE_BUILTIN_OPENPTY) if(HAVE_BUILTIN_OPENPTY) diff --git a/cmake/Extensions.cmake b/cmake/Extensions.cmake index 8ea59607b..da38004cc 100644 --- a/cmake/Extensions.cmake +++ b/cmake/Extensions.cmake @@ -196,7 +196,7 @@ function(add_python_extension name) ) endif() - if(CMAKE_CXX_COMPILER_ID MATCHES "Clang") + if(APPLE OR ANDROID) set_target_properties(${target_name} PROPERTIES LINK_FLAGS -Wl,-undefined,dynamic_lookup SUFFIX .so diff --git a/cmake/lib/CMakeLists.txt b/cmake/lib/CMakeLists.txt index d951bc89f..871fb98ce 100644 --- a/cmake/lib/CMakeLists.txt +++ b/cmake/lib/CMakeLists.txt @@ -43,7 +43,7 @@ endif() # Generate grammar tables in install directory # XXX Should a custom target be added to generate file at built time ? -if(NOT ${CMAKE_SYSTEM_NAME} MATCHES "^Android") +if(NOT ANDROID) install(CODE "find_program( PYTHON_EXECUTABLE python HINTS \$ENV{DESTDIR}\${CMAKE_INSTALL_PREFIX}/${BIN_INSTALL_DIR} diff --git a/cmake/python/CMakeLists.txt b/cmake/python/CMakeLists.txt index d6175b4e6..0ce370bb0 100644 --- a/cmake/python/CMakeLists.txt +++ b/cmake/python/CMakeLists.txt @@ -50,7 +50,7 @@ if(WIN32) ) endif() -if(UNIX AND PY_VERSION VERSION_GREATER "2.7.4" AND NOT ${CMAKE_SYSTEM_NAME} MATCHES "^Android") +if(UNIX AND PY_VERSION VERSION_GREATER "2.7.4" AND NOT ANDROID) # Setup landmark allowing to run the interpreter from a build tree. See 'getpath.c' for details. set(_sysconfigdata_py "_sysconfigdata.py") if("${PY_VERSION}" VERSION_GREATER_EQUAL "3.6.0")