cmake_minimum_required(VERSION 2.8) # define a macro that helps defining an option macro(sfml_set_option var default type docstring) if(NOT DEFINED ${var}) set(${var} ${default}) endif() set(${var} ${${var}} CACHE ${type} ${docstring} FORCE) endmacro() # set a default build type if none was provided # this has to be done before the project() instruction! sfml_set_option(CMAKE_BUILD_TYPE Release STRING "Choose the type of build (Debug or Release)") # project name project(SFML) # include the configuration file include(${CMAKE_CURRENT_SOURCE_DIR}/cmake/Config.cmake) # setup version numbers set(VERSION_MAJOR 2) set(VERSION_MINOR 1) set(VERSION_PATCH 0) # add the SFML header path include_directories(${CMAKE_CURRENT_SOURCE_DIR}/include) # add an option for choosing the build type (shared or static) if(IOS) set(BUILD_SHARED_LIBS_DEFAULT FALSE) else() set(BUILD_SHARED_LIBS_DEFAULT TRUE) endif() sfml_set_option(BUILD_SHARED_LIBS ${BUILD_SHARED_LIBS_DEFAULT} BOOL "TRUE to build SFML as shared libraries, FALSE to build it as static libraries") # add an option for building the examples sfml_set_option(SFML_BUILD_EXAMPLES FALSE BOOL "TRUE to build the SFML examples, FALSE to ignore them") # add an option for building the API documentation sfml_set_option(SFML_BUILD_DOC FALSE BOOL "TRUE to generate the API documentation, FALSE to ignore it") # set default CMAKE_OSX_ARCHITECTURES value to x86_64 sfml_set_option(CMAKE_OSX_ARCHITECTURES "x86_64" STRING "Build architectures for OS X") # set default CMAKE_OSX_DEPLOYMENT_TARGET value to 10.7 sfml_set_option(CMAKE_OSX_DEPLOYMENT_TARGET "10.7" STRING "Minimum OS version to target for deployment (at runtime)") # add an option for choosing the OpenGL implementation sfml_set_option(SFML_OPENGL_ES ${OPENGL_ES} BOOL "TRUE to use an OpenGL ES implementation, FALSE to use a desktop OpenGL implementation") # Mac OS X specific options if(SFML_OS_MACOSX) # add an option to build frameworks instead of dylibs (release only) sfml_set_option(SFML_BUILD_FRAMEWORKS FALSE BOOL "TRUE to build SFML as frameworks libraries (release only), FALSE to build according to BUILD_SHARED_LIBS") # add an option to let the user specify a custom directory for frameworks installation (SFML, sndfile, ...) sfml_set_option(CMAKE_INSTALL_FRAMEWORK_PREFIX "/Library/Frameworks" STRING "Frameworks installation directory") # add an option to automatically install Xcode 4 templates sfml_set_option(SFML_INSTALL_XCODE4_TEMPLATES FALSE BOOL "TRUE to automatically install the Xcode 4 templates, FALSE to do nothing about it") endif() # define SFML_STATIC if the build type is not set to 'shared' if(NOT BUILD_SHARED_LIBS) add_definitions(-DSFML_STATIC) endif() # remove SL security warnings with Visual C++ if(SFML_COMPILER_MSVC) add_definitions(-D_CRT_SECURE_NO_DEPRECATE) endif() # define SFML_OPENGL_ES if needed if(SFML_OPENGL_ES) add_definitions(-DSFML_OPENGL_ES) endif() # define an option for choosing between static and dynamic C runtime (Windows only) if(SFML_OS_WINDOWS) sfml_set_option(SFML_USE_STATIC_STD_LIBS FALSE BOOL "TRUE to statically link to the standard libraries, FALSE to use them as DLLs") # the following combination of flags is not valid if (BUILD_SHARED_LIBS AND SFML_USE_STATIC_STD_LIBS) message(FATAL_ERROR "BUILD_SHARED_LIBS and SFML_USE_STATIC_STD_LIBS cannot be used together") endif() # for VC++, we can apply it globally by modifying the compiler flags if(SFML_COMPILER_MSVC AND SFML_USE_STATIC_STD_LIBS) foreach(flag CMAKE_CXX_FLAGS CMAKE_CXX_FLAGS_DEBUG CMAKE_CXX_FLAGS_RELEASE CMAKE_CXX_FLAGS_MINSIZEREL CMAKE_CXX_FLAGS_RELWITHDEBINFO) if(${flag} MATCHES "/MD") string(REGEX REPLACE "/MD" "/MT" ${flag} "${${flag}}") endif() endforeach() endif() endif() # disable the rpath stuff set(CMAKE_SKIP_BUILD_RPATH TRUE) # setup Mac OS X stuff if(SFML_OS_MACOSX) # SFML_BUILD_FRAMEWORKS needs two things : # first, it's available only for release # (because cmake currently doesn't allow specifying a custom framework name so XXX-d is not possible) # secondly, it works only with BUILD_SHARED_LIBS enabled if(SFML_BUILD_FRAMEWORKS) # requirement #1 if(NOT CMAKE_BUILD_TYPE STREQUAL "Release") message(FATAL_ERROR "CMAKE_BUILD_TYPE should be \"Release\" when SFML_BUILD_FRAMEWORKS is TRUE") return() endif() # requirement #2 if(NOT BUILD_SHARED_LIBS) message(FATAL_ERROR "BUILD_SHARED_LIBS should be TRUE when SFML_BUILD_FRAMEWORKS is TRUE") return() endif() endif() # Objective-C ARC requires a 64 bit runtime. if(NOT CMAKE_OSX_ARCHITECTURES STREQUAL "x86_64") message(FATAL_ERROR "CMAKE_OSX_ARCHITECTURES should be 'x86_64' to support ARC") return() endif() # make sure CMAKE_OSX_DEPLOYMENT_TARGET is >= 10.7 if (CMAKE_OSX_DEPLOYMENT_TARGET VERSION_LESS "10.7") message(FATAL_ERROR "CMAKE_OSX_DEPLOYMENT_TARGET (${CMAKE_OSX_DEPLOYMENT_TARGET}) should be 10.7 or better") return() endif() endif() if(SFML_OS_LINUX OR SFML_OS_FREEBSD) if(BUILD_SHARED_LIBS) sfml_set_option(SFML_INSTALL_PKGCONFIG_FILES FALSE BOOL "TRUE to automatically install pkg-config files so other projects can find SFML") if(SFML_INSTALL_PKGCONFIG_FILES) foreach(sfml_module IN ITEMS all system window graphics audio network) CONFIGURE_FILE( "tools/pkg-config/sfml-${sfml_module}.pc.in" "tools/pkg-config/sfml-${sfml_module}.pc" @ONLY) INSTALL(FILES "${CMAKE_CURRENT_BINARY_DIR}/tools/pkg-config/sfml-${sfml_module}.pc" DESTINATION "${CMAKE_INSTALL_PREFIX}/lib${LIB_SUFFIX}/pkgconfig") endforeach() endif() else() if(SFML_INSTALL_PKGCONFIG_FILES) message(WARNING "No pkg-config files are provided for the static SFML libraries (SFML_INSTALL_PKGCONFIG_FILES will be ignored).") endif() endif() endif() # enable project folders set_property(GLOBAL PROPERTY USE_FOLDERS ON) set_property(GLOBAL PROPERTY PREDEFINED_TARGETS_FOLDER "CMake") # add the subdirectories add_subdirectory(src/SFML) if(SFML_BUILD_EXAMPLES) add_subdirectory(examples) endif() if(SFML_BUILD_DOC) add_subdirectory(doc) endif() # setup the install rules if(NOT SFML_BUILD_FRAMEWORKS) install(DIRECTORY include DESTINATION . COMPONENT devel PATTERN ".svn" EXCLUDE) else() # find only "root" headers file(GLOB SFML_HEADERS RELATIVE ${PROJECT_SOURCE_DIR} "include/SFML/*") # in fact we have to fool cmake to copy all the headers in subdirectories # to do that we have to add the "root" headers to the PUBLIC_HEADER # then we can run a post script to copy the remaining headers # we need a dummy file in order to compile the framework add_custom_command(OUTPUT ${CMAKE_CURRENT_BINARY_DIR}/dummy.cpp COMMAND touch ${CMAKE_CURRENT_BINARY_DIR}/dummy.cpp) set(SFML_SOURCES ${SFML_HEADERS}) list(APPEND SFML_SOURCES ${CMAKE_CURRENT_BINARY_DIR}/dummy.cpp) # create SFML.framework add_library(SFML ${SFML_SOURCES}) # edit target properties set_target_properties(SFML PROPERTIES FRAMEWORK TRUE FRAMEWORK_VERSION ${VERSION_MAJOR}.${VERSION_MINOR}.${VERSION_PATCH} MACOSX_FRAMEWORK_IDENTIFIER org.sfml-dev.SFML MACOSX_FRAMEWORK_SHORT_VERSION_STRING ${VERSION_MAJOR}.${VERSION_MINOR}.${VERSION_PATCH} MACOSX_FRAMEWORK_BUNDLE_VERSION ${VERSION_MAJOR}.${VERSION_MINOR}.${VERSION_PATCH} PUBLIC_HEADER "${SFML_HEADERS}") # add the remaining headers add_custom_command(TARGET SFML POST_BUILD COMMAND cp -r ${PROJECT_SOURCE_DIR}/include/SFML/* SFML.framework/Versions/${VERSION_MAJOR}.${VERSION_MINOR}.${VERSION_PATCH}/Headers) # adapt install directory to allow distributing dylibs/frameworks in user’s frameworks/application bundle # NOTE : it's not required to link agains SFML.framework set_target_properties(SFML PROPERTIES BUILD_WITH_INSTALL_RPATH 1 INSTALL_NAME_DIR "@executable_path/../Frameworks") # install rule install(TARGETS SFML FRAMEWORK DESTINATION ${CMAKE_INSTALL_FRAMEWORK_PREFIX} COMPONENT devel) endif() install(FILES license.txt DESTINATION ${INSTALL_MISC_DIR}) install(FILES readme.txt DESTINATION ${INSTALL_MISC_DIR}) install(FILES cmake/Modules/FindSFML.cmake DESTINATION ${INSTALL_MISC_DIR}/cmake/Modules) # install 3rd-party libraries and tools on Windows and OS X if(SFML_OS_WINDOWS) if(ARCH_32BITS) install(DIRECTORY extlibs/bin/x86/ DESTINATION bin) if(SFML_COMPILER_MSVC) install(DIRECTORY extlibs/libs-msvc/x86/ DESTINATION lib) else() install(DIRECTORY extlibs/libs-mingw/x86/ DESTINATION lib) endif() elseif(ARCH_64BITS) install(DIRECTORY extlibs/bin/x64/ DESTINATION bin) if(SFML_COMPILER_MSVC) install(DIRECTORY extlibs/libs-msvc/x64/ DESTINATION lib) else() install(DIRECTORY extlibs/libs-mingw/x64/ DESTINATION lib) endif() endif() elseif(SFML_OS_MACOSX) install(DIRECTORY extlibs/libs-osx/Frameworks/sndfile.framework DESTINATION ${CMAKE_INSTALL_FRAMEWORK_PREFIX}) install(DIRECTORY extlibs/libs-osx/Frameworks/freetype.framework DESTINATION ${CMAKE_INSTALL_FRAMEWORK_PREFIX}) if(SFML_INSTALL_XCODE4_TEMPLATES) install(DIRECTORY tools/xcode/templates/SFML DESTINATION /Library/Developer/Xcode/Templates PATTERN "*.in" EXCLUDE) configure_file( "tools/xcode/templates/SFML/SFML Compiler.xctemplate/TemplateInfo.plist.in" "/Library/Developer/Xcode/Templates/SFML/SFML Compiler.xctemplate/TemplateInfo.plist" @ONLY) endif() elseif(IOS) install(FILES cmake/toolchains/iOS.cmake DESTINATION ${INSTALL_MISC_DIR}/cmake/toolchains) install(FILES extlibs/libs-ios/libfreetype.a extlibs/libs-ios/libjpeg.a DESTINATION lib) elseif(ANDROID) install(DIRECTORY extlibs/android/extlibs DESTINATION .) install(FILES src/SFML/Android.mk DESTINATION .) endif()