summary refs log tree commit diff
path: root/pkgs/development/mobile/androidenv/androidsdk.nix
diff options
context:
space:
mode:
Diffstat (limited to 'pkgs/development/mobile/androidenv/androidsdk.nix')
-rw-r--r--pkgs/development/mobile/androidenv/androidsdk.nix194
1 files changed, 194 insertions, 0 deletions
diff --git a/pkgs/development/mobile/androidenv/androidsdk.nix b/pkgs/development/mobile/androidenv/androidsdk.nix
new file mode 100644
index 000000000000..e8e1f919fe4e
--- /dev/null
+++ b/pkgs/development/mobile/androidenv/androidsdk.nix
@@ -0,0 +1,194 @@
+{ stdenv, stdenv_32bit, fetchurl, unzip, makeWrapper
+, platformTools, support, platforms, sysimages, addons
+, zlib_32bit
+, libX11_32bit, libxcb_32bit, libXau_32bit, libXdmcp_32bit, libXext_32bit
+, libX11, libXext, libXrender, libxcb, libXau, libXdmcp
+, freetype, fontconfig, gtk, atk
+}:
+{platformVersions, useGoogleAPIs}:
+
+stdenv.mkDerivation {
+  name = "android-sdk-21";
+  
+  src = if (stdenv.system == "i686-linux" || stdenv.system == "x86_64-linux")
+    then fetchurl {
+      url = http://dl.google.com/android/android-sdk_r21-linux.tgz;
+      md5 = "7f8d73b629f808cdcfc9f9900bbd7580";
+    }
+    else if stdenv.system == "x86_64-darwin" then fetchurl {
+      url = http://dl.google.com/android/android-sdk_r21-macosx.zip;
+      md5 = "67e46adca90dd18d7291443f6c15d6af";
+    }
+    else throw "platform not ${stdenv.system} supported!";
+  
+  buildCommand = ''
+    mkdir -p $out/libexec
+    cd $out/libexec
+    unpackFile $src;
+    
+    cd android-sdk-*/tools
+    
+    ${stdenv.lib.optionalString (stdenv.system == "i686-linux" || stdenv.system == "x86_64-linux")
+    ''
+      # There are a number of native binaries. We must patch them to let them find the interpreter and libstdc++
+    
+      for i in dmtracedump emulator emulator-arm emulator-mips emulator-x86 hprof-conv mksdcard sqlite3
+      do
+          patchelf --set-interpreter ${stdenv_32bit.gcc.libc}/lib/ld-linux.so.2 $i
+          patchelf --set-rpath ${stdenv_32bit.gcc.gcc}/lib $i
+      done
+    
+      ${stdenv.lib.optionalString (stdenv.system == "x86_64-linux") ''
+        # We must also patch the 64-bit emulator instances, if needed
+        
+        for i in emulator64-arm emulator64-mips emulator64-x86
+        do
+            patchelf --set-interpreter ${stdenv.gcc.libc}/lib/ld-linux-x86-64.so.2 $i
+            patchelf --set-rpath ${stdenv.gcc.gcc}/lib64 $i
+        done
+      ''}
+      
+      # These tools also need zlib in addition to libstdc++
+    
+      for i in etc1tool zipalign
+      do
+          patchelf --set-interpreter ${stdenv_32bit.gcc.libc}/lib/ld-linux.so.2 $i
+          patchelf --set-rpath ${stdenv_32bit.gcc.gcc}/lib:${zlib_32bit}/lib $i
+      done
+    
+      # The emulators need additional libraries, which are not in the RPATH => let's wrap them
+    
+      for i in emulator emulator-arm emulator-mips emulator-x86
+      do
+          wrapProgram `pwd`/$i \
+            --prefix LD_LIBRARY_PATH : `pwd`/lib:${libX11_32bit}/lib:${libxcb_32bit}/lib:${libXau_32bit}/lib:${libXdmcp_32bit}/lib:${libXext_32bit}/lib
+      done
+      
+      ${stdenv.lib.optionalString (stdenv.system == "x86_64-linux") ''
+        for i in emulator64-arm emulator64-mips emulator64-x86
+        do
+            wrapProgram `pwd`/$i \
+            --prefix LD_LIBRARY_PATH : `pwd`/lib:${libX11}/lib:${libxcb}/lib:${libXau}/lib:${libXdmcp}/lib:${libXext}/lib
+        done
+      ''}
+    ''}
+
+    patchShebangs .
+    
+    ${if stdenv.system == "i686-linux" then
+      ''
+        # The monitor requires some more patching
+        
+        cd lib/monitor-x86
+        patchelf --set-interpreter ${stdenv.gcc.libc}/lib/ld-linux.so.2 monitor
+        patchelf --set-rpath ${libX11}/lib:${libXext}/lib:${libXrender}/lib:${freetype}/lib:${fontconfig}/lib libcairo-swt.so
+        
+        wrapProgram `pwd`/monitor \
+          --prefix LD_LIBRARY_PATH : ${gtk}/lib:${atk}/lib:${stdenv.gcc.gcc}/lib
+
+        cd ../..
+      ''
+      else if stdenv.system == "x86_64-linux" then
+      ''
+        # The monitor requires some more patching
+        
+        cd lib/monitor-x86_64
+        patchelf --set-interpreter ${stdenv.gcc.libc}/lib/ld-linux-x86-64.so.2 monitor
+        patchelf --set-rpath ${libX11}/lib:${libXext}/lib:${libXrender}/lib:${freetype}/lib:${fontconfig}/lib libcairo-swt.so
+        
+        wrapProgram `pwd`/monitor \
+          --prefix LD_LIBRARY_PATH : ${gtk}/lib:${atk}/lib:${stdenv.gcc.gcc}/lib
+
+        cd ../..
+      ''
+      else ""}
+    
+    # Symlink the other sub packages
+    
+    cd ..
+    ln -s ${platformTools}/platform-tools
+    ln -s ${support}/support
+    
+    # Symlink required Google API add-ons
+    
+    mkdir -p add-ons
+    cd add-ons
+    
+    ${if useGoogleAPIs then
+        stdenv.lib.concatMapStrings (platformVersion:
+        if (builtins.hasAttr ("google_apis_"+platformVersion) addons) then
+          let
+            googleApis = builtins.getAttr ("google_apis_"+platformVersion) addons;
+          in
+          "ln -s ${googleApis}/* addon-google_apis-${platformVersion}"
+        else "") platformVersions
+      else ""}
+      
+    cd ..
+
+    # Symlink required platforms
+   
+    mkdir -p platforms
+    cd platforms
+    
+    ${stdenv.lib.concatMapStrings (platformVersion:
+      if (builtins.hasAttr ("platform_"+platformVersion) platforms) then
+        let
+          platform = builtins.getAttr ("platform_"+platformVersion) platforms;
+        in
+        "ln -s ${platform}/* android-${platformVersion}"
+      else ""
+    ) platformVersions}
+    
+    cd ..
+    
+    # Symlink required system images
+  
+    mkdir -p system-images
+    cd system-images
+    
+    ${stdenv.lib.concatMapStrings (platformVersion:
+      if (builtins.hasAttr ("sysimg_"+platformVersion) sysimages) then
+        let
+          sysimg = builtins.getAttr ("sysimg_"+platformVersion) sysimages;
+        in
+        ''
+          mkdir -p android-${platformVersion}
+          cd android-${platformVersion}
+          ln -s ${sysimg}/*
+          cd ..
+        ''
+      else ""
+    ) platformVersions}
+    
+    # Create wrappers to the most important tools and platform tools so that we can run them if the SDK is in our PATH
+    
+    ensureDir $out/bin
+
+    for i in $out/libexec/android-sdk-*/tools/*
+    do
+        if [ ! -d $i ] && [ -x $i ]
+        then
+            ( echo '#! ${stdenv.shell} -e'
+              echo "cd $out/libexec/android-sdk-*/tools"
+              echo "exec ./$(basename $i) \"\$@\"" ) > $out/bin/$(basename $i)
+          
+              chmod +x $out/bin/$(basename $i)
+        fi
+    done
+    
+    for i in $out/libexec/android-sdk-*/platform-tools/*
+    do
+        if [ ! -d $i ] && [ -x $i ]
+        then
+            ( echo '#! ${stdenv.shell} -e'
+              echo "cd $out/libexec/android-sdk-*/platform-tools"
+              echo "exec ./$(basename $i) \"\$@\"") > $out/bin/$(basename $i)
+          
+              chmod +x $out/bin/$(basename $i)
+        fi
+    done
+  '';
+  
+  buildInputs = [ unzip makeWrapper ];
+}