cmake_minimum_required(VERSION 3.5) project(mtl LANGUAGES CXX C ASM) set(CMAKE_EXPORT_COMPILE_COMMANDS ON) option(BUILD_TESTS "Build tests" ON) message("Compiling MTL for ${CMAKE_SYSTEM_PROCESSOR}") # CONFIGURE_DEPENDS option was added in CMake v3.12. This option allows the # build system to automatically re-run CMake if the glob changes, solving the # major issue with globbing. May have a performance impact, but it should be # negligible compared to the time spent building. file(GLOB mtl_sources_common LIST_DIRECTORIES false CONFIGURE_DEPENDS src/common/*.cpp src/common/*.c src/common/*.s) file(GLOB mtl_sources_armv4t LIST_DIRECTORIES false CONFIGURE_DEPENDS src/armv4t/*.cpp src/armv4t/*.c src/armv4t/*.s) file(GLOB mtl_sources_gba LIST_DIRECTORIES false CONFIGURE_DEPENDS src/gba/*.cpp src/gba/*.c src/gba/*.s) file(GLOB mtl_sources_test LIST_DIRECTORIES false CONFIGURE_DEPENDS src/tests/*.cpp) set(mtl_include_common "include") set(mtl_include_gba "include/gba") set(mtl_include_armv4t "include/armv4t") # Sources are built into separate libraries and then linked into one static # library. The libraries which are linked first will have their symbols # prioritized over later libraries. add_library(${PROJECT_NAME} STATIC) add_library(${PROJECT_NAME}_common OBJECT) if (CMAKE_SYSTEM_NAME STREQUAL "NintendoGBA") add_library(${PROJECT_NAME}_gba OBJECT) target_sources(${PROJECT_NAME}_gba PRIVATE "${mtl_sources_gba}") target_include_directories(${PROJECT_NAME}_gba PUBLIC "${mtl_include_common}") target_include_directories(${PROJECT_NAME}_gba PUBLIC "${mtl_include_gba}") target_link_libraries(${PROJECT_NAME} PUBLIC ${PROJECT_NAME}_gba) endif() if (CMAKE_SYSTEM_PROCESSOR STREQUAL "armv4t") add_library(${PROJECT_NAME}_armv4t OBJECT) target_sources(${PROJECT_NAME}_armv4t PRIVATE "${mtl_sources_armv4t}") target_include_directories(${PROJECT_NAME}_armv4t PUBLIC "${mtl_include_common}") target_include_directories(${PROJECT_NAME}_armv4t PUBLIC "${mtl_include_armv4t}") target_link_libraries(${PROJECT_NAME} PUBLIC ${PROJECT_NAME}_armv4t) endif() if (BUILD_TESTS STREQUAL "ON") add_library(${PROJECT_NAME}_test OBJECT) target_sources(${PROJECT_NAME}_test PRIVATE "${mtl_sources_test}") target_link_libraries(${PROJECT_NAME} PUBLIC ${PROJECT_NAME}_test) endif() target_sources(${PROJECT_NAME}_common PRIVATE "${mtl_sources_common}") target_include_directories(${PROJECT_NAME}_common PUBLIC "${mtl_include_common}") target_link_libraries(${PROJECT_NAME} PUBLIC ${PROJECT_NAME}_common) # TODO: Support installing library