summaryrefslogblamecommitdiff
path: root/CMakeLists.txt
blob: 564fffeba1b2ecd2b87649989e4f644781063fe8 (plain) (tree)
























































                                                                                                                                       



















                                             
                                      

                   







                                           
 









                                             

                                             















                                                                              

                                     

                                     
cmake_minimum_required(VERSION 3.10)

project(tmwAthena)

# Prefer to use G++ as the compiler
set(CMAKE_CXX_COMPILER g++)
# Set C++ standard to C++11
# Note we want -std=c++11, not -std=gnu++11, as we want to avoid GNU extensions
set(CMAKE_CXX_STANDARD 11)
set(CMAKE_CXX_EXTENSIONS OFF)
set(CMAKE_CXX_STANDARD_REQUIRED ON)

# Search through the tree for sources
# For each subfolder in src, add all .cpp files to a subfolder's SOURCES
# variable.
set(ALL_SOURCES "")
foreach(dir admin ast char compat conf generic high ints io login map mmo net proto-base range sexpr shared strings tests wire strtest)
    file(GLOB_RECURSE ${dir}_SOURCES CONFIGURE_DEPENDS src/${dir}/*.cpp)
    # Exclude any _test.cpp files from the build
    set(ALL_SOURCES ${ALL_SOURCES} ${${dir}_SOURCES})
    list(FILTER ${dir}_SOURCES EXCLUDE REGEX ".*_test.cpp")
    message("Adding sources in ${dir}: ${${dir}_SOURCES}")
endforeach()

# All targets include the include/ directory
include_directories(include)

# We want -fvisibility=hidden for regular objects, but not shared libraries.
# CMake provides a helpful preset for this.
# FIXME this is currently broken
#set(CMAKE_CXX_VISIBILITY_PRESET hidden)
# General purpose build flags.
set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -O2 -fstack-protector -fno-strict-aliasing -flto")
# Enable link time optimization, and track function and data sections. We let
# the linker remove unused code.
#set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -flto -ffunction-sections -fdata-sections -Wl,--gc-sections")
# Next, add warnings
#set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -Wall -Wextra")
# Add debug information
#set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -ggdb")

set_source_files_properties($(ALL_SOURCES) PROPERTIES IMPLICIT_DEPENDS CXX)


# Add a shared library: libtmwa-shared.so.0
# When we add_executable later, we need to link against this library.
add_library(tmwa-shared SHARED ${shared_SOURCES}
  src/io/dir.cpp
  src/io/fd.cpp
  src/io/read.cpp
  src/io/write.cpp
  ${strings_SOURCES}
)
# SO versioning
set_target_properties(tmwa-shared PROPERTIES VERSION 23.10.22.24.0 SOVERSION 0)

# We have four binaries we want to build: tmwa-{login,char,map,admin}
add_executable(tmwa-login ${login_SOURCES}
  ${generic_SOURCES}
  ${high_SOURCES}
  ${io_SOURCES}
  ${mmo_SOURCES}
  ${net_SOURCES}
  ${wire_SOURCES}
)
target_link_libraries(tmwa-login tmwa-shared)

add_executable(tmwa-char ${char_SOURCES}
  ${generic_SOURCES}
  ${high_SOURCES}
  ${io_SOURCES}
  ${mmo_SOURCES}
  ${net_SOURCES}
  ${wire_SOURCES}
)
target_link_libraries(tmwa-char tmwa-shared)

add_executable(tmwa-map ${map_SOURCES}
  ${ast_SOURCES}
  ${compat_SOURCES}
  ${generic_SOURCES}
  ${high_SOURCES}
  ${io_SOURCES}
  ${mmo_SOURCES}
  ${net_SOURCES}
  ${wire_SOURCES}
  )
target_link_libraries(tmwa-map tmwa-shared)

add_executable(tmwa-admin ${admin_SOURCES}
  ${generic_SOURCES}
  ${high_SOURCES}
  ${io_SOURCES}
  ${mmo_SOURCES}
  ${net_SOURCES}
  ${wire_SOURCES}
)
target_link_libraries(tmwa-admin tmwa-shared)

#add_executable(tmwa-test ${strtest_SOURCES})
#target_link_libraries(tmwa-test tmwa-shared)

# Some sources and includes are generated, such as the protocol headers.
# We defer to generate.make for these rules.
# Note that these are raw Makefile rules, not CMake rules, so a simple
# add_custom_command() won't work.
add_custom_target(generate
    COMMAND make -f ${CMAKE_SOURCE_DIR}/generate.mk
    WORKING_DIRECTORY ${CMAKE_SOURCE_DIR}
    COMMENT "Generating sources and includes"
)

# Call make -f ${CMAKE_SOURCE_DIR}/generate.mk clean to clean up the generated
# files. We want this to be run every time we call make clean.


# The generate target must be run before building the binaries
add_dependencies(tmwa-login generate)
add_dependencies(tmwa-char generate)
add_dependencies(tmwa-map generate)
add_dependencies(tmwa-admin generate)