mistserver/CMakeLists.txt
Thulinma 26cd8251e2 Merge branch 'development' into LTS_development
# Conflicts:
#	CMakeLists.txt
2018-01-24 20:16:35 +01:00

697 lines
20 KiB
CMake

########################################
# Basic Setup #
########################################
cmake_minimum_required (VERSION 2.6)
SET(CMAKE_INSTALL_PREFIX "/usr" CACHE PATH "Usr install prefix")
project (MistServer)
if(COMMAND cmake_policy)
cmake_policy(SET CMP0003 NEW)
endif(COMMAND cmake_policy)
SET(SOURCE_DIR ${PROJECT_SOURCE_DIR})
SET(BINARY_DIR ${PROJECT_BINARY_DIR})
include_directories(${SOURCE_DIR})
include_directories(${BINARY_DIR} ${BINARY_DIR}/generated)
########################################
# Testing - Enable Tests #
########################################
enable_testing()
include(CTest)
########################################
# Build Variables - Install Prefix #
########################################
if (NOT CMAKE_INSTALL_PREFIX)
set (CMAKE_INSTALL_PREFIX /usr)
endif()
########################################
# Build Variables - Release #
########################################
if (RELEASE)
set (RELEASE_RAW ${RELEASE})
else()
#get the bitlength of this system
execute_process(COMMAND getconf LONG_BIT OUTPUT_VARIABLE RELEASE_RAW )
set(RELEASE_RAW "Generic_${RELEASE_RAW}" )
endif()
string(STRIP ${RELEASE_RAW} RELEASE)
set(RELEASE \"${RELEASE}\" )
########################################
# Build Variables - Package Version #
########################################
#See if we have a git repo to get the version from
execute_process(COMMAND git describe --tags OUTPUT_VARIABLE PACKAGE_VERSION_RAW ERROR_QUIET)
if (NOT PACKAGE_VERSION_RAW)
execute_process(COMMAND cat VERSION OUTPUT_VARIABLE PACKAGE_VERSION_RAW ERROR_QUIET)
endif()
if (NOT PACKAGE_VERSION_RAW)
set(PACKAGE_VERSION_RAW Unknown)
endif()
#strip off the trailing spaces and newline
string(STRIP "${PACKAGE_VERSION_RAW}" PACKAGE_VERSION)
set(PACKAGE_VERSION \"${PACKAGE_VERSION}\" )
########################################
# Build Variables - Debug #
########################################
if (NOT DEBUG)
set(DEBUG 4)
endif()
########################################
# Build Variables - Shared Memory #
########################################
if (NOT DEFINED NOSHM )
add_definitions(-DSHM_ENABLED=1)
endif()
if (NOT DEFINED FILLER_DATA OR NOT DEFINED SHARED_SECRET OR NOT DEFINED SUPER_SECRET)#LTS
message(WARNING "Not all LTS variables have been set and this is an LTS build - are you sure about this?")#LTS
endif()#LTS
add_definitions(-DFILLER_DATA="${FILLER_DATA}" -DSHARED_SECRET="${SHARED_SECRET}" -DSUPER_SECRET="${SUPER_SECRET}")#LTS
if (DEFINED GEOIP )
add_definitions(-DGEOIP=1)
endif()
if (DEFINED BIGMETA )
add_definitions(-DBIGMETA=1)
endif()
if (NOT DEFINED NOSSL )
add_definitions(-DSSL=1)
endif()
if (DEFINED DATASIZE )
add_definitions(-DSHM_DATASIZE=${DATASIZE})
endif()
if (NOT DEFINED NOUPDATE )
add_definitions(-DUPDATER=1)
endif()
if (NOT DEFINED PERPETUAL )
add_definitions(-DLICENSING=1)
endif()
if (DEFINED NOAUTH )
add_definitions(-DNOAUTH=1)
endif()
if (DEFINED KILLONEXIT )
add_definitions(-DKILLONEXIT=true)
endif()
########################################
# Build Variables - Thread Names #
########################################
if (DEFINED WITH_THREADNAMES )
add_definitions(-DWITH_THREADNAMES=1)
endif()
########################################
# Build Variables - No Crash Check #
########################################
if (DEFINED NOCRASHCHECK )
add_definitions(-DNOCRASHCHECK=1)
endif()
########################################
# Build Variables - Stats delay overrid#
########################################
if (DEFINED STATS_DELAY )
add_definitions(-DSTATS_DELAY=${STATS_DELAY})
endif()
########################################
# Build Variables - Prepare for Build #
########################################
message("Builing release ${RELEASE} for version ${PACKAGE_VERSION} @ debug level ${DEBUG}")
add_definitions(-g -funsigned-char -D_LARGEFILE_SOURCE -D_FILE_OFFSET_BITS=64 -DDEBUG=${DEBUG} -DPACKAGE_VERSION=${PACKAGE_VERSION} -DRELEASE=${RELEASE})
########################################
# MistLib - Header Files #
########################################
set(libHeaders
lib/adts.h
lib/amf.h
lib/auth.h
lib/encode.h
lib/bitfields.h
lib/bitstream.h
lib/checksum.h
lib/config.h
lib/defines.h
lib/dtsc.h
lib/encryption.h
lib/flv_tag.h
lib/h264.h
lib/h265.h
lib/http_parser.h
lib/downloader.h
lib/json.h
lib/langcodes.h
lib/mp4_adobe.h
lib/mp4_dash.cpp
lib/mp4_dash.h
lib/mp4_encryption.h
lib/mp4_generic.h
lib/mp4.h
lib/mp4_ms.h
lib/mpeg.h
lib/nal.h
lib/ogg.h
lib/procs.h
lib/rijndael.h
lib/rtmpchunks.h
lib/rtp.h
lib/sdp.h
lib/shared_memory.h
lib/socket.h
lib/stream.h
lib/theora.h
lib/timing.h
lib/tinythread.h
lib/ts_packet.h
lib/ts_stream.h
lib/util.h
lib/vorbis.h
lib/triggers.h
lib/opus.h
lib/riff.h
lib/ebml.h
lib/ebml_socketglue.h
)
########################################
# MistLib - Build #
########################################
add_library (mist
${libHeaders}
lib/adts.cpp
lib/amf.cpp
lib/auth.cpp
lib/encode.cpp
lib/bitfields.cpp
lib/bitstream.cpp
lib/config.cpp
lib/dtsc.cpp
lib/dtscmeta.cpp
lib/encryption.cpp
lib/flv_tag.cpp
lib/h264.cpp
lib/h265.cpp
lib/http_parser.cpp
lib/downloader.cpp
lib/json.cpp
lib/langcodes.cpp
lib/mp4_adobe.cpp
lib/mp4.cpp
lib/mp4_dash.cpp
lib/mp4_encryption.cpp
lib/mp4_generic.cpp
lib/mp4_ms.cpp
lib/mpeg.cpp
lib/nal.cpp
lib/ogg.cpp
lib/procs.cpp
lib/rijndael.cpp
lib/rtmpchunks.cpp
lib/rtp.cpp
lib/sdp.cpp
lib/shared_memory.cpp
lib/socket.cpp
lib/stream.cpp
lib/theora.cpp
lib/timing.cpp
lib/tinythread.cpp
lib/ts_packet.cpp
lib/ts_stream.cpp
lib/util.cpp
lib/vorbis.cpp
lib/triggers.cpp
lib/opus.cpp
lib/riff.cpp
lib/ebml.cpp
lib/ebml_socketglue.cpp
)
if (NOT APPLE)
set (LIBRT -lrt)
endif()
target_link_libraries(mist
-lpthread
${LIBRT}
)
if (NOT DEFINED NOSSL )
target_link_libraries(mist mbedtls mbedx509 mbedcrypto)
endif()
install(
FILES ${libHeaders}
DESTINATION include/mist
)
install(
TARGETS mist
DESTINATION lib
)
########################################
# MistLib - Local Header Install #
########################################
if (${CMAKE_VERSION} VERSION_LESS 3.3.0)
add_custom_command(OUTPUT ${BINARY_DIR}/mist/.headers
COMMAND ${CMAKE_COMMAND}
ARGS -E make_directory ${BINARY_DIR}/mist
COMMAND cp
ARGS ${libHeaders} ${BINARY_DIR}/mist
COMMAND touch
ARGS ${BINARY_DIR}/mist/.headers
WORKING_DIRECTORY ${SOURCE_DIR}
DEPENDS ${libHeaders}
)
else()
add_custom_command(OUTPUT ${BINARY_DIR}/mist/.headers
COMMAND ${CMAKE_COMMAND}
ARGS -E make_directory ${BINARY_DIR}/mist
COMMAND ${CMAKE_COMMAND}
ARGS -E copy ${libHeaders} ${BINARY_DIR}/mist
COMMAND ${CMAKE_COMMAND}
ARGS -E touch ${BINARY_DIR}/mist/.headers
WORKING_DIRECTORY ${SOURCE_DIR}
DEPENDS ${libHeaders}
)
endif()
########################################
# MistServer - Analysers #
########################################
macro(makeAnalyser analyserName format)
add_executable(MistAnalyser${analyserName}
src/analysers/mist_analyse.cpp
src/analysers/analyser.cpp
src/analysers/analyser_${format}.cpp
${BINARY_DIR}/mist/.headers
)
set_target_properties(MistAnalyser${analyserName}
PROPERTIES COMPILE_DEFINITIONS "ANALYSERHEADER=\"analyser_${format}.h\"; ANALYSERTYPE=Analyser${analyserName}"
)
target_link_libraries(MistAnalyser${analyserName}
mist
)
install(
TARGETS MistAnalyser${analyserName}
DESTINATION bin
)
endmacro()
makeAnalyser(RTMP rtmp)
makeAnalyser(FLV flv)
makeAnalyser(DTSC dtsc)
makeAnalyser(OGG ogg)
makeAnalyser(EBML ebml)
#makeAnalyser(RTSP rtsp) #LTS #Currently broken. Horribly.
makeAnalyser(TS ts) #LTS
makeAnalyser(MP4 mp4) #LTS
makeAnalyser(H264 h264) #LTS
makeAnalyser(HLS hls) #LTS
makeAnalyser(RIFF riff) #LTS
makeAnalyser(RTSP rtsp) #LTS
#LTS_START
########################################
# MistServer - Utilities #
########################################
macro(makeUtil utilName utilFile)
add_executable(MistUtil${utilName}
src/utils/util_${utilFile}.cpp
${BINARY_DIR}/mist/.headers
)
target_link_libraries(MistUtil${utilName}
mist
)
install(
TARGETS MistUtil${utilName}
DESTINATION bin
)
endmacro()
makeUtil(Stats stats)
makeUtil(RAX rax)
makeUtil(AMF amf)
if (DEFINED LOAD_BALANCE )
makeUtil(Load load)
endif()
#LTS_END
########################################
# MistServer - Inputs #
########################################
macro(makeInput inputName format)
add_executable(MistIn${inputName}
src/input/mist_in.cpp
src/input/input.cpp
src/input/input_${format}.cpp
src/io.cpp
${BINARY_DIR}/mist/.headers
)
#Set compile definitions
unset(my_definitions)
list(APPEND my_definitions "INPUTTYPE=\"input_${format}.h\"")
set_target_properties(MistIn${inputName}
PROPERTIES COMPILE_DEFINITIONS "${my_definitions}"
)
target_link_libraries(MistIn${inputName}
mist
)
install(
TARGETS MistIn${inputName}
DESTINATION bin
)
endmacro()
makeInput(HLS hls)
makeInput(DTSC dtsc)
makeInput(DTSCCrypt dtsccrypt)
makeInput(MP3 mp3)
makeInput(FLV flv)
if (DEFINED WITH_AV )
makeInput(AV av)
target_link_libraries(MistInAV avformat avcodec avutil)
endif()
makeInput(OGG ogg)
makeInput(Buffer buffer)
makeInput(H264 h264)
makeInput(EBML ebml)
makeInput(ISMV ismv)#LTS
makeInput(MP4 mp4)#LTS
makeInput(TS ts)#LTS
makeInput(Folder folder)#LTS
makeInput(Balancer balancer)#LTS
makeInput(RTSP rtsp)#LTS
makeInput(SRT srt)#LTS
########################################
# MistServer - Outputs #
########################################
macro(makeOutput outputName format)
#Parse all extra arguments, for http and ts flags
SET (tsBaseClass Output)
if (";${ARGN};" MATCHES ";http;")
SET(httpOutput src/output/output_http.cpp)
if (";${ARGN};" MATCHES ";ts;")
SET(tsBaseClass HTTPOutput)
endif()
endif()
if (";${ARGN};" MATCHES ";ts;")
SET(tsOutput src/output/output_ts_base.cpp)
endif()
add_executable(MistOut${outputName}
src/output/mist_out.cpp
src/output/output.cpp
src/output/output_${format}.cpp
src/io.cpp
${httpOutput}
${tsOutput}
${BINARY_DIR}/mist/.headers
)
set_target_properties(MistOut${outputName}
PROPERTIES COMPILE_DEFINITIONS "OUTPUTTYPE=\"output_${format}.h\";TS_BASECLASS=${tsBaseClass}"
)
target_link_libraries(MistOut${outputName}
mist
)
install(
TARGETS MistOut${outputName}
DESTINATION bin
)
endmacro()
makeOutput(RTMP rtmp)
makeOutput(DTSC dtsc)
makeOutput(OGG progressive_ogg http)
makeOutput(FLV progressive_flv http)
makeOutput(HTTPMinimalServer http_minimalserver http)
makeOutput(MP4 progressive_mp4 http)
makeOutput(MP3 progressive_mp3 http)
makeOutput(H264 h264 http)
makeOutput(HSS hss http)
makeOutput(HDS hds http)
makeOutput(SRT srt http)
makeOutput(JSON json http)
makeOutput(TS ts ts)
makeOutput(HTTPTS httpts http ts)
makeOutput(HLS hls http ts)
makeOutput(EBML ebml)
makeOutput(Push push)#LTS
makeOutput(RTSP rtsp)#LTS
makeOutput(WAV wav)#LTS
if (NOT DEFINED NOSSL )
makeOutput(HTTPS https)#LTS
endif()
makeOutput(DASH dash_mp4 http)#LTS
if (DEFINED WITH_SANITY )
makeOutput(SanityCheck sanitycheck)#LTS
endif()
add_executable(MistOutHTTP
src/output/mist_out.cpp
src/output/output.cpp
src/output/output_http.cpp
src/output/output_http_internal.cpp
src/io.cpp
generated/silverlight.js.h
generated/embed.js.h
generated/html5.js.h
generated/flash_strobe.js.h
generated/theoplayer.js.h
generated/jwplayer.js.h
generated/polytrope.js.h
generated/dashjs.js.h
generated/videojs.js.h
generated/img.js.h
generated/playerdash.js.h
generated/playerdashlic.js.h
generated/playervideo.js.h
generated/playerhlsvideo.js.h
generated/core.js.h
generated/mist.css.h
)
set_target_properties(MistOutHTTP
PROPERTIES COMPILE_DEFINITIONS "OUTPUTTYPE=\"output_http_internal.h\""
)
target_link_libraries(MistOutHTTP mist)
install(
TARGETS MistOutHTTP
DESTINATION bin
)
########################################
# Documentation #
########################################
find_package(Doxygen)
if(DOXYGEN_FOUND)
configure_file(${SOURCE_DIR}/Doxyfile.in ${BINARY_DIR}/Doxyfile @ONLY)
add_custom_target( docs
${DOXYGEN_EXECUTABLE} ${BINARY_DIR}/Doxyfile
COMMAND rm -rf ${BINARY_DIR}/docs
COMMAND mv ${SOURCE_DIR}/docs ${BINARY_DIR}
WORKING_DIRECTORY ${SOURCE_DIR}
COMMENT "Generating API documentation with Doxygen"
VERBATIM
)
endif(DOXYGEN_FOUND)
########################################
# Sourcery #
########################################
#If cross compiling, assume failure.
if (CMAKE_CROSSCOMPILING)
set(RUNA "1")
else()
try_run(RUNA RUNB ${BINARY_DIR}/CMakeTmp ${SOURCE_DIR}/src/sourcery.cpp )
endif()
if("${RUNA}" EQUAL "42")
message("Not cross compiling - building sourcery")
add_executable(sourcery
src/sourcery.cpp
)
else()
message("Detected cross compiling")
if (EXISTS "${SOURCE_DIR}/sourcery")
if (EXISTS "${BINARY_DIR}/sourcery")
add_custom_target(sourcery )
else()
add_custom_target(sourcery
COMMAND cp ${SOURCE_DIR}/sourcery ${BINARY_DIR}/sourcery
)
endif()
else()
message(FATAL_ERROR "Cross compiling and no usable sourcery binary found - please supply it")
endif()
endif()
########################################
# Embed Code #
########################################
add_custom_command(OUTPUT generated/silverlight.js.h
COMMAND ./sourcery ${SOURCE_DIR}/embed/wrappers/silverlight.js silverlight_js generated/silverlight.js.h
DEPENDS sourcery ${SOURCE_DIR}/embed/wrappers/silverlight.js
)
add_custom_command(OUTPUT generated/embed.js.h
COMMAND ./sourcery ${SOURCE_DIR}/src/embed.js embed_js generated/embed.js.h
DEPENDS sourcery ${SOURCE_DIR}/src/embed.js
)
add_custom_command(OUTPUT generated/html5.js.h
COMMAND ./sourcery ${SOURCE_DIR}/embed/wrappers/html5.js html5_js generated/html5.js.h
DEPENDS sourcery ${SOURCE_DIR}/embed/wrappers/html5.js
)
add_custom_command(OUTPUT generated/flash_strobe.js.h
COMMAND ./sourcery ${SOURCE_DIR}/embed/wrappers/flash_strobe.js flash_strobe_js generated/flash_strobe.js.h
DEPENDS sourcery ${SOURCE_DIR}/embed/wrappers/flash_strobe.js
)
add_custom_command(OUTPUT generated/theoplayer.js.h
COMMAND ./sourcery ${SOURCE_DIR}/embed/wrappers/theoplayer.js theoplayer_js generated/theoplayer.js.h
DEPENDS sourcery ${SOURCE_DIR}/embed/wrappers/theoplayer.js
)
add_custom_command(OUTPUT generated/jwplayer.js.h
COMMAND ./sourcery ${SOURCE_DIR}/embed/wrappers/jwplayer.js jwplayer_js generated/jwplayer.js.h
DEPENDS sourcery ${SOURCE_DIR}/embed/wrappers/jwplayer.js
)
add_custom_command(OUTPUT generated/polytrope.js.h
COMMAND ./sourcery ${SOURCE_DIR}/embed/wrappers/polytrope.js polytrope_js generated/polytrope.js.h
DEPENDS sourcery ${SOURCE_DIR}/embed/wrappers/polytrope.js
)
add_custom_command(OUTPUT generated/dashjs.js.h
COMMAND ./sourcery ${SOURCE_DIR}/embed/wrappers/dashjs.js dash_js generated/dashjs.js.h
DEPENDS sourcery ${SOURCE_DIR}/embed/wrappers/dashjs.js
)
add_custom_command(OUTPUT generated/videojs.js.h
COMMAND ./sourcery ${SOURCE_DIR}/embed/wrappers/videojs.js video_js generated/videojs.js.h
DEPENDS sourcery ${SOURCE_DIR}/embed/wrappers/videojs.js
)
add_custom_command(OUTPUT generated/img.js.h
COMMAND ./sourcery ${SOURCE_DIR}/embed/wrappers/img.js img_js generated/img.js.h
DEPENDS sourcery ${SOURCE_DIR}/embed/wrappers/img.js
)
add_custom_command(OUTPUT generated/playerdashlic.js.h
COMMAND ./sourcery ${SOURCE_DIR}/embed/players/dash.js.license.js playerdashlic_js generated/playerdashlic.js.h
DEPENDS sourcery ${SOURCE_DIR}/embed/players/dash.js.license.js
)
add_custom_command(OUTPUT generated/playerdash.js.h
COMMAND ./sourcery ${SOURCE_DIR}/embed/players/dash.all.min.js playerdash_js generated/playerdash.js.h
DEPENDS sourcery ${SOURCE_DIR}/embed/players/dash.all.min.js
)
add_custom_command(OUTPUT generated/playervideo.js.h
COMMAND ./sourcery ${SOURCE_DIR}/embed/players/video.min.js playervideo_js generated/playervideo.js.h
DEPENDS sourcery ${SOURCE_DIR}/embed/players/video.min.js
)
add_custom_command(OUTPUT generated/playerhlsvideo.js.h
COMMAND ./sourcery ${SOURCE_DIR}/embed/players/videojs-contrib-hls.min.js playerhlsvideo_js generated/playerhlsvideo.js.h
DEPENDS sourcery ${SOURCE_DIR}/embed/players/videojs-contrib-hls.min.js
)
add_custom_command(OUTPUT generated/core.js.h
COMMAND ./sourcery ${SOURCE_DIR}/embed/core.js core_js generated/core.js.h
DEPENDS sourcery ${SOURCE_DIR}/embed/core.js
)
add_custom_command(OUTPUT generated/mist.css.h
COMMAND ./sourcery ${SOURCE_DIR}/embed/mist.css mist_css generated/mist.css.h
DEPENDS sourcery ${SOURCE_DIR}/embed/mist.css
)
########################################
# Local Settings Page #
########################################
set(lspSOURCES
${SOURCE_DIR}/lsp/plugins/jquery.js
${SOURCE_DIR}/lsp/plugins/jquery.flot.min.js
${SOURCE_DIR}/lsp/plugins/jquery.flot.time.min.js
${SOURCE_DIR}/lsp/plugins/jquery.qrcode.min.js
${SOURCE_DIR}/lsp/minified.js
)
add_custom_command(OUTPUT ${BINARY_DIR}/generated/server.html
COMMAND ${CMAKE_COMMAND} -DSOURCE_DIR="${SOURCE_DIR}" -DlspSOURCES="${lspSOURCES}" -P ${SOURCE_DIR}/CMakeServHtml.txt
DEPENDS ${lspSOURCES} ${SOURCE_DIR}/CMakeServHtml.txt ${SOURCE_DIR}/lsp/main.css ${SOURCE_DIR}/lsp/header.html ${SOURCE_DIR}/lsp/footer.html
)
add_custom_command(OUTPUT generated/server.html.h
COMMAND ./sourcery generated/server.html server_html generated/server.html.h
DEPENDS sourcery ${BINARY_DIR}/generated/server.html
)
########################################
# MistController - Build #
########################################
add_executable(MistController
src/controller/controller_limits.h
src/controller/controller_uplink.h
src/controller/controller_api.h
src/controller/controller_statistics.h
src/controller/controller_connectors.h
src/controller/controller_storage.h
src/controller/controller_updater.h
src/controller/controller_capabilities.h
src/controller/controller_streams.h
src/controller/controller_push.h
src/controller/controller_license.h
src/controller/controller.cpp
src/controller/controller_updater.cpp
src/controller/controller_streams.cpp
src/controller/controller_storage.cpp
src/controller/controller_connectors.cpp
src/controller/controller_statistics.cpp
src/controller/controller_limits.cpp
src/controller/controller_capabilities.cpp
src/controller/controller_uplink.cpp
src/controller/controller_api.cpp
src/controller/controller_push.cpp
src/controller/controller_license.cpp
generated/server.html.h
${BINARY_DIR}/mist/.headers
)
set_target_properties(MistController
PROPERTIES COMPILE_DEFINITIONS RELEASE=${RELEASE}
)
target_link_libraries(MistController
mist
)
install(
TARGETS MistController
DESTINATION bin
)
########################################
# Make Clean #
########################################
add_custom_target(clean-all
COMMAND ${CMAKE_BUILD_TOOL} clean
COMMAND rm -rf ${BINARY_DIR}/CMakeCache.txt
COMMAND rm -rf ${BINARY_DIR}/cmake_install.cmake
COMMAND rm -rf ${BINARY_DIR}/Makefile
COMMAND rm -rf ${BINARY_DIR}/CMakeFiles
COMMAND rm -rf ${BINARY_DIR}/Testing
COMMAND rm -rf ${BINARY_DIR}/CTestTestfile.cmake
COMMAND rm -rf ${BINARY_DIR}/DartConfiguration.tcl
COMMAND rm -rf ${BINARY_DIR}/mist
)
########################################
# Tests #
########################################
add_executable(aes_ctr128
test/aes_ctr128.cpp
${BINARY_DIR}/mist/.headers
)
target_link_libraries(aes_ctr128
mist
)
add_test(AESTest COMMAND aes_ctr128)
add_executable(urltest test/url.cpp ${BINARY_DIR}/mist/.headers)
target_link_libraries(urltest mist)
add_test(URLTest COMMAND urltest)
add_executable(downloadertest test/downloader.cpp ${BINARY_DIR}/mist/.headers)
target_link_libraries(downloadertest mist)
add_test(DownloaderTest COMMAND downloadertest)