cmake_minimum_required(VERSION 3.5)

set(RAILCONTROL_VERSION "24")

project(CMakeTest)

add_executable(railcontrol
Storage/sqlite/sqlite3.c
Storage/sqlite/sqlite3.h
Storage/sqlite/sqlite3ext.h
Manager.cpp
Manager.h
Server/Web/WebClient.cpp
Server/Web/WebClient.h
ArgumentHandler.cpp
ArgumentHandler.h
Config.cpp
Config.h
ControlInterface.h
DataModel/Accessory.cpp
DataModel/Accessory.h
DataModel/AccessoryBase.cpp
DataModel/AccessoryBase.h
DataModel/AccessoryConfig.h
DataModel/Cluster.cpp
DataModel/Cluster.h
DataModel/DataModel.h
DataModel/Feedback.cpp
DataModel/Feedback.h
DataModel/FeedbackConfig.h
DataModel/HardwareHandle.cpp
DataModel/HardwareHandle.h
DataModel/Layer.h
DataModel/LayoutItem.cpp
DataModel/LayoutItem.h
DataModel/LockableItem.cpp
DataModel/LockableItem.h
DataModel/Loco.cpp
DataModel/Loco.h
DataModel/LocoBase.cpp
DataModel/LocoBase.h
DataModel/LocoConfig.h
DataModel/LocoFunctions.cpp
DataModel/LocoFunctions.h
DataModel/MultipleUnit.cpp
DataModel/MultipleUnit.h
DataModel/Object.cpp
DataModel/Object.h
DataModel/ObjectIdentifier.cpp
DataModel/ObjectIdentifier.h
DataModel/Relation.cpp
DataModel/Relation.h
DataModel/Route.cpp
DataModel/Route.h
DataModel/Serializable.cpp
DataModel/Serializable.h
DataModel/Signal.cpp
DataModel/Signal.h
DataModel/Switch.cpp
DataModel/Switch.h
DataModel/Text.cpp
DataModel/Text.h
DataModel/Track.cpp
DataModel/Track.h
DataTypes.h
Fallthrough.h
Hardware/AccessoryCache.cpp
Hardware/AccessoryCache.h
Hardware/CS1.h
Hardware/CS2Tcp.cpp
Hardware/CS2Tcp.h
Hardware/CS2Udp.cpp
Hardware/CS2Udp.h
Hardware/Capabilities.h
Hardware/CcSchnitte.cpp
Hardware/CcSchnitte.h
Hardware/DR5000.h
Hardware/DccPpExSerial.cpp
Hardware/DccPpExSerial.h
Hardware/DccPpExTcp.cpp
Hardware/DccPpExTcp.h
Hardware/Ecos.h
Hardware/FeedbackCache.cpp
Hardware/FeedbackCache.h
Hardware/HardwareHandler.cpp
Hardware/HardwareHandler.h
Hardware/HardwareInterface.h
Hardware/HardwareParams.h
Hardware/Hsi88.cpp
Hardware/Hsi88.h
Hardware/Intellibox.h
Hardware/Intellibox2.h
Hardware/LocoCache.cpp
Hardware/LocoCache.h
Hardware/LocoNetAdapter63120.h
Hardware/LocoNetAdapter63820.h
Hardware/M6051.cpp
Hardware/M6051.h
Hardware/MasterControl.h
Hardware/MasterControl2.h
Hardware/OpenDcc.h
Hardware/Protocols/DccPpEx.cpp
Hardware/Protocols/DccPpEx.h
Hardware/Protocols/EsuCAN.cpp
Hardware/Protocols/EsuCAN.h
Hardware/Protocols/LocoNet.cpp
Hardware/Protocols/LocoNet.h
Hardware/Protocols/LocoNetLocoCache.h
Hardware/Protocols/MaerklinCAN.h
Hardware/Protocols/MaerklinCANCommon.cpp
Hardware/Protocols/MaerklinCANCommon.h
Hardware/Protocols/P50x.cpp
Hardware/Protocols/P50x.h
Hardware/Protocols/P50xCache.h
Hardware/Protocols/P50xEthernet.h
Hardware/Protocols/P50xSerial.h
Hardware/Protocols/P50xUhlenbrock.h
Hardware/Protocols/Z21.cpp
Hardware/Protocols/Z21.h
Hardware/Protocols/Z21FeedbackCache.h
Hardware/Protocols/Z21LocoCache.h
Hardware/Protocols/Z21TurnoutCache.h
Hardware/RedBox.h
Hardware/Rektor.h
Hardware/TwinCenter.h
Hardware/Virtual.cpp
Hardware/Virtual.h
Hardware/Z21.h
Hardware/ZLib.cpp
Hardware/ZLib.h
Languages.cpp
Languages.h
Logger/Logger.cpp
Logger/Logger.h
Logger/LoggerClient.h
Logger/LoggerClientConsole.h
Logger/LoggerClientFile.h
Logger/LoggerClientTcp.h
Logger/LoggerServer.cpp
Logger/LoggerServer.h
Network/Select.h
Network/Serial.cpp
Network/Serial.h
Network/TcpClient.cpp
Network/TcpClient.h
Network/TcpConnection.cpp
Network/TcpConnection.h
Network/TcpServer.cpp
Network/TcpServer.h
Network/UdpClient.h
Network/UdpConnection.cpp
Network/UdpConnection.h
Network/UdpServer.cpp
Network/UdpServer.h
RailControl.cpp
RailControl.h
Server/CS2/CS2Client.cpp
Server/CS2/CS2Client.h
Server/CS2/CS2Server.cpp
Server/CS2/CS2Server.h
Server/Web/HtmlTag.cpp
Server/Web/HtmlTag.h
Server/Web/HtmlTagAccessory.cpp
Server/Web/HtmlTagAccessory.h
Server/Web/HtmlTagButton.cpp
Server/Web/HtmlTagButton.h
Server/Web/HtmlTagButtonCancel.h
Server/Web/HtmlTagButtonCommand.cpp
Server/Web/HtmlTagButtonCommand.h
Server/Web/HtmlTagButtonCommandFullScreen.cpp
Server/Web/HtmlTagButtonCommandFullScreen.h
Server/Web/HtmlTagButtonCommandPressRelease.cpp
Server/Web/HtmlTagButtonCommandPressRelease.h
Server/Web/HtmlTagButtonCommandToggle.cpp
Server/Web/HtmlTagButtonCommandToggle.h
Server/Web/HtmlTagButtonCommandWide.h
Server/Web/HtmlTagButtonMinus.h
Server/Web/HtmlTagButtonOK.h
Server/Web/HtmlTagButtonPlus.h
Server/Web/HtmlTagButtonPopup.cpp
Server/Web/HtmlTagButtonPopup.h
Server/Web/HtmlTagButtonPopupWide.h
Server/Web/HtmlTagFeedback.cpp
Server/Web/HtmlTagFeedback.h
Server/Web/HtmlTagInput.cpp
Server/Web/HtmlTagInput.h
Server/Web/HtmlTagInputCheckbox.h
Server/Web/HtmlTagInputCheckboxWithLabel.h
Server/Web/HtmlTagInputHidden.h
Server/Web/HtmlTagInputInteger.cpp
Server/Web/HtmlTagInputInteger.h
Server/Web/HtmlTagInputIntegerWithLabel.h
Server/Web/HtmlTagInputSlider.cpp
Server/Web/HtmlTagInputSlider.h
Server/Web/HtmlTagInputSliderLocoSpeed.cpp
Server/Web/HtmlTagInputSliderLocoSpeed.h
Server/Web/HtmlTagInputText.h
Server/Web/HtmlTagInputTextWithLabel.h
Server/Web/HtmlTagLabel.h
Server/Web/HtmlTagLayoutItem.cpp
Server/Web/HtmlTagLayoutItem.h
Server/Web/HtmlTagRoute.cpp
Server/Web/HtmlTagRoute.h
Server/Web/HtmlTagSelect.cpp
Server/Web/HtmlTagSelect.h
Server/Web/HtmlTagSelectMultiple.cpp
Server/Web/HtmlTagSelectMultiple.h
Server/Web/HtmlTagSelectMultipleWithLabel.cpp
Server/Web/HtmlTagSelectMultipleWithLabel.h
Server/Web/HtmlTagSelectOrientation.h
Server/Web/HtmlTagSelectOrientationWithLabel.h
Server/Web/HtmlTagSelectWithLabel.cpp
Server/Web/HtmlTagSelectWithLabel.h
Server/Web/HtmlTagSignal.cpp
Server/Web/HtmlTagSignal.h
Server/Web/HtmlTagSwitch.cpp
Server/Web/HtmlTagSwitch.h
Server/Web/HtmlTagText.cpp
Server/Web/HtmlTagText.h
Server/Web/HtmlTagTrack.cpp
Server/Web/HtmlTagTrack.h
Server/Web/Response.cpp
Server/Web/Response.h
Server/Web/ResponseCsv.cpp
Server/Web/ResponseCsv.h
Server/Web/ResponseHtml.cpp
Server/Web/ResponseHtml.h
Server/Web/ResponseHtmlFull.cpp
Server/Web/ResponseHtmlFull.h
Server/Web/ResponseHtmlNotFound.cpp
Server/Web/ResponseHtmlNotFound.h
Server/Web/ResponseHtmlNotImplemented.cpp
Server/Web/ResponseHtmlNotImplemented.h
Server/Web/WebClientCluster.cpp
Server/Web/WebClientCluster.h
Server/Web/WebClientRoute.cpp
Server/Web/WebClientRoute.h
Server/Web/WebClientSignal.cpp
Server/Web/WebClientSignal.h
Server/Web/WebClientStatic.cpp
Server/Web/WebClientStatic.h
Server/Web/WebClientText.cpp
Server/Web/WebClientText.h
Server/Web/WebClientTrack.cpp
Server/Web/WebClientTrack.h
Server/Web/WebServer.cpp
Server/Web/WebServer.h
Server/Z21/Z21Client.cpp
Server/Z21/Z21Client.h
Server/Z21/Z21Server.cpp
Server/Z21/Z21Server.h
Storage/Sqlite.cpp
Storage/Sqlite.h
Storage/StorageHandler.cpp
Storage/StorageHandler.h
Storage/StorageInterface.h
Storage/StorageParams.h
Storage/TransactionGuard.cpp
Storage/TransactionGuard.h
Utils/Integer.cpp
Utils/Integer.h
Utils/Network.cpp
Utils/Network.h
Utils/ThreadSafeQueue.h
Utils/Utils.cpp
Utils/Utils.h
Version.cpp
Version.cpp.dummy
Version.cpp.in
Version.h
Hardware/zlib/adler32.c
Hardware/zlib/compress.c
Hardware/zlib/crc32.c
Hardware/zlib/crc32.h
Hardware/zlib/deflate.c
Hardware/zlib/deflate.h
Hardware/zlib/gzclose.c
Hardware/zlib/gzguts.h
Hardware/zlib/gzlib.c
Hardware/zlib/gzread.c
Hardware/zlib/gzwrite.c
Hardware/zlib/infback.c
Hardware/zlib/inffast.c
Hardware/zlib/inffast.h
Hardware/zlib/inffixed.h
Hardware/zlib/inflate.c
Hardware/zlib/inflate.h
Hardware/zlib/inftrees.c
Hardware/zlib/inftrees.h
Hardware/zlib/trees.c
Hardware/zlib/trees.h
Hardware/zlib/uncompr.c
Hardware/zlib/zconf.h
Hardware/zlib/zlib.h
Hardware/zlib/zutil.c
Hardware/zlib/zutil.h
)

