From: Jean Privat Date: Thu, 29 Jan 2015 11:59:01 +0000 (+0700) Subject: Merge: ldflags for Android X-Git-Tag: v0.7.1~3 X-Git-Url: http://nitlanguage.org?hp=-c Merge: ldflags for Android For the same module, cflags and ldflags can vary per platform. This new annotation on annotations targets a platform for each cflags or ldflags. By default, the target platform is that of the host. It will probably need to be clarified on more modules once we support more platforms. It will be used to load (or not load) OpenGL ES v1.0 vs 2.0 and libandroid in future PR. For now, only `calculator` should save on linking with OpenGL. I hesitated between different annotations before settling on `@android`: * `@target(android)` makes it clear that it is the target, but it gets a bit heavy to read: `module android_opengles1 is ldflags("-lEGL -lGLESv1_CM")@target(android)` * `@only(android)` makes it clear that only Android is affected by this annotation. * but `@android` is easy to read and clear enough to fit with an already complex syntax. TODO `cflags@android` declarations are accepted but unused at this time. Pull-Request: #1124 Reviewed-by: Lucas Bajolet Reviewed-by: Jean Privat Reviewed-by: Alexandre Terrasa --- 1772b949316cb3878b6717bf3a7ed2f419ba1c0f diff --combined lib/egl.nit index 4c24b57,4e36cd0..b664c8a --- a/lib/egl.nit +++ b/lib/egl.nit @@@ -21,7 -21,12 +21,12 @@@ # C library. If a method or class is not documented in Nit, refer to # the official documentation by the Khronos Group at: # http://www.khronos.org/registry/egl/sdk/docs/man/xhtml/ - module egl is pkgconfig + module egl is + pkgconfig + ldflags("-lEGL")@android + end + + import android::aware in "C Header" `{ #include @@@ -412,12 -417,6 +417,12 @@@ class EGLConfigChoose fun surface_type=(flag: Int) do insert_attrib_with_val(0x3033, flag) fun surface_type_egl do surface_type = 4 + # Set which client rendering APIs are supported + fun renderable_type=(flag: Int) do insert_attrib_with_val(0x3040, flag) + + # Set EGL as the only supported rendering API + fun renderable_type_egl do renderable_type = 4 + fun blue_size=(size: Int) do insert_attrib_with_val(0x3022, size) fun green_size=(size: Int) do insert_attrib_with_val(0x3023, size) fun red_size=(size: Int) do insert_attrib_with_val(0x3024, size) diff --combined src/ffi/c.nit index 1790f48,8da8ffe..495d4e6 --- a/src/ffi/c.nit +++ b/src/ffi/c.nit @@@ -31,13 -31,11 +31,13 @@@ class CLanguag redef fun compile_module_block(block, ecc, mmodule) do if block.is_c_header then - ecc.header_custom.add( block.location.as_line_pragma ) - ecc.header_custom.add( block.code ) + ecc.header_custom.add block.location.as_line_pragma + ecc.header_custom.add "\n" + ecc.header_custom.add block.code else if block.is_c_body then - ecc.body_custom.add( block.location.as_line_pragma ) - ecc.body_impl.add( block.code ) + ecc.body_impl.add block.location.as_line_pragma + ecc.body_impl.add "\n" + ecc.body_impl.add block.code end end @@@ -74,8 -72,14 +74,14 @@@ redef class Locatio end redef class MModule - var cflags = "" is writable - var ldflags = "" is writable + # FIXME make nullable the key of `cflags`, `ldflags` and `cppflags` when + # supported by the bootstrap + + # Custom options for the C compiler (CFLAGS) + var cflags = new MultiHashMap[String, String] + + # Custom options for the C linker (LDFLAGS) + var ldflags = new MultiHashMap[String, String] # Additional libraries needed for the compilation # Will be used with pkg-config diff --combined src/platform/android.nit index ffd90bc,fb13044..f4b04a6 --- a/src/platform/android.nit +++ b/src/platform/android.nit @@@ -34,6 -34,8 +34,8 @@@ en class AndroidPlatform super Platform + redef fun name do return "android" + redef fun supports_libgc do return true redef fun supports_libunwind do return false @@@ -61,16 -63,14 +63,16 @@@ class AndroidToolchai do var android_project_root = android_project_root.as(not null) var project = toolcontext.modelbuilder.android_project_for(compiler.mainmodule) - var short_project_name = compiler.mainmodule.name + var short_project_name = compiler.mainmodule.name.replace("-", "_") var release = toolcontext.opt_release.value var app_name = project.name if app_name == null then app_name = compiler.mainmodule.name + if not release then app_name += " Debug" var app_package = project.java_package if app_package == null then app_package = "org.nitlanguage.{short_project_name}" + if not release then app_package += "_debug" var app_version = project.version if app_version == null then app_version = "1.0" @@@ -138,12 -138,21 +140,21 @@@ end end - ## Generate delagating makefile + ## Generate delegating makefile dir = "{android_project_root}/jni/" """ include $(call all-subdir-makefiles) """.write_to_file("{dir}/Android.mk") + # Gather ldflags for Android + var ldflags = new Array[String] + var platform_name = "android" + for mmodule in compiler.mainmodule.in_importation.greaters do + if mmodule.ldflags.keys.has(platform_name) then + ldflags.add_all mmodule.ldflags[platform_name] + end + end + ### generate makefile into "{compile_dir}/Android.mk" dir = compile_dir """ @@@ -154,7 -163,7 +165,7 @@@ LOCAL_CFLAGS := -D ANDROID -D WITH_LIBG LOCAL_MODULE := main LOCAL_SRC_FILES := \\ {{{cfiles.join(" \\\n")}}} - LOCAL_LDLIBS := -llog -landroid -lEGL -lGLESv1_CM -lz libgc.a + LOCAL_LDLIBS := {{{ldflags.join(" ")}}} libgc.a LOCAL_STATIC_LIBRARIES := android_native_app_glue png include $(BUILD_SHARED_LIBRARY) @@@ -181,8 -190,7 +192,8 @@@ $(call import-module,android/native_app android:label="@string/app_name" android:hasCode="true" android:debuggable="{{{not release}}}" - {{{icon_declaration}}}> + {{{icon_declaration}}} + android:configChanges="mcc|mnc|locale|touchscreen|keyboard|keyboardHidden|navigation|screenLayout|fontScale|uiMode|orientation"> @@@ -292,7 -300,6 +303,7 @@@ redef fun compile_c_code(compiler, compile_dir) do var android_project_root = android_project_root.as(not null) + var short_project_name = compiler.mainmodule.name.replace("-", "_") var release = toolcontext.opt_release.value # Compile C code (and thus Nit) @@@ -309,7 -316,7 +320,7 @@@ var outname = outfile(compiler.mainmodule) if release then - var apk_path = "{android_project_root}/bin/{compiler.mainmodule.name}-release-unsigned.apk" + var apk_path = "{android_project_root}/bin/{short_project_name}-release-unsigned.apk" # Sign APK var keystore_path= "KEYSTORE".environ @@@ -339,7 -346,7 +350,7 @@@ toolcontext.exec_and_check(args, "Android project error") else # Move to the expected output path - args = ["mv", "{android_project_root}/bin/{compiler.mainmodule.name}-debug.apk", outname] + args = ["mv", "{android_project_root}/bin/{short_project_name}-debug.apk", outname] toolcontext.exec_and_check(args, "Android project error") end end