From d8ea139e83dc74336569d71e6969cae269547265 Mon Sep 17 00:00:00 2001 From: Po Lu Date: Fri, 3 Mar 2023 21:13:58 +0800 Subject: [PATCH] Improve ndk-build implementation * build-aux/ndk-build-helper.mk: Define in terms of BUILD_AUXDIR. * m4/ndk-build.m4 (ndk_INIT): Find right build-aux directory. Remove uses of unportable shell constructs. --- build-aux/ndk-build-helper.mk | 10 +- m4/ndk-build.m4 | 185 +++++++++++++++------------------- 2 files changed, 87 insertions(+), 108 deletions(-) diff --git a/build-aux/ndk-build-helper.mk b/build-aux/ndk-build-helper.mk index fe8a6a5119c..85ddc5c6330 100644 --- a/build-aux/ndk-build-helper.mk +++ b/build-aux/ndk-build-helper.mk @@ -19,7 +19,7 @@ # file and return useful information about its contents. # See the text under ``NDK BUILD SYSTEM IMPLEMENTATION'' in -# INSTALL.android for more details. +# cross/ndk-build/README for more details. # TARGET_ARCH_ABI is the ABI that is being built for. TARGET_ARCH_ABI := $(EMACS_ABI) @@ -60,10 +60,10 @@ import-module = $(eval NDK_IMPORTS += $(1)) # Print out module information every time BUILD_SHARED_LIBRARY is # called. -BUILD_SHARED_LIBRARY=$(EMACS_SRCDIR)/build-aux/ndk-build-helper-1.mk -BUILD_STATIC_LIBRARY=$(EMACS_SRCDIR)/build-aux/ndk-build-helper-2.mk -BUILD_EXECUTABLE=$(EMACS_SRCDIR)/build-aux/ndk-build-helper-3.mk -CLEAR_VARS=$(EMACS_SRCDIR)/build-aux/ndk-build-helper-4.mk +BUILD_SHARED_LIBRARY=$(BUILD_AUXDIR)ndk-build-helper-1.mk +BUILD_STATIC_LIBRARY=$(BUILD_AUXDIR)ndk-build-helper-2.mk +BUILD_EXECUTABLE=$(BUILD_AUXDIR)ndk-build-helper-3.mk +CLEAR_VARS=$(BUILD_AUXDIR)ndk-build-helper-4.mk # Now include Android.mk. diff --git a/m4/ndk-build.m4 b/m4/ndk-build.m4 index 7b5c45997b1..8fe84cee40e 100644 --- a/m4/ndk-build.m4 +++ b/m4/ndk-build.m4 @@ -44,6 +44,8 @@ for file in $with_ndk_path; do fi done +AC_REQUIRE_AUX_FILE([ndk-build-helper.mk]) +ndk_AUX_DIR=$ac_aux_dir ndk_ABI=$1 ndk_MODULES= ndk_MAKEFILES= @@ -53,29 +55,14 @@ ndk_DIR=$3 ndk_ANY_CXX= ndk_BUILD_CFLAGS="$4" -case "$ndk_ABI" in - *arm64* ) - ndk_ARCH=arm64 - ;; - *arm* ) - ndk_ARCH=arm - ;; - *x86_64* ) - ndk_ARCH=x86_64 - ;; - *x86* ) - ndk_ARCH=x86 - ;; - *mips64* ) - ndk_ARCH=mips64 - ;; - *mips* ) - ndk_ARCH=mips - ;; - * ) - AC_MSG_ERROR([Failed to determine Android device architecture]) - ;; -esac +AS_CASE(["$ndk_ABI"], + [*arm64*], [ndk_ARCH=arm64], + [*arm*], [ndk_ARCH=arm], + [*x86_64*], [ndk_ARCH=x86_64], + [*x86*], [ndk_ARCH=x86], + [*mips64*], [ndk_ARCH=mips64], + [*mips*], [ndk_ARCH=mips], + [AC_MSG_ERROR([Failed to determine Android device architecture])]) # This is a map between pkg-config style package names and Android # ones. @@ -89,8 +76,8 @@ ndk_package_map="$ndk_package_map MagickWand:libmagickwand-7 lcms2:liblcms2" ndk_replace_pkg_config_package () { for ndk_stuff in $ndk_package_map; do - ndk_key=${ndk_stuff%%:*} - ndk_value=${ndk_stuff#*:} + ndk_key=`AS_ECHO([$ndk_stuff]) | cut -d: -f1` + ndk_value=`AS_ECHO([$ndk_stuff]) | cut -d: -f2` if test "$ndk_key" = "$ndk_module"; then ndk_module="$ndk_value" @@ -99,6 +86,28 @@ ndk_replace_pkg_config_package () { done } +# Run the Makefile helper script for the Android.mk file. + +ndk_run_test () { + # Figure out where the helper Makefile is. + ndk_build_helper_file="${ndk_AUX_DIR}ndk-build-helper.mk" + ndk_module_extract_awk="${ndk_AUX_DIR}ndk-module-extract.awk" + ndk_dir=`AS_DIRNAME([$ndk_android_mk])` + + # Now call Make with the right arguments. + "$MAKE" -s -f "$ndk_build_helper_file" EMACS_SRCDIR=`pwd` \ + EMACS_ABI="$ndk_ABI" ANDROID_MAKEFILE="$ndk_android_mk" \ + NDK_BUILD_DIR="$ndk_DIR" NDK_ROOT="/tmp" \ + ANDROID_MODULE_DIRECTORY="$ndk_dir" BUILD_AUXDIR=$ndk_AUX_DIR \ + 2>&AS_MESSAGE_LOG_FD >conftest.ndk + + # Read the output. + cat conftest.ndk | awk -f "$ndk_module_extract_awk" MODULE="$ndk_module" + + # Remove the temporary file. + rm -f conftest.ndk +} + # ndk_parse_pkg_config_string PKG_CONFIG_STRING # --------------------------------------------- # Parse a pkg-config style list of modules. Place the resulting list @@ -108,13 +117,13 @@ ndk_parse_pkg_config_string () { ndk_input=[$]1 ndk_modules= while test -n "$ndk_input"; do - ndk_str=$(printf "$ndk_input" | cut -f1 -d' ') - ndk_input="$(printf "$ndk_input" | cut -s -f2- -d' ')" + ndk_str=`AS_ECHO_N(["$ndk_input"]) | cut -f1 -d' '` + ndk_input=`AS_ECHO_N(["$ndk_input"]) | cut -s -f2- -d' '` if test "$ndk_str" = ">=" || test "$ndk_str" = "<=" \ || test "$ndk_str" = ">" || test "$ndk_str" = "<" \ || test "$ndk_str" = "!="; then - ndk_input="$(printf "$ndk_input" | cut -s -f2- -d' ')" + ndk_input=`AS_ECHO_N(["$ndk_input"]) | cut -s -f2- -d' '` else ndk_modules="$ndk_modules$ndk_str " fi @@ -137,13 +146,7 @@ ndk_resolve_import_module () { # Read this Android.mk file. Set NDK_ROOT to /tmp: the Android in # tree build system sets it to a meaning value, but build files # just use it to test whether or not the NDK is being used. - ndk_commands=$(($MAKE -s -f build-aux/ndk-build-helper.mk EMACS_SRCDIR=. \ - EMACS_ABI=$ndk_ABI ANDROID_MAKEFILE="$ndk_android_mk" \ - ANDROID_MODULE_DIRECTORY=$(dirname "$ndk_android_mk") \ - NDK_BUILD_DIR="$ndk_DIR" NDK_ROOT="/tmp" \ - 2>&AS_MESSAGE_LOG_FD) \ - | awk -f build-aux/ndk-module-extract.awk \ - MODULE="$ndk_module") + ndk_commands=`ndk_run_test` AS_IF([test -n "${ndk_commands//\n }"], [eval "$ndk_commands"]) @@ -152,21 +155,19 @@ ndk_resolve_import_module () { fi done - if test -z "$module_name"; then - AC_MSG_RESULT([no]) - AC_MSG_ERROR([The module currently being built depends on [$]1, but \ + AS_IF([test -z "$module_name"], + [AC_MSG_RESULT([no]) + AC_MSG_ERROR([The module currently being built depends on [$]1, but \ that could not be found in the list of directories specified in \ -`--with-ndk-path'.]) - fi +`--with-ndk-path'.])]) if test -n "$module_cxx_deps"; then ndk_ANY_CXX=yes fi - if test "$ndk_ANY_CXX" = "yes" && test -z "$with_ndk_cxx_shared"; then - AC_MSG_ERROR([The module [$]1 requires the C++ standard library \ -(libc++_shared.so), but it was not found.]) - fi + AS_IF([test "$ndk_ANY_CXX" = "yes" && test -z "$with_ndk_cxx_shared"], + [AC_MSG_ERROR([The module [$]1 requires the C++ standard library \ +(libc++_shared.so), but it was not found.])]) AC_MSG_RESULT([yes]) @@ -181,35 +182,34 @@ that could not be found in the list of directories specified in \ } # Look for a suitable ar in the same directory as the C compiler. -ndk_where_cc=$(which $(echo "$CC" | awk -- "{ print \[$]1 }")) +ndk_cc_firstword=`AS_ECHO([$CC]) | cut -d' ' -f1` +ndk_where_cc=`which $ndk_cc_firstword` ndk_ar_search_path=$PATH # First, try to find $host_alias-ar in PATH. AC_PATH_PROGS([AR], [$host_alias-ar], [], [$ndk_ar_search_path]) -if test -z "$AR"; then +AS_IF([test -z "$AR"],[ # Next, try finding either that or llvm-ar in the directory holding # CC. - ndk_ar_search_path="$(dirname $ndk_where_cc):$ndk_ar_search_path" - AC_PATH_PROGS([AR], [$host_alias-ar llvm-ar], [], [$ndk_ar_search_path]) -fi + ndk_ar_search_path="`AS_DIRNAME([$ndk_where_cc])`:$ndk_ar_search_path" + AC_PATH_PROGS([AR], [$host_alias-ar llvm-ar], [], [$ndk_ar_search_path])]) NDK_BUILD_NASM= # Next, try to find nasm on x86. This doesn't ship with the NDK. -if test "$ndk_ARCH" = "x86" || test "$ndk_ARCH" = "x86_64"; then - AC_CHECK_PROGS([NDK_BUILD_NASM], [nasm]) -fi +AS_IF([test "$ndk_ARCH" = "x86" || test "$ndk_ARCH" = "x86_64"], + [AC_CHECK_PROGS([NDK_BUILD_NASM], [nasm])]) # Look for a file named ``libc++_shared.so'' in a subdirectory of # $ndk_where_cc if it was not specified. AC_MSG_CHECKING([for libc++_shared.so]) ndk_where_toolchain= -if test -z "$with_ndk_cxx_shared" && test -n "$ndk_where_cc"; then +AS_IF([test -z "$with_ndk_cxx_shared" && test -n "$ndk_where_cc"],[ # Find the NDK root directory. Go to $ndk_where_cc. SAVE_PWD=`pwd` - cd $(dirname "$ndk_where_cc") + cd `dirname "$ndk_where_cc"` # Now, keep moving backwards until pwd ends with ``toolchains''. while :; do @@ -218,8 +218,9 @@ if test -z "$with_ndk_cxx_shared" && test -n "$ndk_where_cc"; then break fi - if test "`basename $(pwd)`" = "toolchains"; then - ndk_where_toolchain=`pwd` + ndk_pwd=`pwd` + if test "`AS_BASENAME([$ndk_pwd])`" = "toolchains"; then + ndk_where_toolchain=$ndk_pwd cd "$SAVE_PWD" break fi @@ -230,51 +231,36 @@ if test -z "$with_ndk_cxx_shared" && test -n "$ndk_where_cc"; then ndk_matching_libcxx_shared_so= # The toolchain directory should be in "$ndk_where_toolchain". - if test -n "$ndk_where_toolchain"; then + AS_IF([test -n "$ndk_where_toolchain"],[ # Now, look in the directory behind it. ndk_cxx_shared_so=`find "$ndk_where_toolchain" -name libc++_shared.so` # Look for one with the correct architecture. for ndk_candidate in $ndk_cxx_shared_so; do - case "$ndk_candidate" in - *arm-linux-android* ) - if test "$ndk_ARCH" = "arm"; then - ndk_matching_libcxx_shared_so=$ndk_candidate - fi - ;; - *aarch64-linux-android* ) - if test "$ndk_ARCH" = "arm64"; then - ndk_matching_libcxx_shared_so=$ndk_candidate - fi - ;; - *i[[3-6]]86-linux-android* ) - if test "$ndk_ARCH" = "x86"; then - ndk_matching_libcxx_shared_so=$ndk_candidate - fi - ;; - *x86_64-linux-android* ) - if test "$ndk_ARCH" = "x86_64"; then - ndk_matching_libcxx_shared_so=$ndk_candidate - fi - ;; - esac - - if test -n "$ndk_matching_libcxx_shared_so"; then - with_ndk_cxx_shared=$ndk_matching_libcxx_shared_so - fi - done - fi -fi - -if test -z "$with_ndk_cxx_shared"; then - AC_MSG_RESULT([no]) + AS_CASE([$ndk_candidate], + [*arm-linux-android*], + [AS_IF([test "$ndk_ARCH" = "arm"], + [ndk_matching_libcxx_shared_so=$ndk_candidate])], + [*aarch64-linux-android*], + [AS_IF([test "$ndk_ARCH" = "arm64"], + [ndk_matching_libcxx_shared_so=$ndk_candidate])], + [*i[[3-6]]86-linux-android*], + [AS_IF([test "$ndk_ARCH" = "x86"], + [ndk_matching_libcxx_shared_so=$ndk_candidate])], + [*x86_64-linux-android*], + [AS_IF([test "$ndk_ARCH" = "x86_64"], + [ndk_matching_libcxx_shared_so=$ndk_candidate])]) + + AS_IF([test -n "$ndk_matching_libcxx_shared_so"], + [with_ndk_cxx_shared=$ndk_matching_libcxx_shared_so]) + done])]) + +AS_IF([test -z "$with_ndk_cxx_shared"],[AC_MSG_RESULT([no]) AC_MSG_WARN([The C++ standard library could not be found. \ If you try to build Emacs with a dependency that requires the C++ standard \ library, Emacs will not build correctly, unless you manually specify the \ -name of an appropriate ``libc++_shared.so'' binary.]) -else - AC_MSG_RESULT([$with_ndk_cxx_shared]) -fi +name of an appropriate ``libc++_shared.so'' binary.])], + [AC_MSG_RESULT([$with_ndk_cxx_shared])]) ndk_CXX_SHARED=$with_ndk_cxx_shared @@ -301,18 +287,11 @@ for ndk_android_mk in $ndk_module_files; do # Read this Android.mk file. Set NDK_ROOT to /tmp: the Android in # tree build system sets it to a meaning value, but build files just # use it to test whether or not the NDK is being used. - ndk_commands=$(($MAKE -s -f build-aux/ndk-build-helper.mk EMACS_SRCDIR=. \ - EMACS_ABI=$ndk_ABI ANDROID_MAKEFILE="$ndk_android_mk" \ - ANDROID_MODULE_DIRECTORY=$(dirname "$ndk_android_mk") \ - NDK_BUILD_DIR="$ndk_DIR" NDK_ROOT="/tmp" \ - 2>&AS_MESSAGE_LOG_FD) \ - | awk -f build-aux/ndk-module-extract.awk \ - MODULE="$ndk_module") - - AS_IF([test -n "${ndk_commands//\n }"], [eval "$ndk_commands"]) + ndk_commands=`ndk_run_test` + eval "$ndk_commands" if test -n "$module_name"; then - break + break; fi done -- 2.39.2