set(CMAKE_SHARED_LIBRARY_LINK_CXX_FLAGS "")
set(CMAKE_CXX_STANDARD 11)
set(CMAKE_CXX_STANDARD_REQUIRED True)
set(CMAKE_CXX_FLAGS_DEBUG "-O0")
set(CMAKE_CXX_FLAGS_RELEASE "-O2")
set(CMAKE_CXX_FLAGS "-g -Wall -Wextra -pedantic -Werror")
set(CMAKE_C_FLAGS "-g -DSQLITE_ENABLE_FTS4 -DSQLITE_ENABLE_JSON1 -DSQLITE_ENABLE_RTREE -DHAVE_USLEEP -Wno-implicit-function-declaration -Wno-return-local-addr")

set(THREADS_PREFER_PTHREAD_FLAG ON)
find_package(Threads REQUIRED)
target_link_libraries(railcontrol PRIVATE Threads::Threads dl)

target_include_directories(railcontrol PRIVATE .)

add_custom_command(OUTPUT Version.cpp Version.cpp.dummy
	DEPENDS Version.cpp.in
	COMMAND git status -s| wc -l > ${CMAKE_CURRENT_SOURCE_DIR}/git_dirty.txt
	COMMAND sed s/@COMPILE_TIMESTAMP@/`date +%s`/ < ${CMAKE_CURRENT_SOURCE_DIR}/Version.cpp.in | sed s/@GIT_HASH@/`git log -1 --format=%H`/ | sed s/@GIT_TIMESTAMP@/`git log -1 --format=%at`/ | sed s,@GIT_DIRTY@,`cat ${CMAKE_CURRENT_SOURCE_DIR}/git_dirty.txt`, | sed s/@RAILCONTROL_VERSION@/${RAILCONTROL_VERSION}/ > ${CMAKE_CURRENT_SOURCE_DIR}/Version.cpp
	COMMAND rm ${CMAKE_CURRENT_SOURCE_DIR}/git_dirty.txt
	COMMENT "Creating Version.cpp")

