From 960230d88d3c063ad51f91de076dd2b4a7b88ca1 Mon Sep 17 00:00:00 2001 From: Po Lu Date: Thu, 2 Mar 2023 18:31:35 +0800 Subject: [PATCH] Summary: Update Android port * INSTALL: Document where to find Android installation instructions. * configure.ac (CHECK_LISP_OBJECT_TYPE): Pacify -Wsuggest-attribute=noreturn only on Android. * cross/ndk-build/README: New file. * doc/emacs/android.texi (Android): * doc/emacs/emacs.texi (Top): * doc/emacs/input.texi (Other Input Devices): Untabify menus. * etc/NEWS: Move INSTALL.android to java/INSTALL. * java/INSTALL: New file. * java/README: * src/coding.c (from_unicode_buffer): Make Android specific code only build on Android. --- INSTALL | 6 +- configure.ac | 6 +- cross/ndk-build/README | 352 ++++++++++++++++ doc/emacs/android.texi | 14 +- doc/emacs/emacs.texi | 20 +- doc/emacs/input.texi | 4 +- etc/NEWS | 2 +- java/INSTALL | 910 +++++++++++++++++++++++++++++++++++++++++ java/README | 3 +- src/coding.c | 43 +- 10 files changed, 1309 insertions(+), 51 deletions(-) create mode 100644 cross/ndk-build/README create mode 100644 java/INSTALL diff --git a/INSTALL b/INSTALL index 344ae39f464..a69e1f2aec7 100644 --- a/INSTALL +++ b/INSTALL @@ -5,9 +5,9 @@ See the end of the file for license conditions. This file contains general information on building GNU Emacs. For -more information specific to the MS-Windows, GNUstep/macOS, and MS-DOS -ports, also read the files nt/INSTALL, nextstep/INSTALL, and -msdos/INSTALL. +more information specific to the MS-Windows, GNUstep/macOS, MS-DOS, +and Android ports, also read the files nt/INSTALL, nextstep/INSTALL, +msdos/INSTALL, and java/INSTALL. For information about building from a Git checkout (rather than an Emacs release), read the INSTALL.REPO file first. diff --git a/configure.ac b/configure.ac index 393f8c72c65..d8772b7803e 100644 --- a/configure.ac +++ b/configure.ac @@ -1656,9 +1656,6 @@ AS_IF([test $gl_gcc_warnings = no], nw="$nw -Wsync-nand" # irrelevant here, and provokes ObjC warning nw="$nw -Wunsafe-loop-optimizations" # OK to suppress unsafe optimizations nw="$nw -Wbad-function-cast" # These casts are no worse than others. - nw="$nw -Wunknown-warning-option" # Let #pragma GCC ignore work properly - # even when the compiler in use doesn't - # support the option. # Emacs doesn't care about shadowing; see # . @@ -1695,7 +1692,8 @@ AS_IF([test $gl_gcc_warnings = no], # currently stubbed out for operation on the build machine, disable # -Wsuggest-attribute=noreturn. - nw="$nw -Wsuggest-attribute=noreturn" + AS_IF([test "$ANDROID" = "yes"], + [nw="$nw -Wsuggest-attribute=noreturn"]) gl_MANYWARN_ALL_GCC([ws]) gl_MANYWARN_COMPLEMENT([ws], [$ws], [$nw]) diff --git a/cross/ndk-build/README b/cross/ndk-build/README new file mode 100644 index 00000000000..9c4ffdf437a --- /dev/null +++ b/cross/ndk-build/README @@ -0,0 +1,352 @@ +NDK BUILD SYSTEM IMPLEMENTATION + +Copyright (C) 2023 Free Software Foundation, Inc. +See the end of the file for license conditions. + +Emacs implements ndk-build itself, because the version that comes with +the Android NDK is not easy to use from another Makefile, and keeps +accumulating incompatible changes. + +The Emacs implementation of ndk-build consists of one m4 file: + + m4/ndk-build.m4 + +four Makefiles in build-aux, run during configure: + + build-aux/ndk-build-helper-1.mk + build-aux/ndk-build-helper-2.mk + build-aux/ndk-build-helper-3.mk + build-aux/ndk-build-helper.mk + +one awk script in build-awx, run during configure: + + build-aux/ndk-module-extract.awk + +seven Makefiles in cross/ndk-build, + + cross/ndk-build/ndk-build-shared-library.mk + cross/ndk-build/ndk-build-static-library.mk + cross/ndk-build/ndk-build-executable.mk + cross/ndk-build/ndk-clear-vars.mk + cross/ndk-build/ndk-prebuilt-shared-library.mk + cross/ndk-build/ndk-prebuilt-static-library.mk + cross/ndk-build/ndk-resolve.mk + +and finally, two more Makefiles in cross/ndk-build, generated by +configure: + + cross/ndk-build/Makefile (generated from cross/ndk-build/Makefile.in) + cross/ndk-build/ndk-build.mk (generated from cross/ndk-build/ndk-build.mk.in) + +m4/ndk-build.m4 is a collection of macros which are used by the +configure script to set up the ndk-build system, look for modules, add +the appropriate options to LIBS and CFLAGS, and generate the Makefiles +necessary to build the rest of Emacs. + +Immediately after determining the list of directories in which to look +for ``Android.mk'' files, the version and type of Android system being +built for, configure calls: + + ndk_INIT([$android_abi], [$ANDROID_SDK], [cross/ndk-build]) + +This expands to a sequence of shell script that enumerates all of the +Android.mk files specified in "$with_ndk_path", sets up some shell +functions used by the rest of the ndk-build code run by the configure +script, and teaches the ndk-build system that the Makefiles to be +generated are found in the directory "cross/ndk-build/Makefile". + +When configure is cross-compiling for Android, the macro +EMACS_CHECK_MODULES will expand to the macro ndk_CHECK_MODULES, +instead of pkg-config.m4's PKG_CHECK_MODULES. Thus, the following +code: + + EMACS_CHECK_MODULES([PNG], [libpng >= 1.0.0]) + +will actually expand to: + + ndk_CHECK_MODULES([PNG], [libpng >= 1.0.0], [HAVE_PNG=yes], + [HAVE_PNG=no]) + +which in turn expands to a sequence shell script that first invokes: + + make -f build-aux/ndk-build-helper.mk + +for each ``Android.mk'' file found by ndk_INIT, with the following +variables given to Make: + + EMACS_SRCDIR=. # the source directory (in which configure is running) + EMACS_ABI=$ndk_ABI # this is the $android_abi given to ndk_INIT + ANDROID_MAKEFILE="/opt/android/libpng/Android.mk" + ANDROID_MODULE_DIRECTORY="/opt/android/libpng" + NDK_BUILD_DIR="$ndk_DIR" # this is the directory given as to ndk_INIT + +build-aux/ndk-build-helper.mk will then evaluate the contents +$(ANDROID_MAKEFILE), the ``Android.mk'' file, for the first time. The +purpose of this evaluation is to establish a list of packages (or +modules) provided by the ``Android.mk'' file, and the corresponding +Makefile targets and compiler and linker flags required to build and +link to those tagets. + +Before doing so, build-aux/ndk-build-helper.mk will define several +variables and functions required by all ``Android.mk'' files. The +most important of these are: + + my-dir # the directory containing the Android.mk file. + BUILD_SHARED_LIBRARY # build-aux/ndk-build-helper-1.mk + BUILD_STATIC_LIBRARY # build-aux/ndk-build-helper-2.mk + BUILD_EXECUTABLE # build-aux/ndk-build-helper-3.mk + CLEAR_VARS # build-aux/ndk-build-helper-4.mk + +Then, ``Android.mk'' will include $(CLEAN_VARS), possibly other +``Android.mk'' files, (to clear variables previously set), set several +variables describing each module to the ndk-build system, and include +one of $(BUILD_SHARED_LIBRARY), $(BUILD_STATIC_LIBRARY) and +$(BUILD_EXECUTABLE). + +Each one of those three scripts will then read from the variables set +by ``Android.mk'', resolve dependencies, and print out some text +describing the module to Emacs. For example, the shared library +module "libpng" results in the following text being printed: + +Building shared +libpng +/opt/android/libpng/png.c /opt/android/libpng/pngerror.c /opt/android/libpng/pngget.c /opt/android/libpng/pngmem.c /opt/android/libpng/pngpread.c /opt/android/libpng/pngread.c /opt/android/libpng/pngrio.c /opt/android/libpng/pngrtran.c /opt/android/libpng/pngrutil.c /opt/android/libpng/pngset.c /opt/android/libpng/pngtrans.c /opt/android/libpng/pngwio.c /opt/android/libpng/pngwrite.c /opt/android/libpng/pngwtran.c /opt/android/libpng/pngwutil.c +-I/opt/android/libpng + + -L/opt/emacs/cross/ndk-build -l:libpng_emacs.so +libpng_emacs.so +End + +The output is arranged as follows: + + - The first line consists of the word ``Building'', followed by + either ``shared'', ``static'', or ``executable'', depending on + what type of module being built. + + - The second line consists of the name of the module currently being + built. + + - The third line consists of all of the source code files comprising + the module. + + - The fourth line consists of the text that has to be added to + CFLAGS in order to find the includes associated with the module. + + - The fifth line consists of the text that has to be added to LIBS + in order to link with this module and all of its dependencies. + + - The sixth line consists of the Make targets (more on this later) + that will build the final shared object or library archive of this + module, along with all of its dependencies. + + - The seventh line is either empty, or the name of a dependency on + the C++ standard library. This is used to determine whether or + not Emacs will include the C++ standard library in the application + package. + +The output from Make is given to an awk script, +build-aux/ndk-module-extract.awk. This is responsible for parsing the +that output and filtering out modules other than what is being built: + + awk -f build-aux/ndk-module-extract.awk MODULE=libpng + +eventually generating this section of shell script: + +module_name=libpng +module_kind=shared +module_src="/opt/android/libpng/png.c /opt/android/libpng/pngerror.c /opt/android/libpng/pngget.c /opt/android/libpng/pngmem.c /opt/android/libpng/pngpread.c /opt/android/libpng/pngread.c /opt/android/libpng/pngrio.c /opt/android/libpng/pngrtran.c /opt/android/libpng/pngrutil.c /opt/android/libpng/pngset.c /opt/android/libpng/pngtrans.c /opt/android/libpng/pngwio.c /opt/android/libpng/pngwrite.c /opt/android/libpng/pngwtran.c /opt/android/libpng/pngwutil.c" +module_includes="-I/opt/android/libpng" +module_cflags="" +module_ldflags=" -L/opt/emacs/cross/ndk-build -l:libpng_emacs.so" +module_target="libpng_emacs.so" +module_cxx_deps="" +module_imports="" + +which is then evaluated by `configure'. Once the variable +`module_name' is set, configure apends the remaining +$(module_includes), $(module_cflags) and $(module_ldflags) to the +module's CFLAGS and LIBS variables, and appends the list of Makefile +targets specified to the variable NDK_BUILD_MODULES. + +In some cases, an ``Android.mk'' file may chose to import a module +defined in ``--with-ndk-path'', but not defined inside its own +``Android.mk'' file. build-aux/ndk-build-helper.mk defines the +`import-module' function to add the modules being imported to a +variable, which is then printed out after ``ndk-build-helper.mk'' +completes. For example, libxml2 imports the ``libicucc'' module, +which results in the following text being printed: + +Building shared +libxml2 +/home/oldosfan/libxml2/SAX.c /home/oldosfan/libxml2/entities.c /home/oldosfan/libxml2/encoding.c /home/oldosfan/libxml2/error.c /home/oldosfan/libxml2/parserInternals.c /home/oldosfan/libxml2/parser.c /home/oldosfan/libxml2/tree.c /home/oldosfan/libxml2/hash.c /home/oldosfan/libxml2/list.c /home/oldosfan/libxml2/xmlIO.c /home/oldosfan/libxml2/xmlmemory.c /home/oldosfan/libxml2/uri.c /home/oldosfan/libxml2/valid.c /home/oldosfan/libxml2/xlink.c /home/oldosfan/libxml2/debugXML.c /home/oldosfan/libxml2/xpath.c /home/oldosfan/libxml2/xpointer.c /home/oldosfan/libxml2/xinclude.c /home/oldosfan/libxml2/DOCBparser.c /home/oldosfan/libxml2/catalog.c /home/oldosfan/libxml2/globals.c /home/oldosfan/libxml2/threads.c /home/oldosfan/libxml2/c14n.c /home/oldosfan/libxml2/xmlstring.c /home/oldosfan/libxml2/buf.c /home/oldosfan/libxml2/xmlregexp.c /home/oldosfan/libxml2/xmlschemas.c /home/oldosfan/libxml2/xmlschemastypes.c /home/oldosfan/libxml2/xmlunicode.c /home/oldosfan/libxml2/xmlreader.c /home/oldosfan/libxml2/relaxng.c /home/oldosfan/libxml2/dict.c /home/oldosfan/libxml2/SAX2.c /home/oldosfan/libxml2/xmlwriter.c /home/oldosfan/libxml2/legacy.c /home/oldosfan/libxml2/chvalid.c /home/oldosfan/libxml2/pattern.c /home/oldosfan/libxml2/xmlsave.c /home/oldosfan/libxml2/xmlmodule.c /home/oldosfan/libxml2/schematron.c /home/oldosfan/libxml2/SAX.c /home/oldosfan/libxml2/entities.c /home/oldosfan/libxml2/encoding.c /home/oldosfan/libxml2/error.c /home/oldosfan/libxml2/parserInternals.c /home/oldosfan/libxml2/parser.c /home/oldosfan/libxml2/tree.c /home/oldosfan/libxml2/hash.c /home/oldosfan/libxml2/list.c /home/oldosfan/libxml2/xmlIO.c /home/oldosfan/libxml2/xmlmemory.c /home/oldosfan/libxml2/uri.c /home/oldosfan/libxml2/valid.c /home/oldosfan/libxml2/xlink.c /home/oldosfan/libxml2/debugXML.c /home/oldosfan/libxml2/xpath.c /home/oldosfan/libxml2/xpointer.c /home/oldosfan/libxml2/xinclude.c /home/oldosfan/libxml2/DOCBparser.c /home/oldosfan/libxml2/catalog.c /home/oldosfan/libxml2/globals.c /home/oldosfan/libxml2/threads.c /home/oldosfan/libxml2/c14n.c /home/oldosfan/libxml2/xmlstring.c /home/oldosfan/libxml2/buf.c /home/oldosfan/libxml2/xmlregexp.c /home/oldosfan/libxml2/xmlschemas.c /home/oldosfan/libxml2/xmlschemastypes.c /home/oldosfan/libxml2/xmlunicode.c /home/oldosfan/libxml2/xmlreader.c /home/oldosfan/libxml2/relaxng.c /home/oldosfan/libxml2/dict.c /home/oldosfan/libxml2/SAX2.c /home/oldosfan/libxml2/xmlwriter.c /home/oldosfan/libxml2/legacy.c /home/oldosfan/libxml2/chvalid.c /home/oldosfan/libxml2/pattern.c /home/oldosfan/libxml2/xmlsave.c /home/oldosfan/libxml2/xmlmodule.c /home/oldosfan/libxml2/schematron.c + + + -L/home/oldosfan/emacs-dev/emacs-android/cross/ndk-build -l:libxml2_emacs.so -l:libicuuc_emacs.so +libxml2_emacs.so libicuuc_emacs.so +End +Start Imports +libicuuc +End Imports + +Upon encountering the ``Start Imports'' section, +build-aux/ndk-module-extract.awk collects all imports until it +encounters the line ``End Imports'', at which point it prints: + +module_imports="libicuuc" + +Then, if the list of imports is not empty, ndk_CHECK_MODULES +additionally calls itself for each import before appending the +module's own ``Android.mk'', ensuring that the module's imported +dependencies are included by $ndk_DIR/Makefile before itself. + +Finally, immediately before generating src/Makefile.android, configure +expands: + + ndk_CONFIG_FILES + +to generate $ndk_DIR/Makefile and $ndk_DIR/ndk-build.mk. + +Now, the $ndk_DIR directory is set up to build all modules upon which +depends, and $ndk_DIR/ndk-build.mk includes a list of files required +to link Emacs, along with the rules to chdir into $ndk_DIR in order to +build them. + +$ndk_DIR/ndk-build.mk is included by cross/src/Makefile +(Makefile.android) and java/Makefile. It defines three different +variables: + + NDK_BUILD_MODULES the file names of all modules to be built. + NDK_BUILD_STATIC absolute names of all library archives + to be built. + NDK_BUILD_SHARED absolute names of all shared libraries to + be built. + +and then proceeds to define rules to build each of the modules in +$(NDK_BUILD_MODULES). + +cross/src/Makefile arranges to have all dependencies of Emacs not +already built built before linking ``libemacs.so'' with them. + +java/Makefile additionally arranges to have all shared object +dependencies built before the application package is built, which is +normally redundant because they should have already been built before +linking ``libemacs.so''. + +Building the modules is performed through $ndk_DIR/Makefile, which +contains the actual implementation of the ``ndk-build'' build system. +First, it defines certain variables constant within the ``ndk-build'' +build system, such as the files included by ``Android.mk'' to build +shared or static libraries, and CLEAR_VARS. The most important of +these are: + + CLEAR_VARS cross/ndk-build/ndk-clear-vars.mk + BUILD_EXECUTABLE cross/ndk-build/ndk-build-executable.mk + BUILD_SHARED_LIBRARY cross/ndk-build/ndk-build-shared-library.mk + BUILD_STATIC_LIBRARY cross/ndk-build/ndk-build-static-library.mk + PREBUILT_SHARED_LIBRARY cross/ndk-build/ndk-prebuilt-shared-library.mk + PREBUILT_STATIC_LIBRARY cross/ndk-build/ndk-prebuilt-static-library.mk + +Then, it loads each Emacs dependency's ``Android.mk'' file. For each +module defined there, ``Android.mk'' includes $(CLEAR_VARS) to unset +all variables specific to each module, and then includes +$(BUILD_SHARED_LIBRARY) or $(BUILD_STATIC_LIBRARY) for each shared or +static library module. + +This results in cross/ndk-build/ndk-build-shared-library.mk or +cross/ndk-build/ndk-build-static-library being included, just like the +Makefiles in build-aux were inside the configure script. + +Each one of those two scripts then defines rules to build all of the +object files associated with the module, and then link or archive +them. The name under which the module is linked is the same as the +Make target found on the sixth line of output from +build-aux/ndk-build-helper.mk. + +In doing so, they both include the file ndk-resolve.mk. +ndk-resolve.mk is expected to recursively add all of the exported +CFLAGS and includes of any dependencies to the compiler and linker +command lines for the module being built. + +When building a shared library module, ndk-resolve.mk is also expected +to define the variables NDK_LOCAL_A_NAMES_$(LOCAL_MODULE) and +NDK_WHOLE_A_NAMES_$(LOCAL_MODULE), containing all static library +dependencies' archive files. They are to be linked in to the +resulting shared object file. + +This is done by including cross/ndk-build/ndk-resolve.mk each time a +shared or static library module is going to be built. How is this +done? + +First, ndk-resolve.mk saves the LOCAL_PATH, LOCAL_STATIC_LIBRARIES, +LOCAL_SHARED_LIBRARIES, LOCAL_EXPORT_CFLAGS and +LOCAL_EXPORT_C_INCLUDES from the module. + +Next, ndk-resolve loops through the dependencies the module has +specified, appending its CFLAGS and includes to the command line for +the current module. + +Then, that process is repeated for each such dependency which has not +already been resolved, until all dependencies have been resolved. + +libpng is a very simple module, providing only a single shared object +module. This module is named libpng_emacs.so and is eventually built +and packaged into the library directory of the Emacs application +package. Now, let us look at a more complex module, libwebp: + + + +When built with libwebp, Emacs depends on a single library, +libwebpdemux. This library is named ``libwebpdemux'' on Unix systems, +and that is the name by which it is found with pkg-config. + +However, the library's module is only named ``webpdemux'' on Android. +When ndk_CHECK_MODULES begins to look for a module, it first tries to +see if its name is found in the variable `ndk_package_map', which was +set inside ndk_INIT. In this case, it finds the following word: + + libwebpdemux:webpdemux + +and immediately replaces ``libwebpdemux'' with ``webpdemux''. + +Then, it locates the ``Android.mk'' file containing a static library +module named webpdemux and gives the output from +build-aux/ndk-build-helper.mk to the awk script, resulting in: + +module_name=webpdemux +module_kind=static +module_src="/opt/android/webp/src/demux/anim_decode.c /opt/android/webp/src/demux/demux.c" +module_includes="-I/opt/android/webp/src" +module_cflags="" +module_ldflags=" cross/ndk-build/libwebpdemux.a cross/ndk-build/libwebp.a cross/ndk-build/libwebpdecoder_static.a " +module_target="libwebpdemux.a libwebp.a libwebpdecoder_static.a" + +The attentive reader will notice that in addition to the +``libwebpdemux.a'' archive associated with the ``webpdemux'' library, +Emacs has been made to link with two additional libraries. This is +because the ``webpdemux'' module specifies a dependency on the +``webp'' module (defined in the same Android.mk). +build-aux/ndk-build-helper.mk resolved that dependency, noticing that +it in turn specified another dependency on ``webpdecoder_static'', +which in turn was added to the linker command line and list of targets +to build. + +As a result, all three dependencies will be built and linked to Emacs, +instead of just the single ``webpdemux'' dependency that was +specified. + + + +This file is part of GNU Emacs. + +GNU Emacs is free software: you can redistribute it and/or modify +it under the terms of the GNU General Public License as published by +the Free Software Foundation, either version 3 of the License, or +(at your option) any later version. + +GNU Emacs is distributed in the hope that it will be useful, +but WITHOUT ANY WARRANTY; without even the implied warranty of +MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +GNU General Public License for more details. + +You should have received a copy of the GNU General Public License +along with GNU Emacs. If not, see . diff --git a/doc/emacs/android.texi b/doc/emacs/android.texi index 8d0707a5075..d49e0754b0a 100644 --- a/doc/emacs/android.texi +++ b/doc/emacs/android.texi @@ -14,13 +14,13 @@ or digitizer device and on-screen keyboard. For more information about using such devices with Emacs, @pxref{Other Input Devices}. @menu -* What is Android?:: Preamble. -* Android Startup:: Starting up Emacs on Android. -* Android Environment:: Running Emacs under Android. -* Android File System:: The Android file system. -* Android Windowing:: The Android window system. -* Android Fonts:: Font selection under Android. -* Android Troubleshooting:: Dealing with problems. +* What is Android?:: Preamble. +* Android Startup:: Starting up Emacs on Android. +* Android Environment:: Running Emacs under Android. +* Android File System:: The Android file system. +* Android Windowing:: The Android window system. +* Android Fonts:: Font selection under Android. +* Android Troubleshooting:: Dealing with problems. @end menu @node What is Android? diff --git a/doc/emacs/emacs.texi b/doc/emacs/emacs.texi index 8b3748b8fc0..766180c2e17 100644 --- a/doc/emacs/emacs.texi +++ b/doc/emacs/emacs.texi @@ -225,7 +225,7 @@ Appendices * Haiku:: Using Emacs on Haiku. * Android:: Using Emacs on Android. * Microsoft Windows:: Using Emacs on Microsoft Windows and MS-DOS. -* Other Input Devices:: Using Emacs with other input devices. +* Other Input Devices:: Using Emacs with other input devices. * Manifesto:: What's GNU? Gnu's Not Unix! * Glossary:: Terms used in this manual. @@ -1264,18 +1264,18 @@ Emacs and Haiku Emacs and Android -* What is Android?:: Preamble. -* Android Startup:: Starting up Emacs on Android. -* Android Environment:: Running Emacs under Android. -* Android File System:: The Android file system. -* Android Windowing:: The Android window system. -* Android Fonts:: Font selection under Android. -* Android Troubleshooting:: Dealing with problems. +* What is Android?:: Preamble. +* Android Startup:: Starting up Emacs on Android. +* Android Environment:: Running Emacs under Android. +* Android File System:: The Android file system. +* Android Windowing:: The Android window system. +* Android Fonts:: Font selection under Android. +* Android Troubleshooting:: Dealing with problems. Emacs and unconventional input devices -* Touchscreens:: Using Emacs on touchscreens. -* On-Screen Keyboards:: Using Emacs with virtual keyboards. +* Touchscreens:: Using Emacs on touchscreens. +* On-Screen Keyboards:: Using Emacs with virtual keyboards. Emacs and Microsoft Windows/MS-DOS diff --git a/doc/emacs/input.texi b/doc/emacs/input.texi index dc1acaedfcb..1bf230354b3 100644 --- a/doc/emacs/input.texi +++ b/doc/emacs/input.texi @@ -15,8 +15,8 @@ holds true. As a result, Emacs now has support for other kinds of input devices, which is detailed here. @menu -* Touchscreens:: Using Emacs on touchscreens. -* On-Screen Keyboards:: Using Emacs with virtual keyboards. +* Touchscreens:: Using Emacs on touchscreens. +* On-Screen Keyboards:: Using Emacs with virtual keyboards. @end menu @node Touchscreens diff --git a/etc/NEWS b/etc/NEWS index 139bc1fb457..9ed079a316c 100644 --- a/etc/NEWS +++ b/etc/NEWS @@ -28,7 +28,7 @@ applies, and please also update docstrings as needed. This requires Emacs to be compiled on another computer. The Android NDK, SDK, and a suitable Java compiler must also be installed. -See the file 'INSTALL.android' for more details. +See the file 'java/INSTALL' for more details. * Startup Changes in Emacs 30.1 diff --git a/java/INSTALL b/java/INSTALL new file mode 100644 index 00000000000..bc5f4a70cd0 --- /dev/null +++ b/java/INSTALL @@ -0,0 +1,910 @@ +Installation instructions for Android +Copyright (C) 2023 Free Software Foundation, Inc. +See the end of the file for license conditions. + +Please read the entirety of this file before attempting to build Emacs +as an application package which can run on Android devices. + +When building from the source repository, make sure to read +INSTALL.REPO as well. + + + +Android is an unusual operating system in that program binaries cannot +be produced on computers running Android themselves. Instead, they +must be built on some other computer using a set of tools known as the +``Android SDK'' (Software Development Kit) and the ``Android NDK'' +(Native Development Kit.) Appropriate versions of both must be +obtained to build GNU Emacs; after being built, the generated binaries +will work on almost all Android devices. This document does not +elaborate on how both sets of tools can be obtained. However, for +your freedom's sake, you should use the Android SDK provided by the +Debian project. + +In addition to the Android SDK and Android NDK, Emacs also requires +the Java compiler from OpenJDK 1.7.0 to be installed on your system. +Building on GNU systems is all that is officially supported. We are +told that Mac OS works too, and other Unix systems will likely work +as well, but MS Windows and Cygwin will not. + +Once all of those tools are obtained, you may invoke the `configure' +script like so: + + ./configure --with-android=/path/to/android.jar \ + ANDROID_CC=/path/to/android/ndk/cc \ + SDK_BUILD_TOOLS=/path/to/sdk/build/tools + +Replacing the paths in the command line above with: + + - the path to the `android.jar' headers which come with the Android + SDK. They must correspond to Android version 13 (API level 33) or + later. + + - the path to the C compiler in the Android NDK, for the kind of CPU + you are building Emacs to run on. + + - the path to the directory in the Android SDK containing binaries + such as `aapt', `apksigner', and `d8'. These are used to build + the application package. + +Where the type of CPU can either be `armeabi', `armv7*', `i686', +`x86_64', `mips', or `mips64'. + +After the configuration process completes, you may run: + + make all + +Once `make' finishes, there should be a file in the `java' directory +named along the lines of: + + emacs---.apk + +where is the oldest version of Android that the package +will run on, and is the type of Android machine the package was +built for. + +The generated package can be uploaded onto an SD card (or similar +medium) and installed on-device. + + +BUILDING WITH OLD NDK VERSIONS + +Building Emacs with an old version of the Android NDK requires special +setup. This is because there is no separate C compiler binary for +each version of Android in those versions of the NDK. + +Before running `configure', you must identify three variables: + + - What kind of Android system you are building Emacs for. + + - The minimum API version of Android you want to build Emacs for. + + - The locations of the system root and include files for that + version of Android in the NDK. + +That information must then be specified as arguments to the NDK C +compiler. For example: + + ./configure [...] \ + ANDROID_CC="i686-linux-android-gcc \ + --sysroot=/path/to/ndk/platforms/android-14/arch-x86/" + ANDROID_CFLAGS="-isystem /path/to/ndk/sysroot/usr/include \ + -isystem /path/to/ndk/sysroot/usr/include/i686-linux-android \ + -D__ANDROID_API__=14" + +Where __ANDROID_API__ and the version identifier in +"platforms/android-14" defines the version of Android you are building +for, and the include directories specify the paths to the relevant +Android headers. In addition, it may be necessary to specify +"-gdwarf-2", due to a bug in the Android NDK. + +Even older versions of the Android SDK do not require the extra +`-isystem' directives. + +Emacs is known to run on Android 2.2 (API version 8) or later, with +the NDK r10b or later. We wanted to make Emacs work on even older +versions of Android, but they are missing the required JNI graphics +library that allows Emacs to display text from C code. + +Due to an extremely nasty bug in the Android 2.2 system, the generated +Emacs package cannot be compressed in builds for Android 2.2. As a +result, the Emacs package will be approximately 100 megabytes larger +than a compressed package for a newer version of Android. + + +DEBUG AND RELEASE BUILDS + +Android makes a distinction between ``debug'' and ``release'' builds +of applications. With ``release'' builds, the system will apply +stronger optimizations to the application at the cost of being unable +to debug them with the steps in etc/DEBUG. + +Emacs is built as a debuggable package by default, but: + + ./configure --without-android-debug + +will create a release build of Emacs instead. This may be useful when +running Emacs on resource constrained machines. + +If you are building an Emacs package for redistribution, we urge you +to provide both debug and release versions. + + +BUILDING WITH THIRD PARTY LIBRARIES + +The Android NDK does not support the usual ways of locating third +party libraries, especially not via `pkg-config'. Instead, it uses +its own system called `ndk-build'. The one exception to this rule is +zlib, which is considered a part of the Android OS itself and is +available on all devices running Android. + +Android also requires that each application include its own +dependencies, as the system makes no guarantee about the existence of +any particular library. + +Emacs is not built with the `ndk-build' system. Instead, it is built +with Autoconf and Make. + +However, it supports building and including dependencies which use the +similarly Make-based `ndk-build' system. + +To use dependencies built through `ndk-build', you must specify a list +of directories within which Emacs will search for ``Android.mk'' +files, like so: + + ./configure "--with-ndk-path=directory1 directory2" + +If `configure' complains about not being able to find +``libc++_shared.so'', then you must locate that file in your copy of +the NDK, and specify it like so: + + ./configure --with-ndk-cxx-shared=/path/to/sysroot/libc++_shared.so + +Emacs will then read the ``Android.mk'' file in each directory, and +automatically build and use those modules. + +When building for Intel systems, some ``ndk-build'' modules require +the Netwide Assembler, usually installed under ``nasm'', to be present +on the system that is building Emacs. + +Google, Inc. has adapted many common Emacs dependencies to use the +`ndk-build' system. Here is a non-exhaustive list of what is known to +work, along with what has to be patched to make them work: + + libpng - https://android.googlesource.com/platform/external/libpng + libwebp - https://android.googlesource.com/platform/external/webp + (You must apply the patch at the end of this file for the resulting + binary to work on armv7 devices.) + giflib - https://android.googlesource.com/platform/external/giflib + (You must add LOCAL_EXPORT_CFLAGS := -I$(LOCAL_PATH) before + its Android.mk includes $(BUILD_STATIC_LIBRARY)) + libjpeg-turbo - https://android.googlesource.com/platform/external/libjpeg-turbo + (You must add LOCAL_EXPORT_C_INCLUDE_DIRS := $(LOCAL_PATH) before + its Android.mk includes $(BUILD_SHARED_LIBRARY)) + libxml2 - https://android.googlesource.com/platform/external/libxml2/ + (You must also place the dependency icu4c in ``--with-ndk-path'', + and apply the patch at the end of this file.) + icu4c - https://android.googlesource.com/platform/external/icu/ + (You must apply the patch at the end of this file.) + sqlite3 - https://android.googlesource.com/platform/external/sqlite/ + (You must apply the patch at the end of this file, and add the `dist' + directory to ``--with-ndk-path''.) + libselinux - https://android.googlesource.com/platform/external/libselinux + (You must apply the patches at the end of the file, and obtain + the following three dependencies.) + libpackagelistparser + https://android.googlesource.com/platform/system/core/+/refs/heads/nougat-mr1-dev/libpackagelistparser/ + libpcre - https://android.googlesource.com/platform/external/pcre + libcrypto - https://android.googlesource.com/platform/external/boringssl + (You must apply the patch at the end of this file when building for + ARM systems.) + +Many of these dependencies have been migrated over to the +``Android.bp'' build system now used to build Android itself. +However, the old ``Android.mk'' Makefiles are still present in older +branches, and can be easily adapte to newer versions. + +In addition, some Emacs dependencies provide `ndk-build' support +themselves: + + libjansson - https://github.com/akheron/jansson + (You must add LOCAL_EXPORT_INCLUDES := $(LOCAL_C_INCLUDES) before + its Android.mk includes $(BUILD_SHARED_LIBRARY), then copy + android/jansson_config.h to android/jansson_private_config.h.) + +Emacs developers have ported the following dependencies to ARM Android +systems: + + gnutls, gmp - https://sourceforge.net/projects/android-ports-for-gnu-emacs + (Please see the section GNUTLS near the end of this file.) + libtiff - https://sourceforge.net/projects/android-ports-for-gnu-emacs + (Extract and point ``--with-ndk-path'' to tiff-4.5.0-emacs.tar.gz.) + tree-sitter - https://sourceforge.net/projects/android-ports-for-gnu-emacs + (Please see the section TREE-SITTER near the end of this file.) + +And other developers have ported the following dependencies to Android +systems: + + ImageMagick, lcms2 - https://github.com/MolotovCherry/Android-ImageMagick7 + (Please see the section IMAGEMAGICK near the end of this file.) + +We anticipate that most untested non-trivial ndk-build dependencies +will need adjustments in Emacs to work, as the Emacs build system +which emulates ndk-build is in an extremely early state. + + +GNUTLS + +Modified copies of GnuTLS and its dependencies (such as libgmp, +libtasn1, p11-kit) which can be built with the ndk-build system can be +found at https://sourceforge.net/projects/android-ports-for-gnu-emacs. + +They have only been tested on arm64 Android systems running Android +5.0 or later, and armv7l systems running Android 13 or later, so your +mileage may vary, especially if you are trying to build Emacs for +another kind of machine. + +To build Emacs with GnuTLS, you must unpack each of the following tar +archives in that site: + + gmp-6.2.1-emacs.tgz + gnutls-3.7.8-emacs.tar.gz + libtasn1-4.19.0-emacs.tar.gz + p11-kit-0.24.1-emacs.tar.gz + nettle-3.8-emacs.tar.gz + +and add the resulting folders to ``--with-ndk-path''. Note that you +should not try to build these packages separately using any +`configure' script or Makefiles inside. + + +TREE-SITTER + +A copy of tree-sitter modified to build with the ndk-build system can +also find that URL. To build Emacs with tree-sitter, you must unpack +the following tar archive in that site: + + tree-sitter-0.20.7-emacs.tar.gz + +and add the resulting folder to ``--with-ndk-build''. + + +IMAGEMAGICK + +There is a third party port of ImageMagick to Android. Unfortunately, +the port also uses its own patched versions of libpng, libjpeg, +libtiff and libwebp, which conflict with those used by Emacs. Its +Makefiles were also written for MS Windows, so you must also apply the +patch at the end of this file. + + + +PATCH FOR LIBXML2 + +This patch must be applied to the Android.mk in Google's version of +libxml2 before it can be built for Emacs. In addition, you must also +revert the commit `edb5870767fed8712a9b77ef34097209b61ab2db'. + +diff --git a/Android.mk b/Android.mk +index 07c7b372..24f67e49 100644 +--- a/Android.mk ++++ b/Android.mk +@@ -80,6 +80,7 @@ LOCAL_SHARED_LIBRARIES := libicuuc + LOCAL_MODULE:= libxml2 + LOCAL_CLANG := true + LOCAL_ADDITIONAL_DEPENDENCIES += $(LOCAL_PATH)/Android.mk ++LOCAL_EXPORT_C_INCLUDES += $(LOCAL_PATH) + include $(BUILD_SHARED_LIBRARY) + + # For the host +@@ -94,3 +95,5 @@ LOCAL_MODULE := libxml2 + LOCAL_CLANG := true + LOCAL_ADDITIONAL_DEPENDENCIES += $(LOCAL_PATH)/Android.mk + include $(BUILD_HOST_STATIC_LIBRARY) ++ ++$(call import-module,libicuuc) + +PATCH FOR ICU + +This patch must be applied to icu4j/Android.mk in Google's version of +icu before it can be built for Emacs. + +diff --git a/icu4j/Android.mk b/icu4j/Android.mk +index d1ab3d5..69eff81 100644 +--- a/icu4j/Android.mk ++++ b/icu4j/Android.mk +@@ -69,7 +69,7 @@ include $(BUILD_STATIC_JAVA_LIBRARY) + # Path to the ICU4C data files in the Android device file system: + icu4c_data := /system/usr/icu + icu4j_config_root := $(LOCAL_PATH)/main/classes/core/src +-include external/icu/icu4j/adjust_icudt_path.mk ++include $(LOCAL_PATH)/adjust_icudt_path.mk + + include $(CLEAR_VARS) + LOCAL_SRC_FILES := $(icu4j_src_files) + +diff --git a/icu4c/source/common/Android.mk b/icu4c/source/common/Android.mk +index 8e5f757..44bb130 100644 +--- a/icu4c/source/common/Android.mk ++++ b/icu4c/source/common/Android.mk +@@ -231,7 +231,7 @@ include $(CLEAR_VARS) + LOCAL_SRC_FILES += $(src_files) + LOCAL_C_INCLUDES += $(c_includes) $(optional_android_logging_includes) + LOCAL_CFLAGS += $(local_cflags) -DPIC -fPIC +-LOCAL_SHARED_LIBRARIES += libdl $(optional_android_logging_libraries) ++LOCAL_SHARED_LIBRARIES += libdl libstdc++ $(optional_android_logging_libraries) + LOCAL_MODULE_TAGS := optional + LOCAL_MODULE := libicuuc + LOCAL_RTTI_FLAG := -frtti + +PATCH FOR SQLITE3 + +diff --git a/dist/Android.mk b/dist/Android.mk +index bf277d2..36734d9 100644 +--- a/dist/Android.mk ++++ b/dist/Android.mk +@@ -141,6 +141,7 @@ include $(BUILD_HOST_EXECUTABLE) + include $(CLEAR_VARS) + LOCAL_SRC_FILES := $(common_src_files) + LOCAL_CFLAGS += $(minimal_sqlite_flags) ++LOCAL_EXPORT_C_INCLUDES += $(LOCAL_PATH) + LOCAL_MODULE:= libsqlite_static_minimal + LOCAL_SDK_VERSION := 23 + include $(BUILD_STATIC_LIBRARY) + +diff --git a/dist/sqlite3.c b/dist/sqlite3.c +index b0536a4..8fa1ee9 100644 +--- a/dist/sqlite3.c ++++ b/dist/sqlite3.c +@@ -26474,7 +26474,7 @@ SQLITE_PRIVATE const char *sqlite3OpcodeName(int i){ + */ + #if !defined(HAVE_POSIX_FALLOCATE) \ + && (_XOPEN_SOURCE >= 600 || _POSIX_C_SOURCE >= 200112L) +-# define HAVE_POSIX_FALLOCATE 1 ++/* # define HAVE_POSIX_FALLOCATE 1 */ + #endif + + /* + +PATCH FOR WEBP + +diff --git a/Android.mk b/Android.mk +index c7bcb0f5..d4da1704 100644 +--- a/Android.mk ++++ b/Android.mk +@@ -28,9 +28,10 @@ ifneq ($(findstring armeabi-v7a, $(TARGET_ARCH_ABI)),) + # Setting LOCAL_ARM_NEON will enable -mfpu=neon which may cause illegal + # instructions to be generated for armv7a code. Instead target the neon code + # specifically. +- NEON := c.neon +- USE_CPUFEATURES := yes +- WEBP_CFLAGS += -DHAVE_CPU_FEATURES_H ++ # NEON := c.neon ++ # USE_CPUFEATURES := yes ++ # WEBP_CFLAGS += -DHAVE_CPU_FEATURES_H ++ NEON := c + else + NEON := c + endif + +PATCHES FOR SELINUX + +diff --git a/Android.mk b/Android.mk +index 659232e..1e64fd6 100644 +--- a/Android.mk ++++ b/Android.mk +@@ -116,3 +116,7 @@ LOCAL_STATIC_LIBRARIES := libselinux + LOCAL_WHOLE_STATIC_LIBRARIES := libpcre + LOCAL_C_INCLUDES := external/pcre + include $(BUILD_HOST_EXECUTABLE) ++ ++$(call import-module,libpcre) ++$(call import-module,libpackagelistparser) ++$(call import-module,libcrypto) + +diff --git a/src/android.c b/src/android.c +index 5206a9f..b351ffc 100644 +--- a/src/android.c ++++ b/src/android.c +@@ -21,8 +21,7 @@ + #include + #include + #include +-#include +-#include ++#include + #include "policy.h" + #include "callbacks.h" + #include "selinux_internal.h" +@@ -686,6 +685,7 @@ static int seapp_context_lookup(enum seapp_kind kind, + seinfo = parsedseinfo; + } + ++#if 0 + userid = uid / AID_USER; + isOwner = (userid == 0); + appid = uid % AID_USER; +@@ -702,9 +702,13 @@ static int seapp_context_lookup(enum seapp_kind kind, + username = "_app"; + appid -= AID_APP; + } else { ++#endif + username = "_isolated"; ++ appid = 0; ++#if 0 + appid -= AID_ISOLATED_START; + } ++#endif + + if (appid >= CAT_MAPPING_MAX_ID || userid >= CAT_MAPPING_MAX_ID) + goto err; +@@ -1662,8 +1666,10 @@ int selinux_log_callback(int type, const char *fmt, ...) + + va_start(ap, fmt); + if (vasprintf(&strp, fmt, ap) != -1) { ++#if 0 + LOG_PRI(priority, "SELinux", "%s", strp); + LOG_EVENT_STRING(AUDITD_LOG_TAG, strp); ++#endif + free(strp); + } + va_end(ap); + +PATCH FOR BORINGSSL + +diff --git a/Android.mk b/Android.mk +index 3e3ef2a..277d4a9 100644 +--- a/Android.mk ++++ b/Android.mk +@@ -27,7 +27,9 @@ LOCAL_MODULE := libcrypto + LOCAL_EXPORT_C_INCLUDE_DIRS := $(LOCAL_PATH)/src/include + LOCAL_ADDITIONAL_DEPENDENCIES := $(LOCAL_PATH)/Android.mk $(LOCAL_PATH)/crypto-sources.mk + LOCAL_CFLAGS += -fvisibility=hidden -DBORINGSSL_SHARED_LIBRARY -DBORINGSSL_IMPLEMENTATION -DOPENSSL_SMALL -Wno-unused-parameter ++LOCAL_CFLAGS_arm = -DOPENSSL_STATIC_ARMCAP -DOPENSSL_NO_ASM + LOCAL_SDK_VERSION := 9 ++LOCAL_LDFLAGS = --no-undefined + # sha256-armv4.S does not compile with clang. + LOCAL_CLANG_ASFLAGS_arm += -no-integrated-as + LOCAL_CLANG_ASFLAGS_arm64 += -march=armv8-a+crypto +diff --git a/sources.mk b/sources.mk +index e82f3d5..be3a3c4 100644 +--- a/sources.mk ++++ b/sources.mk +@@ -337,20 +337,20 @@ linux_aarch64_sources := \ + linux-aarch64/crypto/sha/sha256-armv8.S\ + linux-aarch64/crypto/sha/sha512-armv8.S\ + +-linux_arm_sources := \ +- linux-arm/crypto/aes/aes-armv4.S\ +- linux-arm/crypto/aes/aesv8-armx32.S\ +- linux-arm/crypto/aes/bsaes-armv7.S\ +- linux-arm/crypto/bn/armv4-mont.S\ +- linux-arm/crypto/modes/ghash-armv4.S\ +- linux-arm/crypto/modes/ghashv8-armx32.S\ +- linux-arm/crypto/sha/sha1-armv4-large.S\ +- linux-arm/crypto/sha/sha256-armv4.S\ +- linux-arm/crypto/sha/sha512-armv4.S\ +- src/crypto/chacha/chacha_vec_arm.S\ +- src/crypto/cpu-arm-asm.S\ +- src/crypto/curve25519/asm/x25519-asm-arm.S\ +- src/crypto/poly1305/poly1305_arm_asm.S\ ++# linux_arm_sources := \ ++# linux-arm/crypto/aes/aes-armv4.S\ ++# linux-arm/crypto/aes/aesv8-armx32.S\ ++# linux-arm/crypto/aes/bsaes-armv7.S\ ++# linux-arm/crypto/bn/armv4-mont.S\ ++# linux-arm/crypto/modes/ghash-armv4.S\ ++# linux-arm/crypto/modes/ghashv8-armx32.S\ ++# linux-arm/crypto/sha/sha1-armv4-large.S\ ++# linux-arm/crypto/sha/sha256-armv4.S\ ++# linux-arm/crypto/sha/sha512-armv4.S\ ++# src/crypto/chacha/chacha_vec_arm.S\ ++# src/crypto/cpu-arm-asm.S\ ++# src/crypto/curve25519/asm/x25519-asm-arm.S\ ++# src/crypto/poly1305/poly1305_arm_asm.S\ + + linux_x86_sources := \ + linux-x86/crypto/aes/aes-586.S\ + +PATCH FOR IMAGEMAGICK + +diff --git a/Android.mk b/Android.mk +index 5ab6699..4441417 100644 +--- a/Android.mk ++++ b/Android.mk +@@ -52,6 +52,20 @@ LZMA_LIB_PATH := $(LOCAL_PATH)/xz-5.2.4 + BZLIB_LIB_PATH := $(LOCAL_PATH)/bzip-1.0.8 + LCMS_LIB_PATH := $(LOCAL_PATH)/liblcms2-2.9 + ++LIBBZ2_ENABLED := true ++LIBFFTW_ENABLED := true ++LIBFREETYPE2_ENABLED := true ++LIBJPEG_TURBO_ENABLED := true ++LIBLZMA_ENABLED := true ++LIBOPENJPEG_ENABLED := true ++LIBPNG_ENABLED := true ++LIBTIFF_ENABLED := true ++LIBWEBP_ENABLED := true ++LIBXML2_ENABLED := true ++LIBZLIB_ENABLED := true ++LIBLCMS2_ENABLED := true ++BUILD_MAGICKWAND := true ++ + #------------------------------------------------------------- + # Include all modules + #------------------------------------------------------------- +@@ -68,6 +82,9 @@ include $(MAKE_PATH)/libjpeg-turbo.mk + # libopenjpeg + include $(MAKE_PATH)/libopenjpeg.mk + ++# libwebp ++include $(MAKE_PATH)/libwebp.mk ++ + # libtiff + include $(MAKE_PATH)/libtiff.mk + +@@ -77,9 +94,6 @@ include $(MAKE_PATH)/libpng.mk + # libfreetype2 + include $(MAKE_PATH)/libfreetype2.mk + +-# libwebp +-include $(MAKE_PATH)/libwebp.mk +- + # libfftw + include $(MAKE_PATH)/libfftw.mk + +diff --git a/libjpeg-turbo-2.0.2/jconfig.h b/libjpeg-turbo-2.0.2/jconfig.h +index 47d14c9..5c6f8ee 100644 +--- a/libjpeg-turbo-2.0.2/jconfig.h ++++ b/libjpeg-turbo-2.0.2/jconfig.h +@@ -1,57 +1,43 @@ +-/* autogenerated jconfig.h based on Android.mk var JCONFIG_FLAGS */ ++/* autogenerated jconfig.h based on Android.mk var JCONFIG_FLAGS */ + #ifndef JPEG_LIB_VERSION + #define JPEG_LIB_VERSION 62 + #endif +- + #ifndef LIBJPEG_TURBO_VERSION + #define LIBJPEG_TURBO_VERSION 2.0.2 + #endif +- + #ifndef LIBJPEG_TURBO_VERSION_NUMBER + #define LIBJPEG_TURBO_VERSION_NUMBER 202 + #endif +- + #ifndef C_ARITH_CODING_SUPPORTED + #define C_ARITH_CODING_SUPPORTED + #endif +- + #ifndef D_ARITH_CODING_SUPPORTED + #define D_ARITH_CODING_SUPPORTED + #endif +- + #ifndef MEM_SRCDST_SUPPORTED + #define MEM_SRCDST_SUPPORTED + #endif +- + #ifndef WITH_SIMD + #define WITH_SIMD + #endif +- + #ifndef BITS_IN_JSAMPLE + #define BITS_IN_JSAMPLE 8 + #endif +- + #ifndef HAVE_LOCALE_H + #define HAVE_LOCALE_H + #endif +- + #ifndef HAVE_STDDEF_H + #define HAVE_STDDEF_H + #endif +- + #ifndef HAVE_STDLIB_H + #define HAVE_STDLIB_H + #endif +- + #ifndef NEED_SYS_TYPES_H + #define NEED_SYS_TYPES_H + #endif +- + #ifndef HAVE_UNSIGNED_CHAR + #define HAVE_UNSIGNED_CHAR + #endif +- + #ifndef HAVE_UNSIGNED_SHORT + #define HAVE_UNSIGNED_SHORT + #endif +- +diff --git a/libxml2-2.9.9/encoding.c b/libxml2-2.9.9/encoding.c +index a3aaf10..60f165b 100644 +--- a/libxml2-2.9.9/encoding.c ++++ b/libxml2-2.9.9/encoding.c +@@ -2394,7 +2394,6 @@ xmlCharEncOutput(xmlOutputBufferPtr output, int init) + { + int ret; + size_t written; +- size_t writtentot = 0; + size_t toconv; + int c_in; + int c_out; +@@ -2451,7 +2450,6 @@ retry: + xmlBufContent(in), &c_in); + xmlBufShrink(in, c_in); + xmlBufAddLen(out, c_out); +- writtentot += c_out; + if (ret == -1) { + if (c_out > 0) { + /* Can be a limitation of iconv or uconv */ +@@ -2536,7 +2534,6 @@ retry: + } + + xmlBufAddLen(out, c_out); +- writtentot += c_out; + goto retry; + } + } +@@ -2567,9 +2564,7 @@ xmlCharEncOutFunc(xmlCharEncodingHandler *handler, xmlBufferPtr out, + xmlBufferPtr in) { + int ret; + int written; +- int writtentot = 0; + int toconv; +- int output = 0; + + if (handler == NULL) return(-1); + if (out == NULL) return(-1); +@@ -2612,7 +2607,6 @@ retry: + in->content, &toconv); + xmlBufferShrink(in, toconv); + out->use += written; +- writtentot += written; + out->content[out->use] = 0; + if (ret == -1) { + if (written > 0) { +@@ -2622,8 +2616,6 @@ retry: + ret = -3; + } + +- if (ret >= 0) output += ret; +- + /* + * Attempt to handle error cases + */ +@@ -2700,7 +2692,6 @@ retry: + } + + out->use += written; +- writtentot += written; + out->content[out->use] = 0; + goto retry; + } +diff --git a/libxml2-2.9.9/xpath.c b/libxml2-2.9.9/xpath.c +index 5e3bb9f..505ec82 100644 +--- a/libxml2-2.9.9/xpath.c ++++ b/libxml2-2.9.9/xpath.c +@@ -10547,7 +10547,7 @@ xmlXPathCompFilterExpr(xmlXPathParserContextPtr ctxt) { + + static xmlChar * + xmlXPathScanName(xmlXPathParserContextPtr ctxt) { +- int len = 0, l; ++ int l; + int c; + const xmlChar *cur; + xmlChar *ret; +@@ -10567,7 +10567,6 @@ xmlXPathScanName(xmlXPathParserContextPtr ctxt) { + (c == '_') || (c == ':') || + (IS_COMBINING(c)) || + (IS_EXTENDER(c)))) { +- len += l; + NEXTL(l); + c = CUR_CHAR(l); + } +diff --git a/make/libicu4c.mk b/make/libicu4c.mk +index 21ec121..8b77865 100644 +--- a/make/libicu4c.mk ++++ b/make/libicu4c.mk +@@ -250,7 +250,7 @@ LOCAL_MODULE := libicuuc + LOCAL_SRC_FILES := $(src_files) + + # when built in android, they require uconfig_local (because of android project), but we don't need this +-$(shell > $(ICU_COMMON_PATH)/unicode/uconfig_local.h echo /* Autogenerated stub file to make libicuuc build happy */) \ ++$(shell > $(ICU_COMMON_PATH)/unicode/uconfig_local.h echo /\* Autogenerated stub file to make libicuuc build happy \*/) \ + + ifeq ($(LIBXML2_ENABLED),true) + include $(BUILD_STATIC_LIBRARY) +diff --git a/make/libjpeg-turbo.mk b/make/libjpeg-turbo.mk +index d39dd41..fdebcf3 100644 +--- a/make/libjpeg-turbo.mk ++++ b/make/libjpeg-turbo.mk +@@ -230,30 +230,30 @@ JCONFIG_FLAGS += \ + HAVE_UNSIGNED_SHORT + + JCONFIGINT_FLAGS += \ +- BUILD="20190814" \ +- PACKAGE_NAME="libjpeg-turbo" \ +- VERSION="2.0.2" ++ BUILD=\"20190814\" \ ++ PACKAGE_NAME=\"libjpeg-turbo\" \ ++ VERSION=\"2.0.2\" + + # originally defined in jconfigint.h, but the substitution has problems with spaces + LOCAL_CFLAGS := \ + -DINLINE="inline __attribute__((always_inline))" + + # create definition file jconfig.h, needed in order to build +-$(shell echo /* autogenerated jconfig.h based on Android.mk var JCONFIG_FLAGS */ > $(JPEG_LIB_PATH)/jconfig.h) ++$(shell echo \/\* autogenerated jconfig.h based on Android.mk var JCONFIG_FLAGS \*\/ > $(JPEG_LIB_PATH)/jconfig.h) + $(foreach name,$(JCONFIG_FLAGS), \ + $(if $(findstring =,$(name)), \ +- $(shell >>$(JPEG_LIB_PATH)/jconfig.h echo #ifndef $(firstword $(subst =, ,$(name)))) \ ++ $(shell >>$(JPEG_LIB_PATH)/jconfig.h echo \#ifndef $(firstword $(subst =, ,$(name)))) \ + , \ +- $(shell >>$(JPEG_LIB_PATH)/jconfig.h echo #ifndef $(name)) \ ++ $(shell >>$(JPEG_LIB_PATH)/jconfig.h echo \#ifndef $(name)) \ + ) \ +- $(shell >>$(JPEG_LIB_PATH)/jconfig.h echo #define $(subst =, ,$(name))) \ +- $(shell >>$(JPEG_LIB_PATH)/jconfig.h echo #endif) \ ++ $(shell >>$(JPEG_LIB_PATH)/jconfig.h echo \#define $(subst =, ,$(name))) \ ++ $(shell >>$(JPEG_LIB_PATH)/jconfig.h echo \#endif) \ + $(shell >> $(JPEG_LIB_PATH)/jconfig.h echo.) \ + ) + + # create definition file jconfigint.h, needed in order to build +-$(shell >$(JPEG_LIB_PATH)/jconfigint.h echo /* autogenerated jconfigint.h based on Android.mk vars JCONFIGINT_FLAGS */) +-$(foreach name,$(JCONFIGINT_FLAGS),$(shell >>$(JPEG_LIB_PATH)/jconfigint.h echo #define $(subst =, ,$(name)))) ++$(shell >$(JPEG_LIB_PATH)/jconfigint.h echo /\* autogenerated jconfigint.h based on Android.mk vars JCONFIGINT_FLAGS \*/) ++$(foreach name,$(JCONFIGINT_FLAGS),$(shell >>$(JPEG_LIB_PATH)/jconfigint.h echo \#define $(subst =, ,$(name)))) + + ifeq ($(LIBJPEG_TURBO_ENABLED),true) + include $(BUILD_STATIC_LIBRARY) +diff --git a/make/liblcms2.mk b/make/liblcms2.mk +index e1fd3b9..29ca791 100644 +--- a/make/liblcms2.mk ++++ b/make/liblcms2.mk +@@ -10,6 +10,10 @@ LOCAL_C_INCLUDES := \ + $(LCMS_LIB_PATH)/include \ + $(LCMS_LIB_PATH)/src + ++LOCAL_EXPORT_C_INCLUDES := \ ++ $(LCMS_LIB_PATH) \ ++ $(LCMS_LIB_PATH)/include \ ++ $(LCMS_LIB_PATH)/src + + LOCAL_CFLAGS := \ + -DHAVE_FUNC_ATTRIBUTE_VISIBILITY=1 \ +diff --git a/make/libmagick++-7.mk b/make/libmagick++-7.mk +index 5352ccb..929396d 100644 +--- a/make/libmagick++-7.mk ++++ b/make/libmagick++-7.mk +@@ -12,7 +12,7 @@ LOCAL_C_INCLUDES := \ + + ifneq ($(STATIC_BUILD),true) + LOCAL_LDFLAGS += -fexceptions +- LOCAL_LDLIBS := -L$(SYSROOT)/usr/lib -llog -lz ++ LOCAL_LDLIBS := -llog -lz + endif + + LOCAL_SRC_FILES := \ +diff --git a/make/libmagickcore-7.mk b/make/libmagickcore-7.mk +index 81293b2..d51fced 100644 +--- a/make/libmagickcore-7.mk ++++ b/make/libmagickcore-7.mk +@@ -25,6 +25,7 @@ else ifeq ($(TARGET_ARCH_ABI),x86_64) + + endif + ++LOCAL_EXPORT_C_INCLUDES += $(IMAGE_MAGICK) + + LOCAL_C_INCLUDES += \ + $(IMAGE_MAGICK) \ +@@ -45,10 +46,9 @@ LOCAL_C_INCLUDES += \ + $(BZLIB_LIB_PATH) \ + $(LCMS_LIB_PATH)/include + +- + ifneq ($(STATIC_BUILD),true) + # ignored in static library builds +- LOCAL_LDLIBS := -L$(SYSROOT)/usr/lib -llog -lz ++ LOCAL_LDLIBS := -llog -lz + endif + + +diff --git a/make/libmagickwand-7.mk b/make/libmagickwand-7.mk +index 7be2fb6..0bbcca5 100644 +--- a/make/libmagickwand-7.mk ++++ b/make/libmagickwand-7.mk +@@ -14,7 +14,7 @@ LOCAL_C_INCLUDES := \ + + # always ignored in static builds + ifneq ($(STATIC_BUILD),true) +- LOCAL_LDLIBS := -L$(SYSROOT)/usr/lib -llog -lz ++ LOCAL_LDLIBS := -llog -lz + endif + + LOCAL_SRC_FILES := \ +@@ -54,6 +54,29 @@ ifeq ($(OPENCL_BUILD),true) + LOCAL_SHARED_LIBRARIES += libopencl + endif + ++LOCAL_SHARED_LIBRARIES += libstdc++ ++ ++ifeq ($(TARGET_ARCH_ABI),arm64-v8a) ++ LOCAL_EXPORT_C_INCLUDES += $(IMAGE_MAGICK)/configs/arm64 ++ LOCAL_C_INCLUDES += $(IMAGE_MAGICK)/configs/arm64 ++else ifeq ($(TARGET_ARCH_ABI),armeabi-v7a) ++ LOCAL_EXPORT_C_INCLUDES += $(IMAGE_MAGICK)/configs/arm ++ LOCAL_C_INCLUDES += $(IMAGE_MAGICK)/configs/arm ++else ifeq ($(TARGET_ARCH_ABI),x86) ++ LOCAL_EXPORT_C_INCLUDES += $(IMAGE_MAGICK)/configs/x86 ++ LOCAL_C_INCLUDES += $(IMAGE_MAGICK)/configs/x86 ++else ifeq ($(TARGET_ARCH_ABI),x86_64) ++ LOCAL_EXPORT_C_INCLUDES += $(IMAGE_MAGICK)/configs/x86-64 ++ LOCAL_C_INCLUDES += $(IMAGE_MAGICK)/configs/x86-64 ++ ++ ifneq ($(STATIC_BUILD),true) ++ LOCAL_LDFLAGS += -latomic ++ endif ++ ++endif ++ ++LOCAL_EXPORT_C_INCLUDES += $(IMAGE_MAGICK) ++ + ifeq ($(BUILD_MAGICKWAND),true) + ifeq ($(STATIC_BUILD),true) + LOCAL_STATIC_LIBRARIES := \ +diff --git a/make/libpng.mk b/make/libpng.mk +index 24fb8ac..dda05fd 100644 +--- a/make/libpng.mk ++++ b/make/libpng.mk +@@ -30,6 +30,7 @@ ifeq ($(TARGET_ARCH_ABI), arm64-v8a) + endif # TARGET_ARCH_ABI == arm64-v8a + + ++LOCAL_EXPORT_C_INCLUDES := $(PNG_LIB_PATH) + LOCAL_C_INCLUDES := $(PNG_LIB_PATH) + + LOCAL_SRC_FILES += \ +diff --git a/make/libtiff.mk b/make/libtiff.mk +index ca43f25..2b17508 100644 +--- a/make/libtiff.mk ++++ b/make/libtiff.mk +@@ -12,6 +12,9 @@ LOCAL_C_INCLUDES := \ + $(LZMA_LIB_PATH)/liblzma/api \ + $(WEBP_LIB_PATH)/src + ++LOCAL_EXPORT_C_INCLUDES := \ ++ $(TIFF_LIB_PATH) ++ + ifeq ($(LIBLZMA_ENABLED),true) + LOCAL_CFLAGS += -DLZMA_SUPPORT=1 + endif +diff --git a/make/magick.mk b/make/magick.mk +index 3ba4b1d..5471608 100644 +--- a/make/magick.mk ++++ b/make/magick.mk +@@ -18,7 +18,7 @@ LOCAL_C_INCLUDES := \ + $(FREETYPE_LIB_PATH)/include + + +-LOCAL_LDLIBS := -L$(SYSROOT)/usr/lib -llog -lz ++LOCAL_LDLIBS := -llog -lz + LOCAL_SRC_FILES := \ + $(IMAGE_MAGICK)/utilities/magick.c \ + + + +This file is part of GNU Emacs. + +GNU Emacs is free software: you can redistribute it and/or modify +it under the terms of the GNU General Public License as published by +the Free Software Foundation, either version 3 of the License, or +(at your option) any later version. + +GNU Emacs is distributed in the hope that it will be useful, +but WITHOUT ANY WARRANTY; without even the implied warranty of +MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +GNU General Public License for more details. + +You should have received a copy of the GNU General Public License +along with GNU Emacs. If not, see . diff --git a/java/README b/java/README index fd4aa770f4b..9b6554481f6 100644 --- a/java/README +++ b/java/README @@ -1,6 +1,7 @@ This directory holds the Java sources of the port of GNU Emacs to Android-like systems, along with files needed to create an application -package out of them. +package out of them. If you need to build this port, please read the +document ``INSTALL.android''. The ``org/gnu/emacs'' subdirectory contains the Java sources under the ``org.gnu.emacs'' package identifier. diff --git a/src/coding.c b/src/coding.c index 3ac4ada2939..fbf10188819 100644 --- a/src/coding.c +++ b/src/coding.c @@ -8513,34 +8513,31 @@ from_unicode (Lisp_Object str) Lisp_Object from_unicode_buffer (const wchar_t *wstr) { - if (sizeof (wchar_t) == 2) - { - /* We get one of the two final null bytes for free. */ - ptrdiff_t len = 1 + sizeof (wchar_t) * wcslen (wstr); - AUTO_STRING_WITH_LEN (str, (char *) wstr, len); - return from_unicode (str); - } - else - { - /* This code is used only on Android, where little endian UTF-16 - strings are extended to 32-bit wchar_t. */ +#if defined WINDOWSNT || defined CYGWIN + /* We get one of the two final null bytes for free. */ + ptrdiff_t len = 1 + sizeof (wchar_t) * wcslen (wstr); + AUTO_STRING_WITH_LEN (str, (char *) wstr, len); + return from_unicode (str); +#else + /* This code is used only on Android, where little endian UTF-16 + strings are extended to 32-bit wchar_t. */ - uint16_t *words; - size_t length, i; + uint16_t *words; + size_t length, i; - length = wcslen (wstr) + 1; + length = wcslen (wstr) + 1; - USE_SAFE_ALLOCA; - SAFE_NALLOCA (words, sizeof *words, length); + USE_SAFE_ALLOCA; + SAFE_NALLOCA (words, sizeof *words, length); - for (i = 0; i < length - 1; ++i) - words[i] = wstr[i]; + for (i = 0; i < length - 1; ++i) + words[i] = wstr[i]; - words[i] = '\0'; - AUTO_STRING_WITH_LEN (str, (char *) words, - (length - 1) * sizeof *words); - return unbind_to (sa_count, from_unicode (str)); - } + words[i] = '\0'; + AUTO_STRING_WITH_LEN (str, (char *) words, + (length - 1) * sizeof *words); + return unbind_to (sa_count, from_unicode (str)); +#endif } wchar_t * -- 2.39.2