aboutsummaryrefslogtreecommitdiff
path: root/gen_lws_config_h.sh
blob: c7cc6833c2357cbc39c65e98adcdd06f43257002 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
#!/bin/bash
#
# lws_config{,_private}.h are created by running cmake
# We are not allowed to use cmake to do the Android build
# These files for now have to be created offline
#
debug_mode="false"
if [[ $1 == "debug" ]] || [[ $1 == "-d" ]]; then
  debug_mode="true"
fi

function remove_trailing_slash {
  if [[ $1 == "/" ]]; then
    echo $i
  else
    echo ${1%/}
  fi
}

set -o errexit
MY_LOCATION="$( cd -P "$( dirname "$SOURCE" )" >/dev/null 2>&1 && pwd )"
MY_LOCATION=$(remove_trailing_slash $MY_LOCATION)
CMAKE_LIST_FILE="$MY_LOCATION/CMakeLists.txt"

ANDROID_ROOTDIR="$(realpath $MY_LOCATION/../..)"
ANDROID_ROOTDIR=$(remove_trailing_slash $ANDROID_ROOTDIR)

BUILD_DIR=$MY_LOCATION/build_dir

# included by CMakeLists.txt
CMAKE_ANDROID_FILE="$MY_LOCATION/CMakeAndroidLists.txt"

# used to generate CMAKE_ANDROID_FILE
CMAKE_ANDROID_FILE_TEMPLATE="$MY_LOCATION/CMakeAndroidLists.txt.template"

function find_lib_path() {
  # find the library in the out directory, and returns the directory's absolute path
  #
  # $1 -> libname
  # $2 -> optional, lib file extension
  local libext=${2:-".a"}
  local libname="$1$libext"
  local res=`find ${ANDROID_ROOTDIR}/out -type f | egrep "$libname$" | egrep "$(uname -m)" | egrep -i "$(uname -s)"`
  echo $res
}

function sed_in_cmake_android() {
  # replace in-place 'from' with 'to' in CMAKE_ANDROID_FILE
  #
  # $1: from
  # $2: to
  # $3: CMAKE_ANDROID_FILE
  #
  local cmake_android_file=${3:-"${CMAKE_ANDROID_FILE}"}
  local from="____""$1""____"
  local to=$(echo $2 | sed -r 's/\//\\\//g')
  if [[ $debug_mode == "true" ]]; then
    echo "${FUNCNAME[0]} replaces in $cmake_android_file "
    echo "     " $from
    echo "with " $to
  fi
  sed -i "s/$from/$to/g" $cmake_android_file
}

function build_prerequisites() {
  local modules=("$@")
  (
  pushd ${ANDROID_ROOTDIR}
  source ${ANDROID_ROOTDIR}/build/envsetup.sh
  for mod in "${modules[@]}"; do
    mmm $mod
  done
  popd
  )
}

function create_android_list() {
  #
  # by filling out the form in CMAKE_ANDROID_FILE_TEMPLATE,
  # create CMAKE_ANDROID_FILE that is included in CMakeLists.txt
  #
  # The CMAKE_ANDROID_FILE defines library/include directories for
  # libraries provided by somewhere in Android Root
  #
  rm -f ${CMAKE_ANDROID_FILE} || true
  cp -f ${CMAKE_ANDROID_FILE_TEMPLATE} ${CMAKE_ANDROID_FILE}
  sed_in_cmake_android "android_src_root_dir" ${ANDROID_ROOTDIR} ${CMAKE_ANDROID_FILE}
  # libraries that libwebsockets would depend on
  local libs=("libssl" "libcrypto" "libcap")
  # Android components that provide the "libs" above
  local components=("external/boringssl" "external/libcap")
  build_prerequisites "${components[@]}"
  for lib in ${libs[@]}; do
    local libfile_path=$(find_lib_path $lib)
    local libpath=$(dirname ${libfile_path})
    libpath=$(remove_trailing_slash $libpath)
    str_to_replae="build_""$lib""_dir"
    sed_in_cmake_android "$str_to_replae" $libpath ${CMAKE_ANDROID_FILE}
  done
}

# create CMakeAndroidLists.txt
create_android_list

extension=$(date | md5sum | cut -d ' ' -f 1)
cp -f $CMAKE_LIST_FILE $CMAKE_LIST_FILE.$extension

# make CMakeLists.txt buildable
sed -i 's/DO-NOT-BUILD-ME-AS-IS//g' ${CMAKE_ANDROID_FILE}

# replace CHECK_FUNCTION_EXISTS with check_function_exists
sed -i 's/CHECK_FUNCTION_EXISTS/check_function_exists/g' $CMAKE_LIST_FILE

# run cmake to configure
rm -fr $BUILD_DIR || true
LIBWEBSOCKETS_SRC_ROOT=$MY_LOCATION
mkdir -p $BUILD_DIR

if [[ $debug_mode == "true" ]]; then
  pushd $BUILD_DIR
  cmake VERBOSE=1 ..
  popd
else
  (pushd $BUILD_DIR > /dev/null 2>&1; cmake .. > /dev/null 2>&1; popd > /dev/null 2>&1)
fi

cp -f $BUILD_DIR/lws_config.h $LIBWEBSOCKETS_SRC_ROOT/include
cp -f $BUILD_DIR/lws_config_private.h $LIBWEBSOCKETS_SRC_ROOT/include

# clean up
if [[ $debug_mode != "true" ]]; then
  rm -fr $BUILD_DIR || true
  rm -f $CMAKE_ANDROID_FILE || true
  mv -f $CMAKE_LIST_FILE.$extension $CMAKE_LIST_FILE
fi