# ----------------------------------------------------------------------------- # Codam Coding College, Amsterdam @ 2022-2023 by W2Wizard. # See README in the root project for more information. # ----------------------------------------------------------------------------- # CMake specifications # ----------------------------------------------------------------------------- cmake_minimum_required (VERSION 3.18.0) project(mlx42 VERSION 2.3.2) message(STATUS "MLX42 @ ${CMAKE_PROJECT_VERSION}") # Variables # ----------------------------------------------------------------------------- set(SOURCE_DIR ${CMAKE_CURRENT_SOURCE_DIR}/src) set(TOOLS_DIR ${CMAKE_CURRENT_SOURCE_DIR}/tools) set(CMAKE_RUNTIME_OUTPUT_DIRECTORY ${CMAKE_BINARY_DIR}) set(CMAKE_DIR ${CMAKE_CURRENT_SOURCE_DIR}/cmake) set(CMAKE_C_STANDARD 11) set(CMAKE_C_EXTENSIONS OFF) set(CMAKE_C_STANDARD_REQUIRED ON) set(CMAKE_POSITION_INDEPENDENT_CODE ON) set_property(GLOBAL PROPERTY USE_FOLDERS ON) list(APPEND CMAKE_MODULE_PATH "${PROJECT_SOURCE_DIR}/cmake") # Options set(DEBUG OFF CACHE BOOL "Build MLX42 in debug mode, enabling assertions") set(GLFW_FETCH ON CACHE BOOL "Clone and install GLFW") set(BUILD_TESTS OFF CACHE BOOL "Build the tests to verify the integrity of the lib") # Compile Options # ----------------------------------------------------------------------------- # Reduce the size of LodePNG, we don't need these things. add_definitions(-D LODEPNG_NO_COMPILE_ENCODER) add_definitions(-D LODEPNG_NO_COMPILE_ANCILLARY_CHUNKS) if(UNIX) set(CCSHADER ${PROJECT_SOURCE_DIR}/tools/compile_shader.sh) add_compile_options( -Wextra -Wall -Werror -Wunreachable-code # Some low priority warnings that are annoying. -Wno-char-subscripts -Wno-sign-compare -Wno-unused-parameter -Wno-missing-field-initializers ) if(DEBUG) message(STATUS "Building in DEBUG mode") add_compile_options(-g) else() message(STATUS "Building in RELEASE mode") add_definitions(-D NDEBUG) add_compile_options(-Ofast) endif(DEBUG) else() # TODO: Figure out what we need for windows. set(CCSHADER ${PROJECT_SOURCE_DIR}/tools/compile_shader.bat) endif() # Build specific files # @see https://cmake.org/cmake/help/latest/command/add_custom_command.html # ----------------------------------------------------------------------------- add_custom_command( COMMENT "Building fragment shader" DEPENDS ${PROJECT_SOURCE_DIR}/shaders/default.frag OUTPUT mlx_frag_shader.c COMMAND ${CCSHADER} ${PROJECT_SOURCE_DIR}/shaders/default.frag > mlx_frag_shader.c VERBATIM PRE_BUILD USES_TERMINAL ) add_custom_command( COMMENT "Building vertex shader" DEPENDS ${PROJECT_SOURCE_DIR}/shaders/default.vert OUTPUT mlx_vert_shader.c COMMAND ${CCSHADER} ${PROJECT_SOURCE_DIR}/shaders/default.vert > mlx_vert_shader.c VERBATIM PRE_BUILD USES_TERMINAL ) # Sources # ----------------------------------------------------------------------------- add_library(mlx42 STATIC # Root ${SOURCE_DIR}/mlx_cursor.c ${SOURCE_DIR}/mlx_exit.c ${SOURCE_DIR}/mlx_images.c ${SOURCE_DIR}/mlx_init.c ${SOURCE_DIR}/mlx_keys.c ${SOURCE_DIR}/mlx_loop.c ${SOURCE_DIR}/mlx_monitor.c ${SOURCE_DIR}/mlx_mouse.c ${SOURCE_DIR}/mlx_put_pixel.c ${SOURCE_DIR}/mlx_window.c # Utils ${SOURCE_DIR}/utils/mlx_error.c ${SOURCE_DIR}/utils/mlx_list.c ${SOURCE_DIR}/utils/mlx_utils.c ${SOURCE_DIR}/utils/mlx_compare.c # Textures ${SOURCE_DIR}/font/mlx_font.c ${SOURCE_DIR}/textures/mlx_png.c ${SOURCE_DIR}/textures/mlx_texture.c ${SOURCE_DIR}/textures/mlx_xpm42.c # Libs lib/png/lodepng.c lib/glad/glad.c mlx_vert_shader.c mlx_frag_shader.c ) target_include_directories(mlx42 PUBLIC ${CMAKE_CURRENT_SOURCE_DIR}/include) # Dependencies # ----------------------------------------------------------------------------- find_package(glfw3) find_package(OpenGL REQUIRED) target_link_libraries(mlx42 OpenGL::GL) if (NOT glfw3_FOUND AND GLFW_FETCH) message(STATUS "Install GLFW to suppress this message") message(STATUS "Please wait, fetching GLFW ...") include(${CMAKE_DIR}/LinkGLFW.cmake) LinkGLFW(mlx42) elseif(NOT glfw3_FOUND AND NOT GLFW_FETCH) message(FATAL_ERROR "Unable to build: GLFW can't be found nor fetched.") endif() if (glfw3_FOUND) target_link_libraries(mlx42 ${GLFW3_LIBRARY}) endif() if(APPLE) target_link_libraries(mlx42 "-framework Cocoa" "-framework IOKit") endif() # Testing # ----------------------------------------------------------------------------- # Only build tests if we are the main project or explicitly told to, make sure # tests are not built when mlx42 is included as a subproject, use MLX42_BUILD_TESTS to overwrite this # use cmake -DBUILD_TESTS=ON/-DMLX42_BUILD_TESTS=ON to build tests if ((PROJECT_NAME STREQUAL CMAKE_PROJECT_NAME AND BUILD_TESTS) OR MLX42_BUILD_TESTS) add_subdirectory(tests) enable_testing() endif() # Installation # ----------------------------------------------------------------------------- # Convenience feature to install the library and headers to the system. # Use cmake -DCMAKE_INSTALL_PREFIX=/usr/local for example to install to /usr/local # or any other directory that you want to install to. # # This only really useful if you are a system administrator and want to install # the library to the system, if you are a developer you should just use the # library as a subproject as you probably don't have (nor really should) have any # amibitons to use this for anything other than your own school projects. install( DIRECTORY ./include/MLX42 DESTINATION ${CMAKE_INSTALL_PREFIX}/include FILES_MATCHING PATTERN MLX42.h ) install(TARGETS mlx42 EXPORT mlx42Targets RUNTIME DESTINATION "${CMAKE_INSTALL_BINDIR}" ARCHIVE DESTINATION "${CMAKE_INSTALL_LIBDIR}" LIBRARY DESTINATION "${CMAKE_INSTALL_LIBDIR}" )