Merge: ldflags for Android
authorJean Privat <jean@pryen.org>
Thu, 29 Jan 2015 11:59:01 +0000 (18:59 +0700)
committerJean Privat <jean@pryen.org>
Thu, 29 Jan 2015 11:59:01 +0000 (18:59 +0700)
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 <r4pass@hotmail.com>
Reviewed-by: Jean Privat <jean@pryen.org>
Reviewed-by: Alexandre Terrasa <alexandre@moz-code.org>

1  2 
lib/egl.nit
src/ffi/c.nit
src/platform/android.nit

diff --combined lib/egl.nit
  # 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 <EGL/egl.h>
@@@ -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
@@@ -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
@@@ -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"
                        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">
  
          <!-- Our activity is the built-in NativeActivity framework class.
               This will take care of integrating with our NDK code. -->
        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)
                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
                        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