+ if f isa ExternCFile then cfiles.add(f.filename.basename)
+ end
+
+ # Prepare for the CMakeLists format
+ var target_link_libraries = new Array[String]
+ for flag in ldflags do
+ if flag.has_prefix("-l") then
+ target_link_libraries.add flag.substring_from(2)
+ end
+ end
+
+ # Download the libgc/bdwgc sources
+ var share_dir = share_dir
+ if not share_dir.file_exists then
+ print "Android project error: Nit share directory not found, please use the environment variable NIT_DIR"
+ exit 1
+ end
+
+ var bdwgc_dir = "{share_dir}/android-bdwgc/bdwgc"
+ if not bdwgc_dir.file_exists then
+ toolcontext.exec_and_check(["{share_dir}/android-bdwgc/setup.sh"], "Android project error")
+ end
+
+ # Compile the native app glue lib if used
+ var add_native_app_glue = ""
+ if target_link_libraries.has("native_app_glue") then
+ add_native_app_glue = """
+add_library(native_app_glue STATIC ${ANDROID_NDK}/sources/android/native_app_glue/android_native_app_glue.c)
+"""
+ end
+
+ var cmakelists = """
+cmake_minimum_required(VERSION 3.4.1)
+
+{{{add_native_app_glue}}}
+
+
+# libgc/bdwgc
+
+## The source is in the Nit repo
+set(lib_src_DIR {{{bdwgc_dir}}})
+set(lib_build_DIR ../libgc/outputs)
+file(MAKE_DIRECTORY ${lib_build_DIR})
+
+## Config
+add_definitions("-DGC_PTHREADS")
+set(enable_threads TRUE)
+set(CMAKE_USE_PTHREADS_INIT TRUE)
+
+## link_map is already defined in Android
+add_definitions("-DGC_DONT_DEFINE_LINK_MAP")
+
+## Silence warning
+set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -Wno-tautological-pointer-compare")
+
+add_subdirectory(${lib_src_DIR} ${lib_build_DIR} )
+include_directories(${lib_src_DIR}/include)
+
+
+# Nit generated code
+
+set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -DANDROID -DWITH_LIBGC")
+
+# Export ANativeActivity_onCreate(),
+# Refer to: https://github.com/android-ndk/ndk/issues/381.
+set(CMAKE_SHARED_LINKER_FLAGS "${CMAKE_SHARED_LINKER_FLAGS} -u ANativeActivity_onCreate")
+
+# name so source
+add_library(nit_app SHARED {{{cfiles.join("\n\t")}}} )
+
+target_include_directories(nit_app PRIVATE ${ANDROID_NDK}/sources/android/native_app_glue)
+
+
+# Link!
+
+target_link_libraries(nit_app gc-lib
+ {{{target_link_libraries.join("\n\t")}}})
+"""
+ cmakelists.write_to_file "{android_app_main}/cpp/CMakeLists.txt"
+
+ # ---
+ # /app/src/main/res/values/strings.xml for app name
+
+ # Set the default pretty application name
+ var res_values_dir = "{android_app_main}/res/values/"
+ res_values_dir.mkdir
+"""<?xml version="1.0" encoding="utf-8"?>
+<resources>
+ <string name="app_name">{{{app_name}}}</string>
+</resources>""".write_to_file res_values_dir/"strings.xml"
+
+ # ---
+ # Copy assets, resources in the Android project
+
+ ## Collect path to all possible folder where we can find the `android` folder
+ var app_files = [project_root]
+ app_files.add_all project.files
+
+ for path in app_files do
+ # Copy the assets folder
+ var assets_dir = path / "assets"
+ if assets_dir.file_exists then
+ assets_dir = assets_dir.realpath
+ toolcontext.exec_and_check(["cp", "-r", assets_dir, android_app_main], "Android project error")
+ end
+
+ # Copy the whole `android` folder
+ var android_dir = path / "android"
+ if android_dir.file_exists then
+ android_dir = android_dir.realpath
+ for f in android_dir.files do
+ toolcontext.exec_and_check(["cp", "-r", android_dir / f, android_app_main], "Android project error")
+ end
+ end