diff --git a/CMakeLists.txt b/CMakeLists.txt index cd45e7a..fddbef8 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -1,4 +1,4 @@ -cmake_minimum_required(VERSION 3.1) +cmake_minimum_required(VERSION 3.14.4) message(STATUS "Using CMake ${CMAKE_VERSION}") @@ -61,9 +61,5 @@ endfunction(COPY_QT_BINARIES) find_package(OpenGL REQUIRED) -set(HEADER_SEARCH_PATHS) -set(SYSTEM_HEADER_SEARCH_PATHS) -set(LINK_LIBRARIES ${Boost_LIBRARIES} Qt5::Widgets Qt5::Network Qt5::Multimedia Qt5::Charts ${OPENGL_LIBRARIES}) - add_subdirectory(src) diff --git a/src/CMakeLists.txt b/src/CMakeLists.txt index 56c723c..44efa06 100644 --- a/src/CMakeLists.txt +++ b/src/CMakeLists.txt @@ -2,175 +2,178 @@ set(TARGET_BASE_NAME "DotaFactory") set(TARGET_APP_NAME "${TARGET_BASE_NAME}") set(TARGET_LIB_NAME "${TARGET_BASE_NAME}_lib") +set(TARGET_UI_NAME "${TARGET_BASE_NAME}_ui") set(TARGET_TEST_NAME "${TARGET_BASE_NAME}_test") -set(TARGET_LIB_HEADER_SEARCH_PATHS "${CMAKE_CURRENT_SOURCE_DIR}/lib" "${CMAKE_CURRENT_SOURCE_DIR}/external") -set(TARGET_TEST_HEADER_SEARCH_PATHS "${CMAKE_CURRENT_SOURCE_DIR}/test") +set(TARGET_LIB_INCLUDE_DIRS + "${CMAKE_CURRENT_SOURCE_DIR}/lib" + "${CMAKE_CURRENT_SOURCE_DIR}/external" +) +set(TARGET_UI_INCLUDE_DIRS "${CMAKE_CURRENT_SOURCE_DIR}/ui") +set(TARGET_TEST_INCLUDE_DIRS "${CMAKE_CURRENT_SOURCE_DIR}/test") -set(HEADER_SEARCH_PATHS ${TARGET_LIB_HEADER_SEARCH_PATHS} ${HEADER_SEARCH_PATHS}) - -set (SRC_DIR "${CMAKE_CURRENT_SOURCE_DIR}") +set(SRC_DIR "${CMAKE_CURRENT_SOURCE_DIR}") -# Lib ------------------------------------------------------------ +# ============================================================ +# lib — simulation + config +# Depends on Qt Core, toml++, tinyexpr only (no QtWidgets). +# ============================================================ -SET(HDRS) -SET(SRCS) -SET(LIB_INCLUDE_PATH) +set(HDRS) +set(SRCS) +set(LIB_INCLUDE_PATH) add_subdirectory(external) add_subdirectory(lib) set_source_files_properties(${EXTERNAL_FILES} PROPERTIES COMPILE_FLAGS "-w") -# Find includes in corresponding build directories set(CMAKE_INCLUDE_CURRENT_DIR ON) -# Instruct CMake to run moc automatically when needed. set(CMAKE_AUTOMOC ON) - -SET(RELATIVE_HDRS) +set(RELATIVE_HDRS) foreach (_file ${HDRS}) - file (RELATIVE_PATH _relPath "${SRC_DIR}" "${_file}") - list (APPEND RELATIVE_HDRS "${_relPath}") + file(RELATIVE_PATH _relPath "${SRC_DIR}" "${_file}") + list(APPEND RELATIVE_HDRS "${_relPath}") endforeach() -SET(RELATIVE_SRCS) +set(RELATIVE_SRCS) foreach (_file ${SRCS}) - file (RELATIVE_PATH _relPath "${SRC_DIR}" "${_file}") - list (APPEND RELATIVE_SRCS "${_relPath}") + file(RELATIVE_PATH _relPath "${SRC_DIR}" "${_file}") + list(APPEND RELATIVE_SRCS "${_relPath}") endforeach() -add_files( - LIB_FILES - ${RELATIVE_HDRS} - ${RELATIVE_SRCS} -) - -set(HEADER_SEARCH_PATHS ${LIB_INCLUDE_PATH} ${HEADER_SEARCH_PATHS}) +add_files(LIB_FILES ${RELATIVE_HDRS} ${RELATIVE_SRCS}) add_library(${TARGET_LIB_NAME} ${LIB_FILES} ${EXTERNAL_FILES}) - create_source_groups(${LIB_FILES}) create_source_groups(${EXTERNAL_FILES}) -UNSET(LIB_FILES) -UNSET(RELATIVE_HDRS) -UNSET(RELATIVE_SRCS) - set_property(TARGET ${TARGET_LIB_NAME} PROPERTY CXX_STANDARD 17) - -set_property( - TARGET ${TARGET_LIB_NAME} - PROPERTY INCLUDE_DIRECTORIES "${HEADER_SEARCH_PATHS}" +set_property(TARGET ${TARGET_LIB_NAME} PROPERTY INCLUDE_DIRECTORIES + "${TARGET_LIB_INCLUDE_DIRS}" + "${LIB_INCLUDE_PATH}" ) - -# include external header without warnings -target_include_directories(${TARGET_LIB_NAME} SYSTEM - PUBLIC "${SYSTEM_HEADER_SEARCH_PATHS}" -) - -target_link_libraries(${TARGET_LIB_NAME} ${LINK_LIBRARIES}) +target_link_libraries(${TARGET_LIB_NAME} Qt5::Core) set(CMAKE_AUTOMOC OFF) -set(LINK_LIBRARIES ${LINK_LIBRARIES} ${TARGET_LIB_NAME}) +unset(LIB_FILES) +unset(RELATIVE_HDRS) +unset(RELATIVE_SRCS) +unset(HDRS) +unset(SRCS) +unset(LIB_INCLUDE_PATH) -# App ------------------------------------------------------------ +# ============================================================ +# ui — QtWidgets + QOpenGLWidget +# Depends on lib. No sources yet; declared as INTERFACE library. +# When UI source files are added under src/ui/, change this to +# a regular static library and enable AUTOMOC on the target. +# ============================================================ + +add_subdirectory(ui) + +add_library(${TARGET_UI_NAME} INTERFACE) + +target_link_libraries(${TARGET_UI_NAME} INTERFACE + ${TARGET_LIB_NAME} + Qt5::Widgets + ${OPENGL_LIBRARIES} + Qt5::Network + Qt5::Multimedia + Qt5::Charts +) + +target_include_directories(${TARGET_UI_NAME} INTERFACE + "${TARGET_UI_INCLUDE_DIRS}" + "${TARGET_LIB_INCLUDE_DIRS}" +) + + +# ============================================================ +# app — thin main(); depends on ui +# ============================================================ set(OUTPUT_ROOT_PATH "${CMAKE_BINARY_DIR}/${TARGET_BASE_NAME}") if (WIN32) - COPY_QT_BINARIES("${OUTPUT_ROOT_PATH}/Debug/app/" True) - COPY_QT_BINARIES("${OUTPUT_ROOT_PATH}/Release/app/" False) - - string(REGEX REPLACE "/" "\\\\" BACKSLASHED_CMAKE_SOURCE_DIR ${CMAKE_SOURCE_DIR}) - string(REGEX REPLACE "/" "\\\\" BACKSLASHED_OUTPUT_ROOT_PATH ${OUTPUT_ROOT_PATH}) - execute_process( - COMMAND "cmd.exe" "/k" "rmdir" "${BACKSLASHED_OUTPUT_ROOT_PATH}\\Debug\\app\\data" & "mklink" "/d" "/j" "${BACKSLASHED_OUTPUT_ROOT_PATH}\\Debug\\app\\data" "${BACKSLASHED_CMAKE_SOURCE_DIR}\\bin\\app\\data" & exit - COMMAND "cmd.exe" "/k" "rmdir" "${BACKSLASHED_OUTPUT_ROOT_PATH}\\Release\\app\\data" & "mklink" "/d" "/j" "${BACKSLASHED_OUTPUT_ROOT_PATH}\\Release\\app\\data" "${BACKSLASHED_CMAKE_SOURCE_DIR}\\bin\\app\\data" & exit - ) + COPY_QT_BINARIES("${OUTPUT_ROOT_PATH}/Debug/app/" True) + COPY_QT_BINARIES("${OUTPUT_ROOT_PATH}/Release/app/" False) + + string(REGEX REPLACE "/" "\\\\" BACKSLASHED_CMAKE_SOURCE_DIR ${CMAKE_SOURCE_DIR}) + string(REGEX REPLACE "/" "\\\\" BACKSLASHED_OUTPUT_ROOT_PATH ${OUTPUT_ROOT_PATH}) + execute_process( + COMMAND "cmd.exe" "/k" "rmdir" "${BACKSLASHED_OUTPUT_ROOT_PATH}\\Debug\\app\\data" & "mklink" "/d" "/j" "${BACKSLASHED_OUTPUT_ROOT_PATH}\\Debug\\app\\data" "${BACKSLASHED_CMAKE_SOURCE_DIR}\\bin\\app\\data" & exit + COMMAND "cmd.exe" "/k" "rmdir" "${BACKSLASHED_OUTPUT_ROOT_PATH}\\Release\\app\\data" & "mklink" "/d" "/j" "${BACKSLASHED_OUTPUT_ROOT_PATH}\\Release\\app\\data" "${BACKSLASHED_CMAKE_SOURCE_DIR}\\bin\\app\\data" & exit + ) endif () -foreach( OUTPUTCONFIG ${CMAKE_CONFIGURATION_TYPES} ) - string( TOUPPER ${OUTPUTCONFIG} OUTPUTCONFIG ) - set( CMAKE_RUNTIME_OUTPUT_DIRECTORY_${OUTPUTCONFIG} "${OUTPUT_ROOT_PATH}/${OUTPUTCONFIG}/app/") -endforeach( OUTPUTCONFIG CMAKE_CONFIGURATION_TYPES ) - +foreach (OUTPUTCONFIG ${CMAKE_CONFIGURATION_TYPES}) + string(TOUPPER ${OUTPUTCONFIG} OUTPUTCONFIG) + set(CMAKE_RUNTIME_OUTPUT_DIRECTORY_${OUTPUTCONFIG} "${OUTPUT_ROOT_PATH}/${OUTPUTCONFIG}/app/") +endforeach () +set(HDRS) +set(SRCS) add_subdirectory(app) -SET(RELATIVE_HDRS) +set(RELATIVE_HDRS) foreach (_file ${HDRS}) - file (RELATIVE_PATH _relPath "${SRC_DIR}" "${_file}") - list (APPEND RELATIVE_HDRS "${_relPath}") + file(RELATIVE_PATH _relPath "${SRC_DIR}" "${_file}") + list(APPEND RELATIVE_HDRS "${_relPath}") endforeach() -SET(RELATIVE_SRCS) +set(RELATIVE_SRCS) foreach (_file ${SRCS}) - file (RELATIVE_PATH _relPath "${SRC_DIR}" "${_file}") - list (APPEND RELATIVE_SRCS "${_relPath}") + file(RELATIVE_PATH _relPath "${SRC_DIR}" "${_file}") + list(APPEND RELATIVE_SRCS "${_relPath}") endforeach() -add_files( - APP_FILES - ${RELATIVE_HDRS} - ${RELATIVE_SRCS} -) - +add_files(APP_FILES ${RELATIVE_HDRS} ${RELATIVE_SRCS}) add_executable(${TARGET_APP_NAME} ${APP_FILES}) - -set_target_properties(${TARGET_APP_NAME} PROPERTIES VS_DEBUGGER_WORKING_DIRECTORY "${OUTPUT_ROOT_PATH}/$(Configuration)/app/") - create_source_groups(${APP_FILES}) set_property(TARGET ${TARGET_APP_NAME} PROPERTY CXX_STANDARD 17) - -set_property( - TARGET ${TARGET_APP_NAME} PROPERTY INCLUDE_DIRECTORIES - "${TARGET_APP_HEADER_SEARCH_PATHS}" - "${HEADER_SEARCH_PATHS}" +set_target_properties(${TARGET_APP_NAME} PROPERTIES + VS_DEBUGGER_WORKING_DIRECTORY "${OUTPUT_ROOT_PATH}/$(Configuration)/app/" ) +target_link_libraries(${TARGET_APP_NAME} ${TARGET_UI_NAME}) -target_include_directories(${TARGET_APP_NAME} SYSTEM - PUBLIC "${SYSTEM_HEADER_SEARCH_PATHS}" -) - -target_link_libraries(${TARGET_APP_NAME} ${LINK_LIBRARIES}) +unset(APP_FILES) +unset(RELATIVE_HDRS) +unset(RELATIVE_SRCS) +unset(HDRS) +unset(SRCS) -# Test ------------------------------------------------------------ +# ============================================================ +# tests — Catch2 tests; links against lib only (no QtWidgets) +# ============================================================ add_subdirectory(test) -# Find includes in corresponding build directories set(CMAKE_INCLUDE_CURRENT_DIR ON) add_executable(${TARGET_TEST_NAME} ${TEST_FILES}) - create_source_groups(${TEST_FILES}) set_property(TARGET ${TARGET_TEST_NAME} PROPERTY CXX_STANDARD 17) - -set_property( - TARGET ${TARGET_TEST_NAME} PROPERTY INCLUDE_DIRECTORIES - "${TARGET_TEST_HEADER_SEARCH_PATHS}" - "${HEADER_SEARCH_PATHS}" +set_property(TARGET ${TARGET_TEST_NAME} PROPERTY INCLUDE_DIRECTORIES + "${TARGET_TEST_INCLUDE_DIRS}" + "${TARGET_LIB_INCLUDE_DIRS}" ) - -target_include_directories(${TARGET_TEST_NAME} SYSTEM - PUBLIC "${SYSTEM_HEADER_SEARCH_PATHS}" -) - -target_link_libraries(${TARGET_TEST_NAME} ${LINK_LIBRARIES}) +target_link_libraries(${TARGET_TEST_NAME} ${TARGET_LIB_NAME}) -# Export ------------------------------------------------------------ +# ============================================================ +# Export +# ============================================================ set(TARGET_LIB_NAME "${TARGET_LIB_NAME}" PARENT_SCOPE) +set(TARGET_UI_NAME "${TARGET_UI_NAME}" PARENT_SCOPE) set(TARGET_APP_NAME "${TARGET_APP_NAME}" PARENT_SCOPE) -set(HEADER_SEARCH_PATHS ${HEADER_SEARCH_PATHS} PARENT_SCOPE) -set(LINK_LIBRARIES ${LINK_LIBRARIES} PARENT_SCOPE) diff --git a/src/ui/CMakeLists.txt b/src/ui/CMakeLists.txt new file mode 100644 index 0000000..a06e79b --- /dev/null +++ b/src/ui/CMakeLists.txt @@ -0,0 +1,7 @@ +# UI source files are listed here as they are added. +# Append headers and sources to HDRS and SRCS in PARENT_SCOPE, +# following the same pattern used by src/lib/. +# +# When this directory has actual sources, the parent CMakeLists.txt +# must be updated to convert DotaFactory_ui from an INTERFACE library +# to a regular static library (and enable AUTOMOC on it).