/* * Copyright (c) Facebook, Inc. and its affiliates. * * This source code is licensed under the MIT license found in the LICENSE file * in the root directory of this source tree. */ import org.apache.tools.ant.filters.ReplaceTokens // !!! // Increment this when making changes to any of the native // dependencies. // !!! final def CACHE_REVISION = 3 final def externalDir = new File("$projectDir/external") final def downloadsDir = new File("$externalDir/downloads") final def revisionFile = new File("$buildDir/external_cache_revision.txt") final def getDownloadFileName = { final URL src -> final def i = src.file.lastIndexOf('/') return src.file.substring(i + 1) } final def isCacheOutOfDate = { final Integer revision -> if (!revisionFile.exists()) { return true } else { final def content = revisionFile.text return !content.isInteger() || content as Integer != revision } } task createNativeDepsDirectories { buildDir.mkdirs() downloadsDir.mkdirs() externalDir.mkdirs() } task cleanNative(type: Delete) { delete externalDir } task downloadGlog(dependsOn: createNativeDepsDirectories, type: Download) { src 'https://github.com/google/glog/archive/v0.3.5.tar.gz' onlyIfNewer true overwrite false dest new File(downloadsDir, 'glog-' + getDownloadFileName(src)) } task prepareGlog(dependsOn: [downloadGlog], type: Copy) { onlyIf { isCacheOutOfDate(CACHE_REVISION) } from tarTree(downloadGlog.dest) from './overrides/glog/' include 'glog-0.3.5/src/**/*', 'Android.mk', 'config.h', 'build.gradle', 'CMakeLists.txt', 'ApplicationManifest.xml' includeEmptyDirs = false filesMatching('**/*.h.in') { filter(ReplaceTokens, tokens: [ ac_cv_have_unistd_h: '1', ac_cv_have_stdint_h: '1', ac_cv_have_systypes_h: '1', ac_cv_have_inttypes_h: '1', ac_cv_have_libgflags: '0', ac_google_start_namespace: 'namespace google {', ac_cv_have_uint16_t: '1', ac_cv_have_u_int16_t: '1', ac_cv_have___uint16: '0', ac_google_end_namespace: '}', ac_cv_have___builtin_expect: '1', ac_google_namespace: 'google', ac_cv___attribute___noinline: '__attribute__ ((noinline))', ac_cv___attribute___noreturn: '__attribute__ ((noreturn))', ac_cv___attribute___printf_4_5: '__attribute__((__format__ (__printf__, 4, 5)))' ]) it.path = (it.name - '.in') } into "$externalDir/glog" } task finalizeGlog(dependsOn: [prepareGlog], type: Copy) { from './overrides/glog/' include 'logging.cc' includeEmptyDirs = false into "$externalDir/glog/glog-0.3.5/src/" } task downloadDoubleConversion(dependsOn: createNativeDepsDirectories, type: Download) { src 'https://github.com/google/double-conversion/archive/v3.0.0.tar.gz' onlyIfNewer true overwrite false dest new File(downloadsDir, 'double-conversion-' + getDownloadFileName(src)) } task prepareDoubleConversion(dependsOn: [downloadDoubleConversion], type: Copy) { from tarTree(downloadDoubleConversion.dest) from './overrides/DoubleConversion/' include 'double-conversion-3.0.0/**/*', 'build.gradle', 'CMakeLists.txt', 'ApplicationManifest.xml' includeEmptyDirs = false into "$externalDir/double-conversion" } task downloadBoost(dependsOn: createNativeDepsDirectories, type: Download) { src 'https://github.com/react-native-community/boost-for-react-native/releases/download/v1.63.0-0/boost_1_63_0.tar.gz' onlyIfNewer true overwrite true dest new File(downloadsDir, getDownloadFileName(src)) } task prepareBoost(dependsOn: [downloadBoost], type: Copy) { from tarTree(resources.gzip(downloadBoost.dest)) include 'boost_1_63_0/boost/**/*.hpp', 'boost_1_63_0/boost/**/*.h', 'boost/boost/**/*.hpp', 'boost/boost/**/*.h' includeEmptyDirs = false into "$externalDir/boost" doLast { file("$externalDir/boost/boost").renameTo("$externalDir/boost/boost_1_63_0") } } task downloadFolly(dependsOn: createNativeDepsDirectories, type: Download) { src 'https://github.com/facebook/folly/archive/v2018.09.10.00.tar.gz' onlyIfNewer true overwrite false dest new File(downloadsDir, 'folly-' + getDownloadFileName(src)) } task prepareFolly(dependsOn: [downloadFolly], type: Copy) { onlyIf { isCacheOutOfDate(CACHE_REVISION) } from tarTree(downloadFolly.dest) from './overrides/Folly/' include 'folly-2018.09.10.00/folly/**/*', 'build.gradle', 'CMakeLists.txt', 'ApplicationManifest.xml' eachFile { it.path = it.path - "folly-2018.09.10.00/" } includeEmptyDirs = false into "$externalDir/folly" } //TODO: Get rid off this hack. task finalizeFollyWithDemangle(dependsOn: [prepareFolly], type: Copy) { from './overrides/Folly/' include 'Demangle.h' into "$externalDir/folly/folly/detail/" } //TODO: Get rid off this hack. task finalizeFolly(dependsOn: [finalizeFollyWithDemangle], type: Copy) { from './overrides/Folly/' include 'AsyncServerSocket.cpp' into "$externalDir/folly/folly/io/async/" } task downloadLibEvent(dependsOn: [], type: Download) { src 'https://github.com/priteshrnandgaonkar/libevent/archive/release-2.1.9.tar.gz' onlyIfNewer true overwrite false dest new File(downloadsDir, 'libevent-' + getDownloadFileName(src)) } task prepareLibEvent(dependsOn: [downloadLibEvent], type: Copy) { onlyIf { isCacheOutOfDate(CACHE_REVISION) } from tarTree(downloadLibEvent.dest) from './overrides/LibEvent/' include 'libevent-release-2.1.9/**/*', 'build.gradle', 'ApplicationManifest.xml' includeEmptyDirs = false into "$externalDir/LibEvent" } task finalizeLibEvent(dependsOn: [prepareLibEvent], type: Copy) { from './overrides/LibEvent/' include 'event-config.h' includeEmptyDirs = false into "$externalDir/LibEvent/libevent-release-2.1.9/include/event2/" } task downloadOpenSSLSource(dependsOn: [], type: Download) { src 'https://github.com/passy/openssl-android/releases/download/1.1.0h/openssl-1.1.0h.tar.gz' onlyIfNewer true overwrite false dest new File(downloadsDir, getDownloadFileName(src)) } task downloadOpenSSLLibs(dependsOn: [], type: Download) { src 'https://github.com/passy/openssl-android/releases/download/1.1.0h-r2/openssl-1.1.0h-r2-prebuilt.tar.gz' onlyIfNewer true overwrite false dest new File(downloadsDir, getDownloadFileName(src)) } task prepareOpenSSL(dependsOn: [downloadOpenSSLSource, downloadOpenSSLLibs], type: Copy) { onlyIf { isCacheOutOfDate(CACHE_REVISION) } from tarTree(downloadOpenSSLSource.dest) from tarTree(downloadOpenSSLLibs.dest) from './overrides/OpenSSL/' include 'openssl-1.1.0h/**/*' include 'libs/**/*' includeEmptyDirs = false into "$externalDir/OpenSSL/" } task configureOpenSSL(dependsOn: [prepareOpenSSL], type: Exec) { onlyIf { isCacheOutOfDate(CACHE_REVISION) } workingDir "$externalDir/OpenSSL/openssl-1.1.0h/" // This is only to generate a buildconfig.h in the next step. I **believe** // that the options here don't really matter for that file. commandLine './Configure', 'dist' } task finalizeOpenSSL(dependsOn: [configureOpenSSL], type: Exec) { workingDir "$externalDir/OpenSSL/openssl-1.1.0h/" commandLine 'make', 'build_generated' onlyIf { !file("$externalDir/OpenSSL/openssl-1.1.0h/include/openssl/opensslconf.h").exists() } } task downloadRSocket(dependsOn: [], type: Download) { src 'https://github.com/priteshrnandgaonkar/rsocket-cpp/archive/0.10.3.tar.gz' onlyIfNewer true overwrite false dest new File(downloadsDir, 'rsocket-' + getDownloadFileName(src)) } task prepareRSocket(dependsOn: [downloadRSocket], type: Copy) { from tarTree(downloadRSocket.dest) from './overrides/RSocket/' include 'rsocket-cpp-0.10.3/**/*', 'build.gradle', 'ApplicationManifest.xml', 'CMakeLists.txt' includeEmptyDirs = false into "$externalDir/RSocket" } task writeCacheRevision() { doLast { revisionFile.text = CACHE_REVISION.toString() } } def allTasks = [ finalizeGlog, prepareDoubleConversion, prepareBoost, finalizeFolly, finalizeLibEvent, finalizeOpenSSL, prepareRSocket, writeCacheRevision, ] allTasks.each { i -> i.onlyIf { isCacheOutOfDate(CACHE_REVISION) } } task prepareAllLibs() { onlyIf { isCacheOutOfDate(CACHE_REVISION) } dependsOn allTasks }