@bencapp3/react-native-static-server
Version:
Embedded HTTP server for React Native
171 lines (150 loc) • 6.16 kB
Plain Text
project(rn-static-server C)
cmake_minimum_required(VERSION 3.22.1 FATAL_ERROR)
if (CMAKE_VERSION MATCHES "3.30.0")
message(FATAL_ERROR "CMake v3.30.0 is not supported: https://github.com/birdofpreyru/react-native-static-server/issues/111")
elseif (CMAKE_VERSION MATCHES "3.30.1")
message(FATAL_ERROR "CMake v3.30.1 is not supported: https://github.com/birdofpreyru/react-native-static-server/issues/111")
endif()
# This prevents CMake from complaining that INSTALL(..) directives in
# Lighttpd CMakeLists.txt miss BUNDLE DESTINATION.
set(CMAKE_MACOSX_BUNDLE OFF)
# Pre-build of PCRE2 for the target system from sources.
if(CMAKE_CROSSCOMPILING AND CMAKE_HOST_SYSTEM_NAME MATCHES "Windows")
file(
COPY ${CMAKE_CURRENT_SOURCE_DIR}/windows/ReactNativeStaticServer/lighttpd/lemon.exe
DESTINATION ${CMAKE_BINARY_DIR}/lighttpd1.4/build
)
set(LEMON_PATH ${CMAKE_BINARY_DIR}/lighttpd1.4/build/lemon.exe)
endif()
# Note: Archs in CMAKE_OSX_ARCHITECTURES are separated by semi-colons,
# if we don't escape semi-colons before inserting the value into other
# variables, most CMake commands will treat that semi-colon as argument
# separator in the list, and replace them with whitspaces, leading
# to obscure errors (e.g. it may successfully complete the build,
# but effectively doing it for the first of the archs only, and leave us
# to wonder, why something does not link for some arch later).
string(REPLACE " " "\\\;" ESCAPED_ARCHS "$ENV{ARCHS_STANDARD}")
if(CMAKE_SYSTEM_NAME MATCHES "Android")
set(
EXTRA_BUILD_ARGS
-DANDROID_ABI=${ANDROID_ABI}
-DANDROID_PLATFORM=${ANDROID_PLATFORM}
-DANDROID_STL=${ANDROID_STL}
-DCMAKE_TOOLCHAIN_FILE=${CMAKE_TOOLCHAIN_FILE}
-GNinja
)
# TODO: This aims Mac Catalyst build, and needs a more specific condition,
# but will do like this for now, as we are not doing native Mac builds, thus
# Mac Catalyst build is the only scenario we have where the target system name
# is Darwin.
elseif(CMAKE_SYSTEM_NAME MATCHES "Darwin")
set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -target x86_64-apple-ios-macabi")
set(
EXTRA_BUILD_ARGS
-DCMAKE_C_FLAGS=${CMAKE_C_FLAGS}
-DCMAKE_OSX_ARCHITECTURES=${ESCAPED_ARCHS}
)
# This allows to not sign compiled PCRE2 executables for iOS / macOS builds,
# we don't really use them anyway, but we need them build for the install
# command below to work.
set(EXTRA_INSTALL_ARGS "--;CODE_SIGNING_ALLOWED=NO")
elseif(CMAKE_SYSTEM_NAME MATCHES "iOS")
set(
EXTRA_BUILD_ARGS
-DCMAKE_TOOLCHAIN_FILE=${CMAKE_TOOLCHAIN_FILE}
-DCMAKE_OSX_ARCHITECTURES=${ESCAPED_ARCHS}
-DCMAKE_OSX_DEPLOYMENT_TARGET=${CMAKE_OSX_DEPLOYMENT_TARGET}
-DCMAKE_IOS_INSTALL_COMBINED=${CMAKE_IOS_INSTALL_COMBINED}
-GXcode
)
# This allows to not sign compiled PCRE2 executables for iOS / macOS builds,
# we don't really use them anyway, but we need them build for the install
# command below to work.
set(EXTRA_INSTALL_ARGS "--;CODE_SIGNING_ALLOWED=NO")
endif()
if(CMAKE_SYSTEM_NAME MATCHES "Android|Windows")
set(EXTRA_BUILD_ARGS ${EXTRA_BUILD_ARGS} -DBUILD_SHARED_LIBS=ON)
endif()
execute_process(
COMMAND ${CMAKE_COMMAND} ${CMAKE_CURRENT_SOURCE_DIR}/pcre2
-B ${CMAKE_BINARY_DIR}/pcre2
-DCMAKE_BUILD_TYPE=Release
-DCMAKE_INSTALL_PREFIX=${CMAKE_BINARY_DIR}/sysroot
-DCMAKE_MAKE_PROGRAM=${CMAKE_MAKE_PROGRAM}
${EXTRA_BUILD_ARGS}
COMMAND_ECHO STDOUT
COMMAND_ERROR_IS_FATAL ANY
)
execute_process(
COMMAND ${CMAKE_COMMAND} --build ${CMAKE_BINARY_DIR}/pcre2
--config Release ${EXTRA_INSTALL_ARGS}
)
execute_process(COMMAND ${CMAKE_COMMAND} --install ${CMAKE_BINARY_DIR}/pcre2)
# Copies shared PCRE2 library into the folder from where Gradle automatically
# will bundle it in the host app package.
if(CMAKE_SYSTEM_NAME MATCHES "Android")
file(
COPY ${CMAKE_BINARY_DIR}/sysroot/lib/libpcre2-8.so
DESTINATION ${CMAKE_CURRENT_SOURCE_DIR}/android/src/main/jniLibs/${ANDROID_ABI}
)
endif()
# Builds & places for packing the glob library, for Android-targeted builds.
if(CMAKE_SYSTEM_NAME MATCHES "Android")
execute_process(
COMMAND ${CMAKE_COMMAND} ${CMAKE_CURRENT_SOURCE_DIR}/glob
-B ${CMAKE_BINARY_DIR}/glob
-DCMAKE_BUILD_TYPE=Release
-DCMAKE_INSTALL_PREFIX=${CMAKE_BINARY_DIR}/sysroot
-DCMAKE_MAKE_PROGRAM=${CMAKE_MAKE_PROGRAM}
${EXTRA_BUILD_ARGS}
COMMAND_ECHO STDOUT
COMMAND_ERROR_IS_FATAL ANY
)
execute_process(
COMMAND ${CMAKE_COMMAND} --build ${CMAKE_BINARY_DIR}/glob
--config Release ${EXTRA_INSTALL_ARGS}
)
execute_process(COMMAND ${CMAKE_COMMAND} --install ${CMAKE_BINARY_DIR}/glob)
file(
COPY ${CMAKE_BINARY_DIR}/sysroot/lib/libglob.so
DESTINATION ${CMAKE_CURRENT_SOURCE_DIR}/android/src/main/jniLibs/${ANDROID_ABI}
)
endif()
if(CMAKE_SYSTEM_NAME MATCHES "Android|Windows")
set(BUILD_SHARED_LIBS 1)
endif()
# Above we have build & installed a local version of PCRE2 library, now we want
# to enforce Lighttpd build to see and use it (rather than any system-wide
# installation of another PCRE2 version). On Ubuntu / macOS it can be done
# by setting CMAKE_PREFIX_PATH; somehow it has no effect in Msys2 / UCRT64
# builds for Windows (beyond by current understanding), but there setting
# the PKG_CONFIG_PATH environment variable, which is picked up by pkg-config
# does the trick.
if(CMAKE_SYSTEM_NAME MATCHES "Windows")
set(ENV{PKG_CONFIG_PATH} "${CMAKE_BINARY_DIR}/sysroot/lib/pkgconfig")
else()
set(CMAKE_PREFIX_PATH "${CMAKE_BINARY_DIR}/sysroot")
endif()
add_subdirectory(lighttpd1.4)
set(PLUGIN_STATIC
PLUGIN_INIT(mod_access)\n
PLUGIN_INIT(mod_alias)\n
PLUGIN_INIT(mod_dirlisting)\n
PLUGIN_INIT(mod_evhost)\n
PLUGIN_INIT(mod_expire)\n
PLUGIN_INIT(mod_fastcgi)\n
PLUGIN_INIT(mod_h2)\n
PLUGIN_INIT(mod_indexfile)\n
PLUGIN_INIT(mod_redirect)\n
PLUGIN_INIT(mod_rewrite)\n
PLUGIN_INIT(mod_scgi)\n
PLUGIN_INIT(mod_setenv)\n
PLUGIN_INIT(mod_simple_vhost)\n
PLUGIN_INIT(mod_staticfile)\n
)
if(WITH_MOD_WEBDAV)
set(PLUGIN_STATIC "${PLUGIN_STATIC}PLUGIN_INIT(mod_webdav)\n")
endif()
file(WRITE ${CMAKE_BINARY_DIR}/lighttpd1.4/build/plugin-static.h
${PLUGIN_STATIC}
)