diff --git a/.gitignore b/.gitignore index 2ed2cdd3f..46f53eccd 100644 --- a/.gitignore +++ b/.gitignore @@ -6,3 +6,6 @@ build # Ignore Gradle local options local.properties + +# Ignore Qt Creator local CMake configuration +CMakeLists.txt.user diff --git a/.gitlab-ci.yml b/.gitlab-ci.yml new file mode 100644 index 000000000..76fb3e4b7 --- /dev/null +++ b/.gitlab-ci.yml @@ -0,0 +1,33 @@ +android-AAR-minapi16: + image: registry.gitlab.com/retroshare/retroshare:android_aar_base_16 + script: + - > + ./gradlew build publish + -Dorg.gradle.project.buildDir=/libretroshare-build/ + -PANDROID_MIN_API_LEVEL=16 + -PLIBRETROSHARE_SOURCE_VERSION="$CI_COMMIT_SHORT_SHA" + -PNATIVE_TOOLCHAINS_DIR="/libretroshare-native-toolchains/" + +android-AAR-minapi21: + image: registry.gitlab.com/retroshare/retroshare:android_aar_base_21 + script: + - > + ./gradlew build publish + -Dorg.gradle.project.buildDir=/libretroshare-build/ + -PANDROID_MIN_API_LEVEL=21 + -PLIBRETROSHARE_SOURCE_VERSION="$CI_COMMIT_SHORT_SHA" + -PNATIVE_TOOLCHAINS_DIR="/libretroshare-native-toolchains/" + tags: + - storage50 + +android-AAR-minapi24: + image: registry.gitlab.com/retroshare/retroshare:android_aar_base_24 + script: + - > + ./gradlew build publish + -Dorg.gradle.project.buildDir=/libretroshare-build/ + -PANDROID_MIN_API_LEVEL=24 + -PLIBRETROSHARE_SOURCE_VERSION="$CI_COMMIT_SHORT_SHA" + -PNATIVE_TOOLCHAINS_DIR="/libretroshare-native-toolchains/" + tags: + - storage50 diff --git a/CMakeLists.txt b/CMakeLists.txt index 64dd17dd9..8b499aafd 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -1,7 +1,7 @@ # RetroShare decentralized communication platform # -# Copyright (C) 2021 Gioacchino Mazzurco -# Copyright (C) 2021 Asociación Civil Altermundi +# Copyright (C) 2021-2022 Gioacchino Mazzurco +# Copyright (C) 2021-2022 Asociación Civil Altermundi # # SPDX-License-Identifier: CC0-1.0 @@ -131,6 +131,17 @@ option( "Export libretroshare JNI_OnLoad. See src/rs_android/rsjni.cpp for details" ON ) +option( + RS_DEVELOPMENT_BUILD + "Disable optimization to speed up build, enable verbose build log. \ + just for development purposes, not suitable for library usage" + OFF ) + +option( + RS_ANDROID + "Enable when compiling libretroshare for Android" + OFF ) + ################################################################################ find_package(Git REQUIRED) @@ -148,6 +159,13 @@ find_package(Git REQUIRED) ################################################################################ +if(RS_DEVELOPMENT_BUILD) + set(CMAKE_VERBOSE_MAKEFILE ON) + set(CMAKE_EXPORT_COMPILE_COMMANDS ON) +endif(RS_DEVELOPMENT_BUILD) + +################################################################################ + include(src/CMakeLists.txt) list(TRANSFORM RS_SOURCES PREPEND src/) list(TRANSFORM RS_PUBLIC_HEADERS PREPEND src/) @@ -170,6 +188,14 @@ target_include_directories( install(TARGETS ${PROJECT_NAME} LIBRARY DESTINATION ${CMAKE_INSTALL_LIBDIR}) +if(RS_DEVELOPMENT_BUILD) + target_compile_options(${PROJECT_NAME} PRIVATE "-O0") +endif(RS_DEVELOPMENT_BUILD) + +if(RS_ANDROID) + target_link_libraries(${PROJECT_NAME} PRIVATE log) +endif(RS_ANDROID) + # TODO: install public headers find_package(OpenSSL REQUIRED) @@ -187,7 +213,7 @@ if(EXISTS "${OPENPGPSDK_DEVEL_DIR}/.git" ) else() FetchContent_Declare( openpgpsdk - GIT_REPOSITORY "https://gitlab.com/RetroShare/openpgpsdk.git" + GIT_REPOSITORY "https://gitlab.com/RetroShare/OpenPGP-SDK.git" GIT_TAG "origin/master" GIT_SHALLOW TRUE GIT_PROGRESS TRUE @@ -211,7 +237,7 @@ if(RS_BITDHT) else() FetchContent_Declare( bitdht - GIT_REPOSITORY "https://gitlab.com/RetroShare/bitdht.git" + GIT_REPOSITORY "https://gitlab.com/RetroShare/BitDHT.git" GIT_TAG "origin/master" GIT_SHALLOW TRUE GIT_PROGRESS TRUE @@ -269,7 +295,7 @@ if(RS_JSON_API) APPEND "${JSON_API_GENERATOR_DOXYFILE}" "OUTPUT_DIRECTORY=${JSONAPI_GENERATOR_OUTPUT_DIR}\n" - "INPUT=${CMAKE_CURRENT_SOURCE_DIR}" ) + "INPUT=${CMAKE_CURRENT_SOURCE_DIR}/src/" ) add_custom_command( OUTPUT @@ -292,6 +318,12 @@ if(RS_JSON_API) set(BUILD_TESTS OFF CACHE BOOL "Do not build restbed tests") set(BUILD_SSL OFF CACHE BOOL "Do not build restbed SSL support") + if(NOT RS_ANDROID) + ## At moment depending on restbed this way doesn't seems to work at least on + ## Android due to upstream CMake file limitation, patches should be sent + ## upstream. Restbed is therefore compiled by Android toolchain preparation + ## script + FetchContent_Declare( restbed GIT_REPOSITORY "https://github.com/Corvusoft/restbed.git" @@ -303,11 +335,18 @@ if(RS_JSON_API) ) FetchContent_MakeAvailable(restbed) - target_link_libraries(${PROJECT_NAME} PRIVATE restbed) - ## TODO: work around target_include_directories should be added upstream include_directories(${restbed_SOURCE_DIR}/source/) + ## TODO: work around target_link_libraries should be added upstream + ## The workaround doesn't work as per documentation + ## https://cmake.org/cmake/help/latest/command/link_directories.html + ## "The command will apply only to targets created after it is called." + #link_directories(${restbed_BINARY_DIR}) + endif(NOT RS_ANDROID) + + target_link_libraries(${PROJECT_NAME} PRIVATE restbed) + add_compile_definitions(RS_JSONAPI) endif(RS_JSON_API) @@ -362,6 +401,7 @@ endif(RS_DH_PRIME_INIT_CHECK) if(RS_MINIUPNPC) add_compile_definitions(RS_USE_LIBMINIUPNPC) + target_link_libraries(${PROJECT_NAME} PRIVATE miniupnpc) endif(RS_MINIUPNPC) if(RS_LIBUPNP) @@ -452,6 +492,3 @@ endif(RS_ANDROID) #endif(CMAKE_SYSTEM_NAME STREQUAL "Android") ################################################################################ - -## Useful to debug CMake -set(CMAKE_EXPORT_COMPILE_COMMANDS ON) diff --git a/README.asciidoc b/README.asciidoc new file mode 100644 index 000000000..a71ea178a --- /dev/null +++ b/README.asciidoc @@ -0,0 +1,25 @@ +// SPDX-FileCopyrightText: 2022 Retroshare Team +// SPDX-FileCopyrightText: 2022 Gioacchino Mazzurco +// SPDX-FileCopyrightText: 2022 Asociación Civil Altermundi +// SPDX-License-Identifier: CC-BY-SA-4.0 + += RetroShare library + +RetroShare is a decentralized, private, secure, cross-platform, communication +software. + +RetroShare functionalities (file sharing, chat, messages, forums, channels...) +are implemented under the hood by libretroshare which offer a documented C++ and +JSON API. + +While RetroShare is an application on it's own, libretroshare is meant to be +used as part of other programs, some of them are +https://retroshare.cc[RetroShare-gui], +https://retroshare.cc[RetroShare-service], +https://elrepo.io/[elRepo.io] +(let us know if there are more). + + +=== Continuous integration + +image:https://gitlab.com/RetroShare/libretroshare/badges/master/pipeline.svg[link="https://gitlab.com/RetroShare/libretroshare/-/commits/master",title="pipeline status"] diff --git a/build.gradle b/build.gradle index 69eeb1d02..35173edd7 100644 --- a/build.gradle +++ b/build.gradle @@ -7,6 +7,24 @@ * SPDX-License-Identifier: CC0-1.0 */ +/* + * Set minumum Android API level supported by this build passing + * -PANDROID_MIN_API_LEVEL=16 (change 16 to what you need) on the gradle command + * line. + * + * LIBRETROSHARE_SOURCE_VERSION Set source version ex: + * -PLIBRETROSHARE_SOURCE_VERSION="$(git describe --always)" + * + * Optionally set JNI_NATIVE_LIBS_ARCHS to a space separated target CPU + * architectures list named as seen in AAR native libraries directories passing + * -PJNI_NATIVE_LIBS_ARCHS="arm64-v8a armeabi-v7a" defaults to all architectures + * supported by current script at current Android minimum API + * + * Optionally set NATIVE_TOOLCHAINS_DIR for easier reuse of toolchains which + * take a lot to build and doesn't change often + * -PNATIVE_TOOLCHAINS_DIR="/native/toolchains/path" + */ + buildscript { repositories @@ -32,6 +50,74 @@ allprojects } } +apply plugin: 'com.android.library' +apply plugin: 'maven-publish' + +ext.getAndroidMinApiLevel = +{ -> + if(project.hasProperty('ANDROID_MIN_API_LEVEL')) + { + return ANDROID_MIN_API_LEVEL.toInteger(); + } + else + { + return 16 + } +} + +ext.getJniNativeLibsArchs = +{ -> + if(project.hasProperty('JNI_NATIVE_LIBS_ARCHS')) + { + return JNI_NATIVE_LIBS_ARCHS.split(' ') as List + } + else + { + if(getAndroidMinApiLevel() <= 16) + { + return ['armeabi-v7a'] + } + else + { + return ['arm64-v8a', 'armeabi-v7a'] + } + } +} + +ext.getLibretroshareSourceVersion = +{ -> + if(project.hasProperty('LIBRETROSHARE_SOURCE_VERSION')) + { + return LIBRETROSHARE_SOURCE_VERSION + } + else + { + return 'unspecified' + } +} + +ext.getNativeToolchainsDir = +{ -> + if(project.hasProperty('NATIVE_TOOLCHAINS_DIR')) + { + return NATIVE_TOOLCHAINS_DIR + } + else + { + return "${buildDir}/native_toolchains/" + } +} + +ext.getjniLibsDir = +{ -> + return "${buildDir}/native_libs/" +} + +ext.getArtifactBaseName = +{ -> + return project.name + "-MinApiLevel" + getAndroidMinApiLevel() +} + ext.buildLibretroshareNativeLib = { pApiLevel, /* Android API level */ @@ -58,13 +144,13 @@ ext.buildLibretroshareNativeLib = break; } - def toolchainsWorkdir = "${buildDir}/native_toolchains/" + def toolchainsWorkdir = getNativeToolchainsDir() mkdir toolchainsWorkdir def currToolchainPath = "$toolchainsWorkdir/$pApiLevel-$toolchainArch/" // Todo: use proper way to resolve the script path - def toolChainScriptPath = "${projectDir}/../build_scripts/Android/prepare-toolchain-clang.sh" + def toolChainScriptPath = "${projectDir}/misc/Android/prepare-toolchain-clang.sh" if(!pReuseToolchain || !file(currToolchainPath).exists()) { @@ -75,11 +161,11 @@ ext.buildLibretroshareNativeLib = environment "NATIVE_LIBS_TOOLCHAIN_PATH", currToolchainPath environment "ANDROID_PLATFORM_VER", pApiLevel environment "ANDROID_NDK_ARCH", toolchainArch - commandLine toolChainScriptPath /*, 'build_libretroshare'*/ + commandLine toolChainScriptPath } } else - {/* + { exec { workingDir toolchainsWorkdir @@ -88,35 +174,65 @@ ext.buildLibretroshareNativeLib = environment "ANDROID_PLATFORM_VER", pApiLevel environment "ANDROID_NDK_ARCH", toolchainArch commandLine toolChainScriptPath, 'build_libretroshare' - }*/ + } } - def nativeLibsDir = "${buildDir}/native_libs-$pApiLevel/" - mkdir nativeLibsDir + mkdir getjniLibsDir() - def currAbiLibDir = "${nativeLibsDir}/$pAbi/" + def currAbiLibDir = "${getjniLibsDir()}/$pAbi/" mkdir currAbiLibDir copy { from "${currToolchainPath}/sysroot/usr/lib/libretroshare.so" into currAbiLibDir } - + copy { from "${currToolchainPath}/sysroot/usr/lib/${libcxxsharedTriple}/libc++_shared.so" into currAbiLibDir } + + copy + { + from "${currToolchainPath}/sysroot/usr/lib/${libcxxsharedTriple}/${pApiLevel}/liblog.so" + into currAbiLibDir + } } -apply plugin: 'com.android.library' -apply plugin: 'maven-publish' +task prepareRetroshareNativeLibs +{ + doLast + { + def pNdkPath = android.getNdkDirectory().getAbsolutePath() + getJniNativeLibsArchs().each + { + abi -> + buildLibretroshareNativeLib(getAndroidMinApiLevel(), abi, pNdkPath) + } + } +} +preBuild.dependsOn prepareRetroshareNativeLibs android { // see https://stackoverflow.com/questions/27301867/what-is-compilesdkversion compileSdkVersion 21 + ndkVersion "21.0.6113669" + + defaultConfig + { + minSdkVersion getAndroidMinApiLevel() + targetSdkVersion 28 + + /* Prevent proguard run at applications build time, to alter + * libretroshare Java classes that are used by libretroshare C++ code */ + consumerProguardFiles 'misc/Android/proguard-keep-libretroshare-java-classes.pro' + } + + setProperty("archivesBaseName", getArtifactBaseName()) + sourceSets { main @@ -124,22 +240,7 @@ android java.srcDirs = [ 'src/rs_android/' ] manifest.srcFile 'src/rs_android/AndroidManifest.xml' assets.srcDirs = [ "${buildDir}/libretroshare-build/android-assets/" ] - jniLibs.srcDirs = [ "${buildDir}/native_libs-16" ] - } - - minApi16 - { - jniLibs.srcDirs = [ "${buildDir}/native_libs-16" ] - } - - minApi21 - { - jniLibs.srcDirs = [ "${buildDir}/native_libs-21" ] - } - - minApi24 - { - jniLibs.srcDirs = [ "${buildDir}/native_libs-24" ] + jniLibs.srcDirs = [ getjniLibsDir() ] } } @@ -148,48 +249,6 @@ android disable 'LongLogTag' } - flavorDimensions 'api' - - def currNdk = android.getNdkDirectory().getAbsolutePath() - - productFlavors - { - minApi16 - { - minSdkVersion '16' - targetSdkVersion '16' - - def currApi = minSdkVersion.mApiLevel - versionNameSuffix "-API_${currApi}" - - buildLibretroshareNativeLib(currApi, "armeabi-v7a", currNdk) - } - - minApi21 - { - minSdkVersion '21' - targetSdkVersion '21' - - def currApi = minSdkVersion.mApiLevel - versionNameSuffix "-API_${currApi}" - - buildLibretroshareNativeLib(currApi, "arm64-v8a", currNdk) - buildLibretroshareNativeLib(currApi, "armeabi-v7a", currNdk) - } - - minApi24 - { - minSdkVersion '24' - targetSdkVersion '28' - - def currApi = minSdkVersion.mApiLevel - versionNameSuffix "-API_${currApi}" - - buildLibretroshareNativeLib(currApi, "arm64-v8a", currNdk) - buildLibretroshareNativeLib(currApi, "armeabi-v7a", currNdk) - } - } - publishing { multipleVariants @@ -206,21 +265,37 @@ afterEvaluate // see https://developer.android.com/reference/tools/gradle-api/7.1/com/android/build/api/dsl/LibraryPublishing publications { - android.libraryVariants.each + debug(MavenPublication) { - variant -> - - publishing.publications.create(variant.name, MavenPublication) + groupId = 'org.retroshare.service' + artifactId "${getArtifactBaseName()}-debug" + version getLibretroshareSourceVersion() + artifact bundleReleaseAar + } + release(MavenPublication) + { + groupId = 'org.retroshare.service' + artifactId "${getArtifactBaseName()}-release" + version getLibretroshareSourceVersion() + artifact bundleReleaseAar + } + } + repositories + { + maven + { + url = uri("https://gitlab.com/api/v4/projects/${System.getenv('CI_PROJECT_ID')}/packages/maven") + name = "Gitlab" + credentials(HttpHeaderCredentials) { - from components.findByName(variant.name) - groupId = 'org.retroshare.service' - // -${variant.flavorName} - artifactId "${rootProject.name}-${variant.name}" - version "0.6.6" - - artifacts = [ "${buildDir}/outputs/aar/${rootProject.name}-${variant.flavorName}-${variant.buildType.name}.aar" ] + name = "Job-Token" + value = System.getenv("CI_JOB_TOKEN") + } + authentication + { + header(HttpHeaderAuthentication) } } } - } + } } diff --git a/misc/Android/Dockerfile-AAR b/misc/Android/Dockerfile-AAR new file mode 100644 index 000000000..d5341f5e6 --- /dev/null +++ b/misc/Android/Dockerfile-AAR @@ -0,0 +1,66 @@ +## To prepare an image suitable as base for Gitlab CI use +## image name must match gitlab repository name, you can play just with the tag +## the part after : +# export ANDROID_MIN_API_LEVEL=16 +# export CI_IMAGE_NAME="registry.gitlab.com/retroshare/retroshare:android_aar_base_$ANDROID_MIN_API_LEVEL" +# docker build --squash --tag "${CI_IMAGE_NAME}" --build-arg ANDROID_MIN_API_LEVEL=$ANDROID_MIN_API_LEVEL --build-arg LIBRETROSHARE_SOURCE_VERSION="$(git describe --always)" --file misc/Android/Dockerfile-AAR . + +## --squash is very important in case of GitlabCI shared runners as they are +## limited to 25GB disk size + +## To push it to gitlab CI registry you need first to login and the to push +# docker login registry.gitlab.com +# docker push ${CI_IMAGE_NAME} + +FROM ubuntu:21.10 + +ENV DEBIAN_FRONTEND=noninteractive +ENV APT_UNAT="--assume-yes --quiet" + +RUN apt-get update $APT_UNAT && apt-get upgrade --show-upgraded $APT_UNAT && \ + apt-get clean $APT_UNAT +RUN apt-get install --no-install-recommends $APT_UNAT \ + bash build-essential bzip2 cmake curl chrpath doxygen \ + git python python3 tclsh unzip wget zip + +# Dependencies to create Android pkg +RUN apt-get install --no-install-recommends $APT_UNAT \ + openjdk-11-jre openjdk-11-jdk openjdk-11-jdk-headless + +ENV ANDROID_SDK_PATH="/opt/android-sdk" +ENV ANDROID_HOME="$ANDROID_SDK_PATH" +ENV ANDROID_SDK_ROOT="$ANDROID_SDK_PATH" +ENV JAVA_HOME="/usr/lib/jvm/java-11-openjdk-amd64/" + +ARG SOURCE_PATH=./ +COPY $SOURCE_PATH /libretroshare + +WORKDIR /libretroshare-build/ +RUN /libretroshare/misc/Android/prepare-toolchain-clang.sh install_android_sdk + +WORKDIR /libretroshare/ +ARG ANDROID_MIN_API_LEVEL=16 +ARG LIBRETROSHARE_SOURCE_VERSION="Dockerfile_AAR_unset" +ENV NATIVE_TOOLCHAINS_DIR="/libretroshare-native-toolchains/" +RUN ./gradlew build -Dorg.gradle.project.buildDir=/libretroshare-build/ \ + -PANDROID_MIN_API_LEVEL=$ANDROID_MIN_API_LEVEL \ + -PNATIVE_TOOLCHAINS_DIR=$NATIVE_TOOLCHAINS_DIR \ + -PLIBRETROSHARE_SOURCE_VERSION="$LIBRETROSHARE_SOURCE_VERSION" + +WORKDIR / + +## Save generated AAR to make life easier to newcomers that might want to use +## this just to build the libretroshare AAR +RUN mv /libretroshare-build/outputs/aar/ /libretroshare-aar/ + +## Cleanup all the rest now unneded stuff so squashing is more effective +RUN rm -rf /libretroshare-build/ + +## Clean reamining cruft inside native_toolchains +RUN rm -rf $NATIVE_TOOLCHAINS_DIR/*-build + +## Clean apt cache +RUN apt-get clean && rm -rf /var/lib/apt/lists/* + +## No need to keep sources inside the image +RUN rm -rf /libretroshare/ diff --git a/misc/Android/README.asciidoc b/misc/Android/README.asciidoc index c47974161..682576b1f 100644 --- a/misc/Android/README.asciidoc +++ b/misc/Android/README.asciidoc @@ -212,8 +212,8 @@ export ANDROID_NDK_LLVM_STRIP="${ANDROID_NDK_PATH}/toolchains/llvm/prebuilt/linu cat > "${ANDROID_NDK_LLVM_STRIP}" << LLVMSTRIPTRICK #!/bin/bash -echo "\${2}" | grep -q Debug || - "${ANDROID_NDK_LLVM_STRIP}.back" --strip-all "\${2}" +echo "\${@}" | grep -q Debug || + "${ANDROID_NDK_LLVM_STRIP}.back" "\${@}" LLVMSTRIPTRICK diff --git a/misc/Android/prepare-toolchain-clang.sh b/misc/Android/prepare-toolchain-clang.sh index 4519d591d..a6624adde 100755 --- a/misc/Android/prepare-toolchain-clang.sh +++ b/misc/Android/prepare-toolchain-clang.sh @@ -39,14 +39,10 @@ define_default_value ANDROID_PLATFORM_VER "16" define_default_value NATIVE_LIBS_TOOLCHAIN_PATH "${HOME}/Builds/android-toolchains/retroshare-android-${ANDROID_PLATFORM_VER}-${ANDROID_NDK_ARCH}/" define_default_value HOST_NUM_CPU $(nproc) -define_default_value ANDROID_SDK_INSTALL "false" -define_default_value ANDROID_SDK_TOOLS_VERSION "3859397" -define_default_value ANDROID_SDK_TOOLS_SHA256 444e22ce8ca0f67353bda4b85175ed3731cae3ffa695ca18119cbacef1c1bea0 +define_default_value ANDROID_CMD_TOOLS_VERSION "8092744" +define_default_value ANDROID_CMD_TOOLS_SHA256 d71f75333d79c9c6ef5c39d3456c6c58c613de30e6a751ea0dbd433e8f8b9cbf define_default_value ANDROID_SDK_VERSION "29.0.3" - -define_default_value ANDROID_NDK_INSTALL "false" -define_default_value ANDROID_NDK_VERSION "r21" -define_default_value ANDROID_NDK_SHA256 b65ea2d5c5b68fb603626adcbcea6e4d12c68eb8a73e373bbb9d23c252fc647b +define_default_value ANDROID_NDK_VERSION "21.0.6113669" define_default_value BZIP2_SOURCE_VERSION "1.0.6" define_default_value BZIP2_SOURCE_SHA256 a2848f34fcd5d6cf47def00461fcb528a0484d8edef8208d6d2e2909dc61d9cd @@ -73,6 +69,7 @@ define_default_value QT_INSTALL_PATH "${NATIVE_LIBS_TOOLCHAIN_PATH}/Qt/" define_default_value QT_ANDROID_INSTALLER_SHA256 a214084e2295c9a9f8727e8a0131c37255bf724bfc69e80f7012ba3abeb1f763 +## TODO: Report that 4.8 doesn't compile for Android and test newer versions define_default_value RESTBED_SOURCE_REPO "https://github.com/Corvusoft/restbed.git" define_default_value RESTBED_SOURCE_VERSION f74f9329dac82e662c1d570b7cd72c192b729eb4 @@ -313,35 +310,30 @@ DUPLICATED_INCLUDES_DIR="${REPORT_DIR}/duplicated_includes/" task_register install_android_sdk install_android_sdk() { - tFile="sdk-tools-linux-${ANDROID_SDK_TOOLS_VERSION}.zip" +# old SDK manager has been deprecated use new cmdline-tools as per +# https://stackoverflow.com/a/65782803 +# https://developer.android.com/studio#command-tools - verified_download "${tFile}" "${ANDROID_SDK_TOOLS_SHA256}" \ + tFile="commandlinetools-linux-${ANDROID_CMD_TOOLS_VERSION}_latest.zip" + + verified_download "${tFile}" "${ANDROID_CMD_TOOLS_SHA256}" \ "https://dl.google.com/android/repository/${tFile}" unzip "${tFile}" - mkdir -p "$ANDROID_SDK_PATH" - rm -rf "$ANDROID_SDK_PATH/tools/" - mv --verbose tools/ "$ANDROID_SDK_PATH/tools/" + rm -rf "$ANDROID_SDK_PATH" + CMD_TOOLS_DIR="$ANDROID_SDK_PATH/cmdline-tools/latest/" + mkdir -p "$CMD_TOOLS_DIR" + rm -rf "$CMD_TOOLS_DIR" + mv --verbose cmdline-tools/ "$CMD_TOOLS_DIR" + + ANDROID_SDK_MANAGER="$CMD_TOOLS_DIR/bin/sdkmanager --sdk_root=$ANDROID_SDK_PATH" # Install Android SDK - yes | $ANDROID_SDK_PATH/tools/bin/sdkmanager --licenses && \ - $ANDROID_SDK_PATH/tools/bin/sdkmanager --update - $ANDROID_SDK_PATH/tools/bin/sdkmanager "platforms;android-$ANDROID_PLATFORM_VER" - $ANDROID_SDK_PATH/tools/bin/sdkmanager "build-tools;$ANDROID_SDK_VERSION" -} - -task_register install_android_ndk -install_android_ndk() -{ - tFile="android-ndk-${ANDROID_NDK_VERSION}-linux-x86_64.zip" - - verified_download "${tFile}" "${ANDROID_NDK_SHA256}" \ - "https://dl.google.com/android/repository/${tFile}" - - unzip "${tFile}" - mkdir -p "$ANDROID_NDK_PATH" - rm -rf "$ANDROID_NDK_PATH" - mv --verbose "android-ndk-${ANDROID_NDK_VERSION}/" "$ANDROID_NDK_PATH/" + yes | $ANDROID_SDK_MANAGER --licenses && \ + $ANDROID_SDK_MANAGER --update + $ANDROID_SDK_MANAGER "platforms;android-$ANDROID_PLATFORM_VER" + $ANDROID_SDK_MANAGER "build-tools;$ANDROID_SDK_VERSION" + $ANDROID_SDK_MANAGER "ndk;$ANDROID_NDK_VERSION" } ## More information available at https://android.googlesource.com/platform/ndk/+/ics-mr0/docs/STANDALONE-TOOLCHAIN.html @@ -633,7 +625,7 @@ build_xapian() https://oligarchy.co.uk/xapian/${XAPIAN_SOURCE_VERSION}/$D_file rm -rf $B_dir tar -xf $D_file - cd $B_dir + pushd $B_dir B_endiannes_detection_failure_workaround="ac_cv_c_bigendian=no" B_large_file="" [ "${ANDROID_PLATFORM_VER}" -lt "24" ] && B_large_file="--disable-largefile" @@ -645,7 +637,10 @@ build_xapian() --prefix="${PREFIX}" --with-sysroot="${SYSROOT}" make -j${HOST_NUM_CPU} make install - cd .. + + # TODO: Fix upstream Xapian CMake package to find static library + sed -i 's/libxapian.so/libxapian.a/g' "${SYSROOT}/usr/lib/cmake/xapian/xapian-config.cmake" + popd } task_register build_miniupnpc @@ -858,22 +853,18 @@ build_mvptree() task_register build_libretroshare build_libretroshare() { - S_dir="/home/gio/Development/rs-develop/libretroshare" + S_dir="$RS_SRC_DIR" B_dir="libretroshare-build" - -# -DCMAKE_SYSTEM_NAME="Android" \ -# -DCMAKE_ANDROID_NDK="$ANDROID_NDK_PATH" \ -# -DCMAKE_SYSTEM_VERSION=$ANDROID_PLATFORM_VER \ - -# -D RS_FORUM_DEEP_INDEX=ON -D RS_JSON_API=ON \ rm -rf $B_dir; mkdir $B_dir ; pushd $B_dir andro_cmake -B. -H${S_dir} -DCMAKE_BUILD_TYPE=Release \ -D RS_ANDROID=ON -D RS_WARN_DEPRECATED=OFF -D RS_WARN_LESS=ON \ -D RS_LIBRETROSHARE_STATIC=OFF -D RS_LIBRETROSHARE_SHARED=ON \ - -D RS_BRODCAST_DISCOVERY=ON -D RS_EXPORT_JNI_ONLOAD=ON - make -j${HOST_NUM_CPU} - make install + -D RS_BRODCAST_DISCOVERY=ON -D RS_EXPORT_JNI_ONLOAD=ON \ + -D RS_SQLCIPHER=OFF -D RS_DH_PRIME_INIT_CHECK=OFF \ + -D RS_FORUM_DEEP_INDEX=ON -D RS_JSON_API=ON || return $? + make -j${HOST_NUM_CPU} || return $? + make install || return $? popd } @@ -891,7 +882,7 @@ build_default_toolchain() task_run build_openssl || return $? task_run build_sqlcipher || return $? task_run build_rapidjson || return $? -# task_run build_restbed || return $? + task_run build_restbed || return $? # task_run build_udp-discovery-cpp || return $? task_run build_xapian || return $? task_run build_miniupnpc || return $? diff --git a/misc/Android/proguard-keep-libretroshare-java-classes.pro b/misc/Android/proguard-keep-libretroshare-java-classes.pro new file mode 100644 index 000000000..e3097c2d0 --- /dev/null +++ b/misc/Android/proguard-keep-libretroshare-java-classes.pro @@ -0,0 +1,2 @@ +# Keep libretroshare Java classes +-keep class org.retroshare.service.** { *; } diff --git a/src/CMakeLists.txt b/src/CMakeLists.txt index f80ba0b08..0b98b1884 100644 --- a/src/CMakeLists.txt +++ b/src/CMakeLists.txt @@ -138,9 +138,10 @@ endif(RS_JSON_API) list( APPEND RS_SOURCES - pgp/pgpkeyutil.cc + pgp/openpgpsdkhandler.cc pgp/pgpauxutils.cc pgp/pgphandler.cc + pgp/pgpkeyutil.cc pgp/rscertificate.cc ) #./plugins/dlfcn_win32.cc @@ -148,7 +149,10 @@ list( #./plugins/pluginmanager.h #./plugins/rscacheservice.h #./plugins/rspqiservice.h -#./plugins/pluginmanager.cc + +list( + APPEND RS_SOURCES + plugins/pluginmanager.cc ) list( APPEND RS_SOURCES @@ -165,6 +169,7 @@ list( pqi/p3cfgmgr.cc pqi/p3notify.cc pqi/p3servicecontrol.cc + pqi/pqifdbin.cc pqi/pqinetstatebox.cc pqi/pqiperson.cc pqi/pqiservice.cc @@ -216,7 +221,6 @@ list( #./rsitems/rsphotoitems.cc #./rsitems/rsphotoitems.h -#./rsitems/rsposteditems.cc #./rsitems/rsposteditems.h #./rsitems/rswireitems.cc #retroshare/rswire.h @@ -290,10 +294,12 @@ list( #./services/p3photoservice.cc #./services/p3photoservice.h -#./services/p3postbase.cc -#./services/p3postbase.h -#./services/p3posted.cc -#./services/p3posted.h + +list( + APPEND RS_SOURCES + services/p3postbase.cc + services/p3posted.cc + rsitems/rsposteditems.cc ) if(RS_BRODCAST_DISCOVERY) list( @@ -327,21 +333,19 @@ list( list( APPEND RS_SOURCES -# util/contentvalue.cc -# util/exampletst.c -# util/rsdbbind.cc -# util/rsdiscspace.cc + util/contentvalue.cc + util/rsdbbind.cc + util/rsdiscspace.cc util/rsexpr.cc util/rsprint.cc -# util/rsrecogn.cc -# util/rssharedptr.h -# util/rstickevent.cc + util/rsrecogn.cc + util/rstickevent.cc util/rstime.cc util/smallobject.cc -# util/retrodb.cc + util/retrodb.cc util/rsbase64.cc util/rsjson.cc -# util/rskbdinput.cc + util/rskbdinput.cc util/rsrandom.cc util/rsstring.cc util/rsurl.cc @@ -383,13 +387,13 @@ list( if(RS_MINIUPNPC) list( APPEND RS_SOURCES - rs_upnp/upnphandler_miniupnp.cc ) + rs_upnp/upnphandler_miniupnp.cc + rs_upnp/upnputil.cc ) endif(RS_MINIUPNPC) #./rs_upnp/UPnPBase.cpp #./rs_upnp/upnphandler_libupnp.cc #./rs_upnp/upnptest.cc -#./rs_upnp/upnputil.cc #if(CMAKE_SYSTEM_NAME STREQUAL "Android") if(RS_ANDROID) @@ -399,3 +403,22 @@ if(RS_ANDROID) rs_android/retroshareserviceandroid.cpp rs_android/rsjni.cpp ) endif() + +list( + APPEND RS_SOURCES + tor/AddOnionCommand.cpp + tor/AuthenticateCommand.cpp + tor/CryptoKey.cpp + tor/GetConfCommand.cpp + tor/HiddenService.cpp + tor/PendingOperation.cpp + tor/ProtocolInfoCommand.cpp + tor/SetConfCommand.cpp + tor/StrUtil.cpp + tor/TorControl.cpp + tor/TorControlCommand.cpp + tor/TorControlSocket.cpp + tor/TorProcess.cpp + tor/TorManager.cpp + pqi/rstcpsocket.cc + pqi/pqiproxy.cc ) diff --git a/src/gxs/rsgxsnetservice.h b/src/gxs/rsgxsnetservice.h index 015d01301..2896a100d 100644 --- a/src/gxs/rsgxsnetservice.h +++ b/src/gxs/rsgxsnetservice.h @@ -4,8 +4,8 @@ * libretroshare: retroshare core library * * * * Copyright (C) 2012 Christopher Evi-Parker * - * Copyright (C) 2018-2021 Gioacchino Mazzurco * - * Copyright (C) 2019-2021 Asociación Civil Altermundi * + * Copyright (C) 2018-2022 Gioacchino Mazzurco * + * Copyright (C) 2019-2022 Asociación Civil Altermundi * * * * This program is free software: you can redistribute it and/or modify * * it under the terms of the GNU Lesser General Public License as * @@ -36,7 +36,6 @@ #include "rsgxsnetutils.h" #include "pqi/p3cfgmgr.h" #include "rsgixs.h" -#include "util/rssharedptr.h" /// keep track of transaction number typedef std::map TransactionIdMap; diff --git a/src/jsonapi/jsonapi.cpp b/src/jsonapi/jsonapi.cpp index 2f2ded30c..decc76855 100644 --- a/src/jsonapi/jsonapi.cpp +++ b/src/jsonapi/jsonapi.cpp @@ -23,8 +23,10 @@ #include #include #include -#include +#include #include + +#include #include diff --git a/src/pgp/openpgpsdkhandler.h b/src/pgp/openpgpsdkhandler.h index 8aff1459b..ac4cee906 100644 --- a/src/pgp/openpgpsdkhandler.h +++ b/src/pgp/openpgpsdkhandler.h @@ -36,7 +36,6 @@ extern "C" { #include "openpgpsdk/keyring.h" } -/// This class offer an abstract pgp handler to be used in RetroShare. class OpenPGPSDKHandler: public PGPHandler { public: diff --git a/src/serialiser/rstypeserializer.h b/src/serialiser/rstypeserializer.h index 6474f6971..62930f99e 100644 --- a/src/serialiser/rstypeserializer.h +++ b/src/serialiser/rstypeserializer.h @@ -966,6 +966,23 @@ protected: // Integral types VLQ // //============================================================================// +/* Avoid bool-compare warning being emitted for specific sections of code, for + * compilers that supports it, clang would warn about unkown warning if not + * explicitely excluded (it defiles GCC macros too) + * @see https://nelkinda.com/blog/suppress-warnings-in-gcc-and-clang/#d11e201 + * @see https://stackoverflow.com/a/28166605 + */ +#if defined(__GNUG__) && ! defined(__clang__) +# define RsTypeSerializer_SUPPRESS_WBC_WARNING_PUSH \ + _Pragma("GCC diagnostic push") \ + _Pragma("GCC diagnostic ignored \"-Wbool-compare\"") +# define RsTypeSerializer_SUPPRESS_WBC_WARNING_POP \ + _Pragma("GCC diagnostic pop") +#else +# define RsTypeSerializer_SUPPRESS_WBC_WARNING_PUSH +# define RsTypeSerializer_SUPPRESS_WBC_WARNING_POP +#endif + /** * Size calculation of unsigned integers as Variable Lenght Quantity * @see RsSerializationFlags::INTEGER_VLQ @@ -979,10 +996,9 @@ protected: { std::decay_t memberBackup = member; uint32_t ret = 1; -#pragma GCC diagnostic push -#pragma GCC diagnostic ignored "-Wbool-compare" +RsTypeSerializer_SUPPRESS_WBC_WARNING_PUSH while(member > 127) { ++ret; member >>= 7; } -#pragma GCC diagnostic pop +RsTypeSerializer_SUPPRESS_WBC_WARNING_POP Dbg2() << __PRETTY_FUNCTION__ << " memberBackup: " << memberBackup << " return: " << ret << std::endl; return ret; @@ -1006,8 +1022,7 @@ protected: #endif bool ok = true; -#pragma GCC diagnostic push -#pragma GCC diagnostic ignored "-Wbool-compare" +RsTypeSerializer_SUPPRESS_WBC_WARNING_PUSH /* Check with < and not with <= here as we write last byte after * the loop. Order of && operands very important here! */ while(member > 127 && (ok = (offset < size))) @@ -1017,7 +1032,7 @@ protected: // Remove the seven bits we just wrote member >>= 7; } -#pragma GCC diagnostic pop +RsTypeSerializer_SUPPRESS_WBC_WARNING_POP if(!(ok = ok && offset <= size)) { diff --git a/src/util/exampletst.c b/src/util/exampletst.c deleted file mode 100644 index e96cd037e..000000000 --- a/src/util/exampletst.c +++ /dev/null @@ -1,40 +0,0 @@ - -#include "utest.h" - -#include - -/* must define the global variables */ -INITTEST(); - -int main(int argc, char **argv) -{ - int a = 2; - int b = 3; - int c = 2; - - CHECK( a == c ); - - REPORT( "Initial Tests"); - - CHECK( (0 == strcmp("123", "123")) ); - - REPORT( "Successful Tests"); - - CHECK( a == b ); - CHECK( (0 == strcmp("123", "12345")) ); - - REPORT( "Failed Tests" ); - - CHECK( 1 ); - CHECK( a == c ); - - REPORT( "Later Successful Tests"); - - - FINALREPORT( "Example Tests" ); - - return TESTRESULT(); -} - - - diff --git a/src/util/rsdebug.h b/src/util/rsdebug.h index 25d1f1969..132ca8a2f 100644 --- a/src/util/rsdebug.h +++ b/src/util/rsdebug.h @@ -310,7 +310,7 @@ struct hexDump { using Dbg4 RS_DEPRECATED_FOR(RS_DBG4) = RsDbg; namespace RsLog { - enum RS_DEPRECATED_FOR("RsErr, RsDbg, RsNoDbg") logLvl { + enum RS_DEPRECATED_FOR("RS_ERR, RS_DBG, RS_DBG3...") logLvl { None = -1, Default = 0, Alert = 1, @@ -322,7 +322,7 @@ namespace RsLog { }; // this struct must be provided by the caller (to rslog()) - struct RS_DEPRECATED_FOR("RsErr, RsDbg, RsNoDbg") logInfo { + struct RS_DEPRECATED_FOR("RS_ERR, RS_DBG, RS_DBG3...") logInfo { // module specific log lvl logLvl lvl; // module name (displayed in log) @@ -330,16 +330,16 @@ namespace RsLog { }; } -RS_DEPRECATED_FOR("RsErr, RsDbg, RsNoDbg") +RS_DEPRECATED_FOR("RS_ERR, RS_DBG, RS_DBG3...") int setDebugCrashMode(const char *cfile); -RS_DEPRECATED_FOR("RsErr, RsDbg, RsNoDbg") +RS_DEPRECATED_FOR("RS_ERR, RS_DBG, RS_DBG3...") int setDebugFile(const char *fname); -RS_DEPRECATED_FOR("RsErr, RsDbg, RsNoDbg") +RS_DEPRECATED_FOR("RS_ERR, RS_DBG, RS_DBG3...") int setOutputLevel(RsLog::logLvl lvl); -RS_DEPRECATED_FOR("RsErr, RsDbg, RsNoDbg") +RS_DEPRECATED_FOR("RS_ERR, RS_DBG, RS_DBG3...") void rslog(const RsLog::logLvl lvl, RsLog::logInfo *info, const std::string &msg); diff --git a/src/util/rsfile.cc b/src/util/rsfile.cc index 05ea8915a..ebc8cf1bb 100644 --- a/src/util/rsfile.cc +++ b/src/util/rsfile.cc @@ -28,7 +28,17 @@ #include #include #else -#include +# include +#endif + +#ifdef __ANDROID__ +# include +# if __ANDROID_API__ < 18 +# include "util/rsdebug.h" +# include "util/stacktrace.h" +# include +# include +# endif #endif int RsFileUtil::set_fd_nonblock(int fd) @@ -101,7 +111,13 @@ ssize_t RsFileUtil::rs_getline(char **lineptr, size_t *n, FILE *stream) ptr = new_lineptr + diff; } } + +#elif defined(__ANDROID__) && __ANDROID_API__ < 18 +#warning "RsFileUtil::rs_getline not supported for Android API < 18" + RS_FATAL("not supported for Android API ", __ANDROID_API__, " < 18"); + print_stacktrace(); + exit(ENOSYS); #else // ie UNIX - return getline(lineptr, n, stream); + return getline(lineptr, n, stream); #endif } diff --git a/src/util/rskbdinput.cc b/src/util/rskbdinput.cc index ac8309e5a..4cc850ca8 100644 --- a/src/util/rskbdinput.cc +++ b/src/util/rskbdinput.cc @@ -127,4 +127,5 @@ std::string rs_getpass(const std::string& prompt, bool no_echo) } } #endif -#endif + +#endif // ndef __ANDROID__ diff --git a/src/util/stacktrace.h b/src/util/stacktrace.h index cb7dc4e71..5fa39052f 100644 --- a/src/util/stacktrace.h +++ b/src/util/stacktrace.h @@ -1,7 +1,7 @@ /******************************************************************************* * libretroshare * * * - * Copyright (C) 2016-2018 Gioacchino Mazzurco * + * Copyright (C) 2016-2022 Gioacchino Mazzurco * * Copyright (C) 2008 Timo Bingmann http://idlebox.net/ * * * * This program is free software: you can redistribute it and/or modify * @@ -37,7 +37,7 @@ * @param[in] out output file * @param[in] maxFrames maximum number of stack frames you want to bu printed */ -static inline void print_stacktrace( +static void print_stacktrace( bool demangle = true, FILE *out = stderr, unsigned int maxFrames = 63 ); @@ -46,7 +46,7 @@ static inline void print_stacktrace( #include #include -static inline void print_stacktrace( +static void print_stacktrace( bool demangle, FILE* out, unsigned int maxFrames ) { if(!out) @@ -163,7 +163,7 @@ struct RsAndroidBacktraceState void** end; }; -static inline _Unwind_Reason_Code android_unwind_callback( +static _Unwind_Reason_Code android_unwind_callback( struct _Unwind_Context* context, void* arg ) { RsAndroidBacktraceState* state = static_cast(arg); @@ -177,7 +177,7 @@ static inline _Unwind_Reason_Code android_unwind_callback( return _URC_NO_REASON; } -static inline void print_stacktrace( +static void print_stacktrace( bool demangle, FILE* /*out*/, unsigned int /*maxFrames*/) { constexpr int max = 5000; @@ -243,7 +243,7 @@ static inline void print_stacktrace( #else // defined(__linux__) && defined(__GLIBC__) -static inline void print_stacktrace( +static void print_stacktrace( bool /*demangle*/, FILE* out, unsigned int /*max_frames*/ ) { /** Notify the user which signal was caught. We use printf, because this diff --git a/src/util/rssharedptr.h b/tests/unittests/libretroshare/gxs/nxs_test/rssharedptr.h similarity index 100% rename from src/util/rssharedptr.h rename to tests/unittests/libretroshare/gxs/nxs_test/rssharedptr.h