diff --git .gitignore .gitignore index 1c0f60b99..19ae5dfeb 100644 --- .gitignore +++ .gitignore @@ -27,3 +27,5 @@ *.patch *.log /doxygen +*.kdev4* +.kateconfig diff --git CMakeLists.txt CMakeLists.txt new file mode 100644 index 000000000..ddced02b7 --- /dev/null +++ CMakeLists.txt @@ -0,0 +1,525 @@ +# +# This file is part of the Simutrans project under the artistic licence. +# (see licence.txt) +# + +cmake_minimum_required(VERSION 3.8) + +# Disable in-source builds +if (CMAKE_SOURCE_DIR STREQUAL CMAKE_BINARY_DIR) + message(FATAL_ERROR "Building Simutrans in-source is not supported. " + "Please delete ${CMAKE_SOURCE_DIR}/CMakeCache.txt and configure in a different " + "(preferrably empty) directory.") +endif (CMAKE_SOURCE_DIR STREQUAL CMAKE_BINARY_DIR) + +set(CMAKE_WARN_DEPRECATED ON) +list(APPEND CMAKE_MODULE_PATH "${CMAKE_SOURCE_DIR}/cmake/") + + +find_package(CCache) +if (CCache_FOUND) + option(SIMUTRANS_ENABLE_CCACHE "Enable CCache build cache" ON) + if (SIMUTRANS_ENABLE_CCACHE) + set_property(GLOBAL PROPERTY RULE_LAUNCH_COMPILE "${CCache_EXECUTABLE}") + set_property(GLOBAL PROPERTY RULE_LAUNCH_LINK "${CCache_EXECUTABLE}") + endif (SIMUTRANS_ENABLE_CCACHE) +endif (CCache_FOUND) + + +project(simutrans VERSION 120.4 LANGUAGES C CXX) + +include(simutrans-revision) + +include(TestBigEndian) +TEST_BIG_ENDIAN(SIMUTRANS_BIG_ENDIAN) + + +# +# Dependencies +# +find_package(ZLIB REQUIRED) +find_package(PNG REQUIRED) +find_package(BZip2 REQUIRED) +find_package(Freetype) +find_package(MiniUPNP) + +set(CMAKE_THREAD_PREFER_PTHREAD ON) +find_package(Threads) + + +# +# Configuration options +# +include(simutrans-backend) + +if (CMAKE_USE_PTHREADS_INIT) + option(SIMUTRANS_MULTI_THREAD "Use multiple threads for drawing" ON) +else (CMAKE_USE_PTHREADS_INIT) + set(SIMUTRANS_MULTI_THREAD OFF) +endif (CMAKE_USE_PTHREADS_INIT) + +if (NOT CMAKE_SIZEOF_VOID_P EQUAL 4) + option(SIMUTRANS_BUILD_32BIT "Build 32 or 64 bit executable" OFF) +endif () + + +option(SIMUTRANS_BUILD_MAKEOBJ "Build makeobj pakset tool" OFF) +option(SIMUTRANS_BUILD_NETTOOL "Build command-line tool for server administration" OFF) +option(SIMUTRANS_VALGRIND_SUPPORT "Add support for valgrind \"memcheck\" tool" OFF) + +if (Freetype_FOUND) + option(SIMUTRANS_USE_FREETYPE "Use freetype library for font rendering" ON) +endif (Freetype_FOUND) + +if (MiniUPNP_FOUND) + option(SIMUTRANS_USE_UPNP "Use MiniUPNP" ON) +endif (MiniUPNP_FOUND) + +option(SIMUTRANS_ENABLE_PROFILING "Enable profiling code" OFF) + +# +# output directory +# +file(MAKE_DIRECTORY ${CMAKE_BINARY_DIR}/simutrans) +set(CMAKE_RUNTIME_OUTPUT_DIRECTORY ${CMAKE_BINARY_DIR}/simutrans) + + +# +# sources +# +add_executable(simutrans + bauer/brueckenbauer.cc + bauer/fabrikbauer.cc + bauer/hausbauer.cc + bauer/tunnelbauer.cc + bauer/vehikelbauer.cc + bauer/goods_manager.cc + bauer/wegbauer.cc + descriptor/image.cc + descriptor/bridge_desc.cc + descriptor/factory_desc.cc + descriptor/ground_desc.cc + descriptor/building_desc.cc + descriptor/obj_base_desc.cc + descriptor/reader/bridge_reader.cc + descriptor/reader/building_reader.cc + descriptor/reader/citycar_reader.cc + descriptor/reader/crossing_reader.cc + descriptor/reader/factory_reader.cc + descriptor/reader/good_reader.cc + descriptor/reader/ground_reader.cc + descriptor/reader/groundobj_reader.cc + descriptor/reader/image_reader.cc + descriptor/reader/imagelist2d_reader.cc + descriptor/reader/imagelist_reader.cc + descriptor/reader/obj_reader.cc + descriptor/reader/pedestrian_reader.cc + descriptor/reader/roadsign_reader.cc + descriptor/reader/root_reader.cc + descriptor/reader/sim_reader.cc + descriptor/reader/skin_reader.cc + descriptor/reader/sound_reader.cc + descriptor/reader/text_reader.cc + descriptor/reader/tree_reader.cc + descriptor/reader/tunnel_reader.cc + descriptor/reader/vehicle_reader.cc + descriptor/reader/way_obj_reader.cc + descriptor/reader/way_reader.cc + descriptor/reader/xref_reader.cc + descriptor/sound_desc.cc + descriptor/tunnel_desc.cc + descriptor/vehicle_desc.cc + descriptor/goods_desc.cc + descriptor/way_desc.cc + boden/boden.cc + boden/brueckenboden.cc + boden/fundament.cc + boden/grund.cc + boden/monorailboden.cc + boden/tunnelboden.cc + boden/wasser.cc + boden/wege/kanal.cc + boden/wege/maglev.cc + boden/wege/monorail.cc + boden/wege/narrowgauge.cc + boden/wege/runway.cc + boden/wege/schiene.cc + boden/wege/strasse.cc + boden/wege/weg.cc + dataobj/crossing_logic.cc + dataobj/objlist.cc + dataobj/settings.cc + dataobj/freelist.cc + dataobj/gameinfo.cc + dataobj/height_map_loader.cc + dataobj/koord.cc + dataobj/koord3d.cc + dataobj/loadsave.cc + dataobj/marker.cc + dataobj/powernet.cc + dataobj/records.cc + dataobj/ribi.cc + dataobj/route.cc + dataobj/scenario.cc + dataobj/schedule.cc + dataobj/tabfile.cc + dataobj/translator.cc + dataobj/environment.cc + obj/baum.cc + obj/bruecke.cc + obj/crossing.cc + obj/field.cc + obj/gebaeude.cc + obj/groundobj.cc + obj/label.cc + obj/leitung2.cc + obj/pillar.cc + obj/roadsign.cc + obj/signal.cc + obj/tunnel.cc + obj/wayobj.cc + obj/wolke.cc + obj/zeiger.cc + display/font.cc + display/simview.cc + display/viewport.cc + freight_list_sorter.cc + gui/ai_option_t.cc + gui/ai_selector.cc + gui/banner.cc + gui/baum_edit.cc + gui/base_info.cc + gui/citybuilding_edit.cc + gui/citylist_frame_t.cc + gui/citylist_stats_t.cc + gui/climates.cc + gui/display_settings.cc + gui/components/gui_button.cc + gui/components/gui_chart.cc + gui/components/gui_combobox.cc + gui/components/gui_container.cc + gui/components/gui_convoiinfo.cc + gui/components/gui_obj_view_t.cc + gui/components/gui_fixedwidth_textarea.cc + gui/components/gui_flowtext.cc + gui/components/gui_image.cc + gui/components/gui_image_list.cc + gui/components/gui_komponente.cc + gui/components/gui_label.cc + gui/components/gui_map_preview.cc + gui/components/gui_numberinput.cc + gui/components/gui_scrollbar.cc + gui/components/gui_scrolled_list.cc + gui/components/gui_scrollpane.cc + gui/components/gui_speedbar.cc + gui/components/gui_tab_panel.cc + gui/components/gui_textarea.cc + gui/components/gui_textinput.cc + gui/components/gui_world_view_t.cc + gui/convoi_detail_t.cc + gui/convoi_filter_frame.cc + gui/convoi_frame.cc + gui/convoi_info_t.cc + gui/convoy_item.cc + gui/curiosity_edit.cc + gui/curiositylist_frame_t.cc + gui/curiositylist_stats_t.cc + gui/depot_frame.cc + gui/enlarge_map_frame_t.cc + gui/extend_edit.cc + gui/fabrik_info.cc + gui/factory_chart.cc + gui/factory_edit.cc + gui/factorylist_frame_t.cc + gui/factorylist_stats_t.cc + gui/goods_frame_t.cc + gui/goods_stats_t.cc + gui/ground_info.cc + gui/gui_frame.cc + gui/gui_theme.cc + gui/halt_detail.cc + gui/halt_info.cc + gui/halt_list_filter_frame.cc + gui/halt_list_frame.cc + gui/halt_list_stats.cc + gui/help_frame.cc + gui/jump_frame.cc + gui/karte.cc + gui/kennfarbe.cc + gui/label_info.cc + gui/labellist_frame_t.cc + gui/labellist_stats_t.cc + gui/line_item.cc + gui/line_management_gui.cc + gui/load_relief_frame.cc + gui/loadfont_frame.cc + gui/loadsave_frame.cc + gui/map_frame.cc + gui/message_frame_t.cc + gui/message_option_t.cc + gui/message_stats_t.cc + gui/messagebox.cc + gui/money_frame.cc + gui/optionen.cc + gui/pakselector.cc + gui/password_frame.cc + gui/player_frame_t.cc + gui/privatesign_info.cc + gui/savegame_frame.cc + gui/scenario_frame.cc + gui/scenario_info.cc + gui/schedule_gui.cc + gui/schedule_list.cc + gui/server_frame.cc + gui/settings_frame.cc + gui/settings_stats.cc + gui/signal_spacing.cc + gui/simwin.cc + gui/sound_frame.cc + gui/sprachen.cc + gui/city_info.cc + gui/station_building_select.cc + gui/themeselector.cc + gui/tool_selector.cc + gui/trafficlight_info.cc + gui/obj_info.cc + gui/welt.cc + network/checksum.cc + network/memory_rw.cc + network/network.cc + network/network_address.cc + network/network_cmd.cc + network/network_cmd_ingame.cc + network/network_cmd_scenario.cc + network/network_cmp_pakset.cc + network/network_file_transfer.cc + network/network_packet.cc + network/network_socket_list.cc + network/pakset_info.cc + network/pwd_hash.cc + old_blockmanager.cc + player/ai.cc + player/ai_goods.cc + player/ai_passenger.cc + player/ai_scripted.cc + player/finance.cc + player/simplay.cc + script/api_class.cc + script/api_function.cc + script/api_param.cc + script/api/api_city.cc + script/api/api_command.cc + script/api/api_const.cc + script/api/api_control.cc + script/api/api_convoy.cc + script/api/api_gui.cc + script/api/api_factory.cc + script/api/api_halt.cc + script/api/api_include.cc + script/api/api_line.cc + script/api/api_map_objects.cc + script/api/api_obj_desc.cc + script/api/api_obj_desc_base.cc + script/api/api_pathfinding.cc + script/api/api_player.cc + script/api/api_scenario.cc + script/api/api_schedule.cc + script/api/api_settings.cc + script/api/api_simple.cc + script/api/api_tiles.cc + script/api/api_world.cc + script/api/export_desc.cc + script/api/get_next.cc + script/dynamic_string.cc + script/export_objs.cc + script/script.cc + squirrel/sq_extensions.cc + squirrel/squirrel/sqapi.cc + squirrel/squirrel/sqclass.cc + squirrel/squirrel/sqdebug.cc + squirrel/squirrel/sqlexer.cc + squirrel/squirrel/sqobject.cc + squirrel/squirrel/sqtable.cc + squirrel/squirrel/sqbaselib.cc + squirrel/squirrel/sqcompiler.cc + squirrel/squirrel/sqfuncstate.cc + squirrel/squirrel/sqmem.cc + squirrel/squirrel/sqstate.cc + squirrel/squirrel/sqvm.cc + squirrel/sqstdlib/sqstdaux.cc + squirrel/sqstdlib/sqstdio.cc + squirrel/sqstdlib/sqstdrex.cc + squirrel/sqstdlib/sqstdstring.cc + squirrel/sqstdlib/sqstdblob.cc + squirrel/sqstdlib/sqstdmath.cc + squirrel/sqstdlib/sqstdstream.cc + squirrel/sqstdlib/sqstdsystem.cc + simcity.cc + simconvoi.cc + simdebug.cc + simdepot.cc + simobj.cc + simevent.cc + simfab.cc + simhalt.cc + siminteraction.cc + simintr.cc + simio.cc + simline.cc + simlinemgmt.cc + simloadingscreen.cc + simmain.cc + simmem.cc + simmenu.cc + simmesg.cc + simplan.cc + simskin.cc + simsound.cc + simsys.cc + simticker.cc + simtool.cc + simware.cc + simworld.cc + finder/placefinder.cc + unicode.cc + utils/cbuffer_t.cc + utils/csv.cc + utils/log.cc + utils/searchfolder.cc + utils/sha1.cc + utils/simrandom.cc + utils/simstring.cc + utils/simthread.cc + vehicle/movingobj.cc + vehicle/simpeople.cc + vehicle/simvehicle.cc + vehicle/simroadtraffic.cc +) + +if (WIN32) + target_sources(simutrans PRIVATE ../clipboard_w32.cc) +else (WIN32) + target_sources(simutrans PRIVATE ../clipboard_internal.cc) +endif (WIN32) + +if (SIMUTRANS_MULTI_THREAD) + target_compile_definitions(simutrans PRIVATE MULTI_THREAD) + target_link_libraries(simutrans PRIVATE Threads::Threads) +endif (SIMUTRANS_MULTI_THREAD) + + +if (SIMUTRANS_BUILD_HEADLESS) + target_sources(simutrans PRIVATE display/simgraph0.cc) + target_compile_definitions(simutrans PRIVATE COLOUR_DEPTH=0) +else (SIMUTRANS_BUILD_HEADLESS) + target_sources(simutrans PRIVATE display/simgraph16.cc) + target_compile_definitions(simutrans PRIVATE COLOUR_DEPTH=16) +endif (SIMUTRANS_BUILD_HEADLESS) + + +# Backup sound and music routines if the selected backend does not provide any routines +if (WIN32 OR MINGW) + set(BACKUP_SOUND sound/win32_sound.cc) + set(BACKUP_MUSIC music/w32_midi.cc) +else (WIN32 OR MINGW) + set(BACKUP_SOUND sound/no_sound.cc) + set(BACKUP_MUSIC music/no_midi.cc) +endif (WIN32 OR MINGW) + + +if (SIMUTRANS_BACKEND STREQUAL "sdl") + target_sources(simutrans PRIVATE simsys_s.cc sound/sdl_sound.cc ${BACKUP_MUSIC}) + target_include_directories(simutrans PRIVATE ${SDL_INCLUDE_DIR}) + target_link_libraries(simutrans ${SDL_LIBRARY}) + +elseif (SIMUTRANS_BACKEND STREQUAL "mixer_sdl") + target_sources(simutrans PRIVATE simsys_s.cc sound/sdl_mixer_sound.cc music/sdl_midi.cc) + target_include_directories(simutrans PRIVATE ${SDL_INCLUDE_DIR} ${SDL_MIXER_INCLUDE_DIRS}) + target_link_libraries(simutrans PRIVATE ${SDL_LIBRARY} ${SDL_MIXER_LIBRARIES}) + +elseif (SIMUTRANS_BACKEND STREQUAL "sdl2") + target_sources(simutrans PRIVATE simsys_s2.cc ${BACKUP_SOUND} ${BACKUP_MUSIC}) + target_include_directories(simutrans PRIVATE ${SDL2_INCLUDE_DIRS}) + target_link_libraries(simutrans PRIVATE ${SDL2_LIBRARIES}) + +elseif (SIMUTRANS_BACKEND STREQUAL "allegro") + target_sources(simutrans PRIVATE simsys_d.cc sound/allegro_sound.cc music/allegro_midi.cc) + target_link_libraries(simutrans Allegro::Allegro) + +elseif (SIMUTRANS_BACKEND STREQUAL "opengl") + target_sources(simutrans PRIVATE simsys_opengl.cc sound/sdl_sound.cc ${BACKUP_MUSIC}) + target_include_directories(simutrans PRIVATE ${SDL_INCLUDE_DIR} ${OPENGL_INCLUDE_DIR}) + target_link_libraries(simutrans ${SDL_LIBRARY} ${OPENGL_LIBRARIES} GLEW::GLEW) +endif () + + +# +# Link dependencies +# +target_link_libraries(simutrans PRIVATE + ZLIB::ZLIB + PNG::PNG + BZip2::BZip2 +) + +if (SIMUTRANS_USE_FREETYPE) + target_compile_options(simutrans PRIVATE -DUSE_FREETYPE=1) + target_include_directories(simutrans PRIVATE ${FREETYPE_INCLUDE_DIRS}) + target_link_libraries(simutrans PRIVATE ${FREETYPE_LIBRARIES}) +endif (SIMUTRANS_USE_FREETYPE) + +if (SIMUTRANS_USE_UPNP) + target_compile_definitions(simutrans PRIVATE USE_UPNP=1) + target_link_libraries(simutrans PRIVATE MiniUPNP::MiniUPNP) +endif (SIMUTRANS_USE_UPNP) + + + +# +# compile options +# +if (SIMUTRANS_BIG_ENDIAN) + add_definitions(simutrans PRIVATE SIM_BIG_ENDIAN) +endif () + +if (SIMUTRANS_VALGRIND_SUPPORT) + add_definitions(-DUSE_VALGRIND_MEMCHECK=1) +endif () + +if (SIMUTRANS_ENABLE_PROFILING) + add_definitions(-DPROFILE=1) +endif () + +include(simutrans-compile-options) +target_compile_options(simutrans PRIVATE ${SIMUTRANS_COMMON_COMPILE_OPTIONS}) + +if (NOT CMAKE_SIZEOF_VOID_P EQUAL 4) + if (SIMUTRANS_BUILD_32BIT) + target_compile_options(simutrans PRIVATE -m32) + set_target_properties(simutrans PROPERTIES LINK_FLAGS "-m32") + else () + # For now, emit a warning when compiling as 64 bit binary + message(WARNING "Simutrans is preferrably compiled as a 32 bit binary!") + endif (SIMUTRANS_BUILD_32BIT) +endif (NOT CMAKE_SIZEOF_VOID_P EQUAL 4) + + +target_compile_definitions(simutrans PRIVATE $,DEBUG=1,NDEBUG>) +target_compile_definitions(simutrans PRIVATE ENABLE_WATERWAY_SIGNS=0 AUTOJOIN_PUBLIC=0) + +if (SIMUTRANS_WITH_REVISION) + target_compile_definitions(simutrans PRIVATE REVISION=${SIMUTRANS_WC_REVISION}) +endif () + + +# +# Nettool/Makeobj +# +if (SIMUTRANS_BUILD_MAKEOBJ) + add_subdirectory(makeobj) +endif (SIMUTRANS_BUILD_MAKEOBJ) + + +if (SIMUTRANS_BUILD_NETTOOL) + add_subdirectory(nettools) +endif (SIMUTRANS_BUILD_NETTOOL) diff --git cmake/FindAllegro.cmake cmake/FindAllegro.cmake new file mode 100644 index 000000000..f851400a4 --- /dev/null +++ cmake/FindAllegro.cmake @@ -0,0 +1,68 @@ +# +# This file is part of the Simutrans project under the artistic licence. +# (see licence.txt) +# +# +# - Find Allegro graphics library. +# +# This module defines the following variables: +# Allegro_FOUND - true if Allegro was found +# Allegro_VERSION_STRING - version string of Allegro library +# Allegro_INCLUDE_DIRS - Include directories needed for Allegro +# Allegro_LIBRARIES - Libraries to link to when using Allegro +# +# Additionally, this module defines the IMPORTED target Allegro::Allegro, +# if Allegro has been found. +# + +include(FindPackageHandleStandardArgs) + + +if (Allegro_INCLUDE_DIRS AND Allegro_LIBRARIES) + # already in cache, be silent + set(Allegro_FIND_QUIETLY TRUE) +endif (Allegro_INCLUDE_DIRS AND Allegro_LIBRARIES) + + +find_path(Allegro_INCLUDE_DIR allegro.h + /usr/local/include + /usr/include + $ENV{MINGDIR}/include +) + +set(ALLEGRO_NAMES alleg alleglib allegdll) +find_library(Allegro_LIBRARY + NAMES ${ALLEGRO_NAMES} + PATHS /usr/local/lib /usr/lib $ENV{MINGDIR}/lib +) + +find_program(Allegro_CONFIG NAMES allegro-config) + +if (Allegro_CONFIG) + execute_process( + COMMAND "${Allegro_CONFIG}" --version + OUTPUT_VARIABLE Allegro_VERSION_STRING + OUTPUT_STRIP_TRAILING_WHITESPACE + ) +endif (Allegro_CONFIG) + +find_package_handle_standard_args(Allegro + FOUND_VAR Allegro_FOUND + REQUIRED_VARS Allegro_LIBRARY Allegro_INCLUDE_DIR + VERSION_VAR Allegro_VERSION_STRING +) + +set(Allegro_INCLUDE_DIRS "${Allegro_INCLUDE_DIR}") +set(Allegro_LIBRARIES "${Allegro_LIBRARY}") + +if (Allegro_FOUND OR NOT Allegro_FIND_REQUIRED) + # Only show variables when Allegro is required and not found + mark_as_advanced(Allegro_INCLUDE_DIRS Allegro_LIBRARIES Allegro_CONFIG Allegro_INCLUDE_DIR Allegro_LIBRARY) +endif (Allegro_FOUND OR NOT Allegro_FIND_REQUIRED) + +if (Allegro_FOUND AND NOT TARGET Allegro::Allegro) + add_library(Allegro::Allegro UNKNOWN IMPORTED) +endif (Allegro_FOUND AND NOT TARGET Allegro::Allegro) + +set_target_properties(Allegro::Allegro PROPERTIES INTERFACE_INCLUDE_DIRECTORIES "${Allegro_INCLUDE_DIRS}") +set_property(TARGET Allegro::Allegro APPEND PROPERTY IMPORTED_LOCATION "${Allegro_LIBRARIES}") diff --git cmake/FindCCache.cmake cmake/FindCCache.cmake new file mode 100644 index 000000000..cefd21099 --- /dev/null +++ cmake/FindCCache.cmake @@ -0,0 +1,36 @@ +# +# This file is part of the Simutrans project under the artistic licence. +# (see licence.txt) +# +# +# - Find CCache compiler cache executable. +# +# This module defines the following variables: +# CCache_FOUND - true if CCache was found. +# CCache_EXECUTABLE - Path to CCache executable. +# CCache_VERSION - Version string of CCache executable. +# + +include(FindPackageHandleStandardArgs) + +find_program(CCache_EXECUTABLE ccache) + +if (CCache_EXECUTABLE) + execute_process(COMMAND "${CCache_EXECUTABLE}" --version + OUTPUT_VARIABLE CCache_VERSION_OUTPUT + ) + + string(REGEX MATCH "version ([0-9]+\\.[0-9]+\\.[0-9]+)" CCache_VERSION_TEMP ${CCache_VERSION_OUTPUT}) + set(CCache_VERSION "${CMAKE_MATCH_0}") +endif (CCache_EXECUTABLE) + + +find_package_handle_standard_args(CCache + FOUND_VAR CCache_FOUND + REQUIRED_VARS CCache_EXECUTABLE + VERSION_VAR CCache_VERSION +) + +if (CCache_FOUND OR NOT CCache_FIND_REQUIRED) + mark_as_advanced(CCache_EXECUTABLE) +endif () diff --git cmake/FindMiniUPNP.cmake cmake/FindMiniUPNP.cmake new file mode 100644 index 000000000..97b06ee37 --- /dev/null +++ cmake/FindMiniUPNP.cmake @@ -0,0 +1,65 @@ +# +# This file is part of the Simutrans project under the artistic licence. +# (see licence.txt) +# +# +# Locate MiniUPNP library. +# This module defines +# MiniUPNP_FOUND, if miniupnp library and headers have been found +# MiniUPNP_LIBRARY, the miniupnp variant +# MiniUPNP_INCLUDE_DIR, where to find miniupnpc.h and family) +# MiniUPNP_VERSION, the API version of MiniUPNP +# + + +if (MiniUPNP_INCLUDE_DIR AND MiniUPNP_LIBRARY) + # Already in cache, be silent + set(MiniUPNP_FIND_QUIETLY TRUE) +endif () + +find_path(MiniUPNP_INCLUDE_DIR miniupnpc.h + HINTS $ENV{MINIUPNP_INCLUDE_DIR} + PATH_SUFFIXES miniupnpc +) + +find_library(MiniUPNP_LIBRARY miniupnpc + HINTS $ENV{MINIUPNP_LIBRARY} +) + +find_library(MiniUPNP_STATIC_LIBRARY libminiupnpc.a + HINTS $ENV{MINIUPNP_STATIC_LIBRARY} +) + +set(MiniUPNP_INCLUDE_DIRS ${MiniUPNP_INCLUDE_DIR}) +set(MiniUPNP_LIBRARIES ${MiniUPNP_LIBRARY}) +set(MiniUPNP_STATIC_LIBRARIES ${MiniUPNP_STATIC_LIBRARY}) + +include(FindPackageHandleStandardArgs) +find_package_handle_standard_args( + MiniUPNP DEFAULT_MSG + MiniUPNP_INCLUDE_DIR + MiniUPNP_LIBRARY +) + +if (MiniUPNP_FOUND) + file(STRINGS "${MiniUPNP_INCLUDE_DIR}/miniupnpc.h" MiniUPNP_API_VERSION_STR REGEX "^#define[\t ]+MINIUPNPC_API_VERSION[\t ]+[0-9]+") + if (MiniUPNP_API_VERSION_STR MATCHES "^#define[\t ]+MINIUPNPC_API_VERSION[\t ]+([0-9]+)") + set(MiniUPNP_API_VERSION "${CMAKE_MATCH_1}") + endif() + + if (MiniUPNP_API_VERSION GREATER_EQUAL 10 AND NOT MiniUPNP_FIND_QUIETLY) + message(STATUS "Found MiniUPNP API version ${MiniUPNP_API_VERSION}") + endif() +endif() + +mark_as_advanced(MiniUPNP_INCLUDE_DIR MiniUPNP_LIBRARY MiniUPNP_STATIC_LIBRARY) + +if (MiniUPNP_FOUND) + if (NOT TARGET MiniUPNP::MiniUPNP) + add_library(MiniUPNP::MiniUPNP UNKNOWN IMPORTED) + endif (NOT TARGET MiniUPNP::MiniUPNP) + + set_target_properties(MiniUPNP::MiniUPNP PROPERTIES INTERFACE_INCLUDE_DIRECTORIES "${MiniUPNP_INCLUDE_DIRS}") + set_target_properties(MiniUPNP::MiniUPNP PROPERTIES IMPORTED_LOCATION "${MiniUPNP_LIBRARIES}") +endif (MiniUPNP_FOUND) + diff --git cmake/simutrans-backend.cmake cmake/simutrans-backend.cmake new file mode 100644 index 000000000..06988cb55 --- /dev/null +++ cmake/simutrans-backend.cmake @@ -0,0 +1,47 @@ +# +# This file is part of the Simutrans project under the artistic licence. +# (see licence.txt) +# + +find_package(Allegro) +find_package(OpenGL) +find_package(GLEW) +find_package(SDL 1.2) +find_package(SDL_mixer 1.2) +find_package(SDL2) + + +option(SIMUTRANS_BUILD_HEADLESS "Build Simutrans without graphics backend. Recommended for standalone servers." OFF) + +if (NOT SIMUTRANS_BUILD_HEADLESS) + if (SDL2_FOUND) + list(APPEND AVAILABLE_BACKENDS "sdl2") + mark_as_advanced(SDL2_DIR) + endif (SDL2_FOUND) + + if (SDL_FOUND) + list(APPEND AVAILABLE_BACKENDS "sdl") + mark_as_advanced(SDLMAIN_LIBRARY SDL_INCLUDE_DIR SDL_LIBRARY) + + if (SDL_MIXER_FOUND) + list(APPEND AVAILABLE_BACKENDS "mixer_sdl") + endif (SDL_MIXER_FOUND) + + if (OpenGL_FOUND AND GLEW_FOUND) + list(APPEND AVAILABLE_BACKENDS "opengl") + endif (OpenGL_FOUND AND GLEW_FOUND) + endif (SDL_FOUND) + + if (Allegro_FOUND) + list(APPEND AVAILABLE_BACKENDS "allegro") + endif (Allegro_FOUND) + + if (AVAILABLE_BACKENDS) + string(REGEX MATCH "^[^;][^;]*" FIRST_BACKEND "${AVAILABLE_BACKENDS}") + set(SIMUTRANS_BACKEND "${FIRST_BACKEND}" CACHE STRING "Graphics backend") + set_property(CACHE SIMUTRANS_BACKEND PROPERTY STRINGS ${AVAILABLE_BACKENDS}) + else (AVAILABLE_BACKENDS) + message(WARNING "No suitable backend found (Must be one of: allegro sdl mixer_sdl sdl2 opengl).\nFalling back to headless compilation.") + set(SIMUTRANS_BUILD_HEADLESS TRUE) + endif (AVAILABLE_BACKENDS) +endif (NOT SIMUTRANS_BUILD_HEADLESS) diff --git cmake/simutrans-compile-options.cmake cmake/simutrans-compile-options.cmake new file mode 100644 index 000000000..db57dbe65 --- /dev/null +++ cmake/simutrans-compile-options.cmake @@ -0,0 +1,70 @@ +# +# This file is part of the Simutrans project under the artistic licence. +# (see licence.txt) +# + +include(CheckCXXCompilerFlag) + + +# +# This function adds all supported compiler flags to result_list +# Example: SIMUTRANS_CHECK_CXX_COMPILER_FLAGS(COMMON_COMPILE_OPTIONS -Wall -Wextra -Werror) +# will add -Wall -Wextra -Werror to COMMON_COMPILE_OPTIONS. +# +function(SIMUTRANS_CHECK_CXX_COMPILER_FLAGS result_list) + set(temp_list "") + foreach (flag ${ARGN}) + # We cannot check for -Wno-* or -fno-* as this won't throw a warning so we must check for -W* or -f* directly + string(REGEX REPLACE "^(-[Wf])no-" "\\1" sanitizedFlag ${flag}) + set(cachedVarName ${sanitizedFlag}) + string(REPLACE "+" "X" cachedVarName ${cachedVarName}) + string(REGEX REPLACE "[-=]" "_" cachedVarName ${cachedVarName}) + + if (NOT ${CMAKE_CXX_COMPILER_ID}_${cachedVarName}_CHECKED) + CHECK_CXX_COMPILER_FLAG(${sanitizedFlag} CXX_FLAG_${cachedVarName}_SUPPORTED) + set(${CMAKE_CXX_COMPILER_ID}_${cachedVarName}_CHECKED YES CACHE INTERNAL "") + endif() + + if (CXX_FLAG_${cachedVarName}_SUPPORTED) + list(APPEND temp_list ${flag}) + endif (CXX_FLAG_${cachedVarName}_SUPPORTED) + + unset(cachedVarName) + unset(sanitizedFlag) + endforeach () + + if (NOT ${result_list}) + set(${result_list} ${temp_list} PARENT_SCOPE) + elseif (temp_list) + set(${result_list} "${${result_list}};${temp_list}" PARENT_SCOPE) + endif () +endfunction() + + +SIMUTRANS_CHECK_CXX_COMPILER_FLAGS(SIMUTRANS_COMMON_COMPILE_OPTIONS + -std=c++03 + -Wall + -Wextra + -Wformat=2 + -Wundef + -Wmissing-include-dirs + -Wcast-qual + -Wpointer-arith + -Wcast-align + -Walloca + -Wduplicated-cond + -Wduplicated-branches + -Wno-implicit-fallthrough + -Wno-format-nonliteral + -Wno-unused-result + -Wno-array-bounds + -Wno-strict-aliasing + -Wno-overloaded-virtual + -Wno-cpp # Squelch #warning directive that is already emitted at CMake configure time +) + +if (SIMUTRANS_PROFILE) + SIMUTRANS_CHECK_CXX_COMPILER_FLAGS(SIMUTRANS_COMMON_COMPILE_OPTIONS + -pg -fno-inline -fno-schedule-insns + ) +endif (SIMUTRANS_PROFILE) diff --git cmake/simutrans-revision.cmake cmake/simutrans-revision.cmake new file mode 100644 index 000000000..964f01afd --- /dev/null +++ cmake/simutrans-revision.cmake @@ -0,0 +1,32 @@ +# +# This file is part of the Simutrans project under the artistic licence. +# (see licence.txt) +# + +find_package(Subversion) +find_package(Git) + + +if (Subversion_FOUND OR Git_FOUND) + option(SIMUTRANS_WITH_REVISION "Build executable with SVN/git revision information" ON) +endif (Subversion_FOUND OR Git_FOUND) + + +# We have to try Git first because Subversion_WC_INFO does not fail silently if +# this repository is not a Subversion repository +if (GIT_FOUND) + execute_process(COMMAND ${GIT_EXECUTABLE} describe --tags --always HEAD + OUTPUT_VARIABLE SIMUTRANS_WC_REVISION ERROR_QUIET OUTPUT_STRIP_TRAILING_WHITESPACE) +endif (GIT_FOUND) + +if (NOT SIMUTRANS_WC_REVISION AND Subversion_FOUND) + Subversion_WC_INFO(${CMAKE_SOURCE_DIR} SIMUTRANS) +endif () + +if (SIMUTRANS_WC_REVISION) + message(STATUS "Configuring Simutrans ${SIMUTRANS_WC_REVISION} ...") +else () + message(WARNING "Could not find revision information because this repository " + "is neither a Subversion nor a Git repository. Revision information " + "will be unavailable.") +endif () diff --git makeobj/CMakeLists.txt makeobj/CMakeLists.txt new file mode 100644 index 000000000..0b4801823 --- /dev/null +++ makeobj/CMakeLists.txt @@ -0,0 +1,69 @@ +# +# This file is part of the Simutrans project under the artistic licence. +# (see licence.txt) +# + +add_executable(makeobj + makeobj.cc +) + +target_compile_options(makeobj PRIVATE ${SIMUTRANS_COMMON_COMPILE_OPTIONS}) +target_compile_definitions(makeobj PRIVATE MAKEOBJ=1 COLOUR_DEPTH=0) + + +target_link_libraries(makeobj + ZLIB::ZLIB + PNG::PNG + BZip2::BZip2 +) + + +# These source files are unique to makeobj +target_sources(makeobj PRIVATE + ../descriptor/writer/bridge_writer.cc + ../descriptor/writer/building_writer.cc + ../descriptor/writer/citycar_writer.cc + ../descriptor/writer/crossing_writer.cc + ../descriptor/writer/factory_writer.cc + ../descriptor/writer/get_climate.cc + ../descriptor/writer/get_waytype.cc + ../descriptor/writer/good_writer.cc + ../descriptor/writer/groundobj_writer.cc + ../descriptor/writer/ground_writer.cc + ../descriptor/writer/image_writer.cc + ../descriptor/writer/imagelist2d_writer.cc + ../descriptor/writer/imagelist_writer.cc + ../descriptor/writer/obj_node.cc + ../descriptor/writer/obj_writer.cc + ../descriptor/writer/pedestrian_writer.cc + ../descriptor/writer/roadsign_writer.cc + ../descriptor/writer/root_writer.cc + ../descriptor/writer/sim_writer.cc + ../descriptor/writer/skin_writer.cc + ../descriptor/writer/sound_writer.cc + ../descriptor/writer/text_writer.cc + ../descriptor/writer/tree_writer.cc + ../descriptor/writer/tunnel_writer.cc + ../descriptor/writer/vehicle_writer.cc + ../descriptor/writer/way_writer.cc + ../descriptor/writer/way_obj_writer.cc + ../descriptor/writer/xref_writer.cc + ../utils/dr_rdpng.cc +) + +# These source files produce the same object code in makeobj and simutrans +target_sources(makeobj PRIVATE + ../descriptor/image.cc + ../dataobj/freelist.cc + ../simdebug.cc + ../simmem.cc + ../utils/simstring.cc + ../utils/searchfolder.cc +) + +# These source files produce different object code in makeobj and simutrans +target_sources(makeobj PRIVATE + ../dataobj/tabfile.cc + ../utils/log.cc +) + diff --git nettools/CMakeLists.txt nettools/CMakeLists.txt new file mode 100644 index 000000000..3ad17a133 --- /dev/null +++ nettools/CMakeLists.txt @@ -0,0 +1,34 @@ +# +# This file is part of the Simutrans project under the artistic licence. +# (see licence.txt) +# + +add_executable(nettool + nettool.cc +) + +target_compile_options(nettool PRIVATE ${SIMUTRANS_COMMON_COMPILE_OPTIONS}) +target_compile_definitions(nettool PRIVATE NETTOOL=1 COLOUR_DEPTH=0) + +# these source files produce the same object code in nettool and simutrans +target_sources(nettool PRIVATE + ../dataobj/freelist.cc + ../network/memory_rw.cc + ../network/network_address.cc + ../network/network_cmd.cc + ../network/network_packet.cc + ../network/network_socket_list.cc + ../network/pwd_hash.cc + ../simdebug.cc + ../simmem.cc + ../utils/simstring.cc + ../utils/fetchopt.cc + ../utils/sha1.cc +) + +# these source files produce different object code in nettool and simutrans +target_sources(nettool PRIVATE + ../utils/log.cc + ../network/network.cc + ../network/network_file_transfer.cc +)