1*1c60b9acSAndroid Build Coastguard Worker#!/bin/bash 2*1c60b9acSAndroid Build Coastguard Worker# 3*1c60b9acSAndroid Build Coastguard Worker# lws_config{,_private}.h are created by running cmake 4*1c60b9acSAndroid Build Coastguard Worker# We are not allowed to use cmake to do the Android build 5*1c60b9acSAndroid Build Coastguard Worker# These files for now have to be created offline 6*1c60b9acSAndroid Build Coastguard Worker# 7*1c60b9acSAndroid Build Coastguard Workerdebug_mode="false" 8*1c60b9acSAndroid Build Coastguard Workerif [[ $1 == "debug" ]] || [[ $1 == "-d" ]]; then 9*1c60b9acSAndroid Build Coastguard Worker debug_mode="true" 10*1c60b9acSAndroid Build Coastguard Workerfi 11*1c60b9acSAndroid Build Coastguard Worker 12*1c60b9acSAndroid Build Coastguard Workerfunction remove_trailing_slash { 13*1c60b9acSAndroid Build Coastguard Worker if [[ $1 == "/" ]]; then 14*1c60b9acSAndroid Build Coastguard Worker echo $i 15*1c60b9acSAndroid Build Coastguard Worker else 16*1c60b9acSAndroid Build Coastguard Worker echo ${1%/} 17*1c60b9acSAndroid Build Coastguard Worker fi 18*1c60b9acSAndroid Build Coastguard Worker} 19*1c60b9acSAndroid Build Coastguard Worker 20*1c60b9acSAndroid Build Coastguard Workerset -o errexit 21*1c60b9acSAndroid Build Coastguard WorkerMY_LOCATION="$( cd -P "$( dirname "$SOURCE" )" >/dev/null 2>&1 && pwd )" 22*1c60b9acSAndroid Build Coastguard WorkerMY_LOCATION=$(remove_trailing_slash $MY_LOCATION) 23*1c60b9acSAndroid Build Coastguard WorkerCMAKE_LIST_FILE="$MY_LOCATION/CMakeLists.txt" 24*1c60b9acSAndroid Build Coastguard Worker 25*1c60b9acSAndroid Build Coastguard WorkerANDROID_ROOTDIR="$(realpath $MY_LOCATION/../..)" 26*1c60b9acSAndroid Build Coastguard WorkerANDROID_ROOTDIR=$(remove_trailing_slash $ANDROID_ROOTDIR) 27*1c60b9acSAndroid Build Coastguard Worker 28*1c60b9acSAndroid Build Coastguard WorkerBUILD_DIR=$MY_LOCATION/build_dir 29*1c60b9acSAndroid Build Coastguard Worker 30*1c60b9acSAndroid Build Coastguard Worker# included by CMakeLists.txt 31*1c60b9acSAndroid Build Coastguard WorkerCMAKE_ANDROID_FILE="$MY_LOCATION/CMakeAndroidLists.txt" 32*1c60b9acSAndroid Build Coastguard Worker 33*1c60b9acSAndroid Build Coastguard Worker# used to generate CMAKE_ANDROID_FILE 34*1c60b9acSAndroid Build Coastguard WorkerCMAKE_ANDROID_FILE_TEMPLATE="$MY_LOCATION/CMakeAndroidLists.txt.template" 35*1c60b9acSAndroid Build Coastguard Worker 36*1c60b9acSAndroid Build Coastguard Workerfunction find_lib_path() { 37*1c60b9acSAndroid Build Coastguard Worker # find the library in the out directory, and returns the directory's absolute path 38*1c60b9acSAndroid Build Coastguard Worker # 39*1c60b9acSAndroid Build Coastguard Worker # $1 -> libname 40*1c60b9acSAndroid Build Coastguard Worker # $2 -> optional, lib file extension 41*1c60b9acSAndroid Build Coastguard Worker local libext=${2:-".a"} 42*1c60b9acSAndroid Build Coastguard Worker local libname="$1$libext" 43*1c60b9acSAndroid Build Coastguard Worker local res=`find ${ANDROID_ROOTDIR}/out -type f | egrep "$libname$" | egrep "$(uname -m)" | egrep -i "$(uname -s)"` 44*1c60b9acSAndroid Build Coastguard Worker echo $res 45*1c60b9acSAndroid Build Coastguard Worker} 46*1c60b9acSAndroid Build Coastguard Worker 47*1c60b9acSAndroid Build Coastguard Workerfunction sed_in_cmake_android() { 48*1c60b9acSAndroid Build Coastguard Worker # replace in-place 'from' with 'to' in CMAKE_ANDROID_FILE 49*1c60b9acSAndroid Build Coastguard Worker # 50*1c60b9acSAndroid Build Coastguard Worker # $1: from 51*1c60b9acSAndroid Build Coastguard Worker # $2: to 52*1c60b9acSAndroid Build Coastguard Worker # $3: CMAKE_ANDROID_FILE 53*1c60b9acSAndroid Build Coastguard Worker # 54*1c60b9acSAndroid Build Coastguard Worker local cmake_android_file=${3:-"${CMAKE_ANDROID_FILE}"} 55*1c60b9acSAndroid Build Coastguard Worker local from="____""$1""____" 56*1c60b9acSAndroid Build Coastguard Worker local to=$(echo $2 | sed -r 's/\//\\\//g') 57*1c60b9acSAndroid Build Coastguard Worker if [[ $debug_mode == "true" ]]; then 58*1c60b9acSAndroid Build Coastguard Worker echo "${FUNCNAME[0]} replaces in $cmake_android_file " 59*1c60b9acSAndroid Build Coastguard Worker echo " " $from 60*1c60b9acSAndroid Build Coastguard Worker echo "with " $to 61*1c60b9acSAndroid Build Coastguard Worker fi 62*1c60b9acSAndroid Build Coastguard Worker sed -i "s/$from/$to/g" $cmake_android_file 63*1c60b9acSAndroid Build Coastguard Worker} 64*1c60b9acSAndroid Build Coastguard Worker 65*1c60b9acSAndroid Build Coastguard Workerfunction build_prerequisites() { 66*1c60b9acSAndroid Build Coastguard Worker local modules=("$@") 67*1c60b9acSAndroid Build Coastguard Worker ( 68*1c60b9acSAndroid Build Coastguard Worker pushd ${ANDROID_ROOTDIR} 69*1c60b9acSAndroid Build Coastguard Worker source ${ANDROID_ROOTDIR}/build/envsetup.sh 70*1c60b9acSAndroid Build Coastguard Worker for mod in "${modules[@]}"; do 71*1c60b9acSAndroid Build Coastguard Worker mmm $mod 72*1c60b9acSAndroid Build Coastguard Worker done 73*1c60b9acSAndroid Build Coastguard Worker popd 74*1c60b9acSAndroid Build Coastguard Worker ) 75*1c60b9acSAndroid Build Coastguard Worker} 76*1c60b9acSAndroid Build Coastguard Worker 77*1c60b9acSAndroid Build Coastguard Workerfunction create_android_list() { 78*1c60b9acSAndroid Build Coastguard Worker # 79*1c60b9acSAndroid Build Coastguard Worker # by filling out the form in CMAKE_ANDROID_FILE_TEMPLATE, 80*1c60b9acSAndroid Build Coastguard Worker # create CMAKE_ANDROID_FILE that is included in CMakeLists.txt 81*1c60b9acSAndroid Build Coastguard Worker # 82*1c60b9acSAndroid Build Coastguard Worker # The CMAKE_ANDROID_FILE defines library/include directories for 83*1c60b9acSAndroid Build Coastguard Worker # libraries provided by somewhere in Android Root 84*1c60b9acSAndroid Build Coastguard Worker # 85*1c60b9acSAndroid Build Coastguard Worker rm -f ${CMAKE_ANDROID_FILE} || true 86*1c60b9acSAndroid Build Coastguard Worker cp -f ${CMAKE_ANDROID_FILE_TEMPLATE} ${CMAKE_ANDROID_FILE} 87*1c60b9acSAndroid Build Coastguard Worker sed_in_cmake_android "android_src_root_dir" ${ANDROID_ROOTDIR} ${CMAKE_ANDROID_FILE} 88*1c60b9acSAndroid Build Coastguard Worker # libraries that libwebsockets would depend on 89*1c60b9acSAndroid Build Coastguard Worker local libs=("libssl" "libcrypto" "libcap") 90*1c60b9acSAndroid Build Coastguard Worker # Android components that provide the "libs" above 91*1c60b9acSAndroid Build Coastguard Worker local components=("external/boringssl" "external/libcap") 92*1c60b9acSAndroid Build Coastguard Worker build_prerequisites "${components[@]}" 93*1c60b9acSAndroid Build Coastguard Worker for lib in ${libs[@]}; do 94*1c60b9acSAndroid Build Coastguard Worker local libfile_path=$(find_lib_path $lib) 95*1c60b9acSAndroid Build Coastguard Worker local libpath=$(dirname ${libfile_path}) 96*1c60b9acSAndroid Build Coastguard Worker libpath=$(remove_trailing_slash $libpath) 97*1c60b9acSAndroid Build Coastguard Worker str_to_replae="build_""$lib""_dir" 98*1c60b9acSAndroid Build Coastguard Worker sed_in_cmake_android "$str_to_replae" $libpath ${CMAKE_ANDROID_FILE} 99*1c60b9acSAndroid Build Coastguard Worker done 100*1c60b9acSAndroid Build Coastguard Worker} 101*1c60b9acSAndroid Build Coastguard Worker 102*1c60b9acSAndroid Build Coastguard Worker# create CMakeAndroidLists.txt 103*1c60b9acSAndroid Build Coastguard Workercreate_android_list 104*1c60b9acSAndroid Build Coastguard Worker 105*1c60b9acSAndroid Build Coastguard Workerextension=$(date | md5sum | cut -d ' ' -f 1) 106*1c60b9acSAndroid Build Coastguard Workercp -f $CMAKE_LIST_FILE $CMAKE_LIST_FILE.$extension 107*1c60b9acSAndroid Build Coastguard Worker 108*1c60b9acSAndroid Build Coastguard Worker# make CMakeLists.txt buildable 109*1c60b9acSAndroid Build Coastguard Workersed -i 's/DO-NOT-BUILD-ME-AS-IS//g' ${CMAKE_ANDROID_FILE} 110*1c60b9acSAndroid Build Coastguard Worker 111*1c60b9acSAndroid Build Coastguard Worker# replace CHECK_FUNCTION_EXISTS with check_function_exists 112*1c60b9acSAndroid Build Coastguard Workersed -i 's/CHECK_FUNCTION_EXISTS/check_function_exists/g' $CMAKE_LIST_FILE 113*1c60b9acSAndroid Build Coastguard Worker 114*1c60b9acSAndroid Build Coastguard Worker# run cmake to configure 115*1c60b9acSAndroid Build Coastguard Workerrm -fr $BUILD_DIR || true 116*1c60b9acSAndroid Build Coastguard WorkerLIBWEBSOCKETS_SRC_ROOT=$MY_LOCATION 117*1c60b9acSAndroid Build Coastguard Workermkdir -p $BUILD_DIR 118*1c60b9acSAndroid Build Coastguard Worker 119*1c60b9acSAndroid Build Coastguard Workerif [[ $debug_mode == "true" ]]; then 120*1c60b9acSAndroid Build Coastguard Worker pushd $BUILD_DIR 121*1c60b9acSAndroid Build Coastguard Worker cmake VERBOSE=1 .. 122*1c60b9acSAndroid Build Coastguard Worker popd 123*1c60b9acSAndroid Build Coastguard Workerelse 124*1c60b9acSAndroid Build Coastguard Worker (pushd $BUILD_DIR > /dev/null 2>&1; cmake .. > /dev/null 2>&1; popd > /dev/null 2>&1) 125*1c60b9acSAndroid Build Coastguard Workerfi 126*1c60b9acSAndroid Build Coastguard Worker 127*1c60b9acSAndroid Build Coastguard Workercp -f $BUILD_DIR/lws_config.h $LIBWEBSOCKETS_SRC_ROOT/include 128*1c60b9acSAndroid Build Coastguard Workercp -f $BUILD_DIR/lws_config_private.h $LIBWEBSOCKETS_SRC_ROOT/include 129*1c60b9acSAndroid Build Coastguard Worker 130*1c60b9acSAndroid Build Coastguard Worker# clean up 131*1c60b9acSAndroid Build Coastguard Workerif [[ $debug_mode != "true" ]]; then 132*1c60b9acSAndroid Build Coastguard Worker rm -fr $BUILD_DIR || true 133*1c60b9acSAndroid Build Coastguard Worker rm -f $CMAKE_ANDROID_FILE || true 134*1c60b9acSAndroid Build Coastguard Worker mv -f $CMAKE_LIST_FILE.$extension $CMAKE_LIST_FILE 135*1c60b9acSAndroid Build Coastguard Workerfi 136