
parameters:
- name: cmakeArgs
  type: string
  default: ''
- name: sourceDir
  type: string
  default: ''
- name: workDir
  type: string
  default: $(DEV)
- name: condition
  type: string
  default: ne(variables.CACHE_RESTORED, 'true')
- name: installCommand
  type: string
  default: 'make install'

steps:
- script: |
    set -ex

    pushd ${{ parameters.sourceDir }}
    mkdir -p build
    pushd build
    
    # Invoke cmake in the most correctest way I've could find while try and erroring:
    #
    # The biggest pain point is that CMake does not seem to respect our existing cross compilation CFLAGS and LDFLAGS.
    # Hence we are passing them manually, once via Android flags and once for "Required" flags. The latter is necessary
    # to let cmake correctly probe for any existing header, function, library, etc.
    # Watch out: Sometimes the flags are passed as ;-limited list!
    cmake -G "Unix Makefiles" \
        -DCMAKE_MAKE_PROGRAM=make \
        -DCMAKE_TOOLCHAIN_FILE=${NDK}/build/cmake/android.toolchain.cmake \
        -DCMAKE_BUILD_TYPE=RelWithDebInfo \
        -DANDROID_NATIVE_API_LEVEL=${ANDROID_API} \
        -DANDROID_ABI=${ANDROID_ABI_CMAKE} \
        -DANDROID_TOOLCHAIN=${CC} \
        -DANDROID_NDK=${NDK} \
        -DANDROID_COMPILER_FLAGS="${CFLAGS// /;}" \
        -DANDROID_LINKER_FLAGS="${LDFLAGS// /;}" \
        -DANDROID_STL="c++_shared" \
        -DCMAKE_REQUIRED_FLAGS="${CFLAGS}" \
        -DCMAKE_REQUIRED_LINK_OPTIONS="${LDFLAGS// /;}" \
        -DCMAKE_INSTALL_PREFIX=${PREFIX} \
        -DCMAKE_STAGING_PREFIX=${PREFIX} \
        -DCMAKE_VERBOSE_MAKEFILE=1 \
        -DBUILD_SHARED_LIBS=1 \
        -DLIB_SUFFIX="" \
        ${{ parameters.cmakeArgs }} ..
    make -j$((`nproc`+1))
    ${{ parameters.installCommand }}
    popd
    popd
  displayName: 'Compile ${{ parameters.sourceDir }}'
  workingDirectory: ${{ parameters.workDir }}
  condition: ${{ parameters.condition }}
