]> git.lizzy.rs Git - irrlicht.git/blobdiff - source/Irrlicht/CMakeLists.txt
Enable XInput2 by default (and improve CMake detection)
[irrlicht.git] / source / Irrlicht / CMakeLists.txt
index 46db82a46bc3a38fab182b27273ff8726d69ec86..9c10d8a59132a516734bc25356e06e7673948be9 100644 (file)
@@ -1,32 +1,45 @@
-include_directories(
-       ${CMAKE_SOURCE_DIR}/include
-       ${CMAKE_CURRENT_SOURCE_DIR}
-)
-add_definitions(-DIRRLICHT_EXPORTS=1)
+option(BUILD_SHARED_LIBS "Build shared library" TRUE)
+
+# Compiler flags
+
+add_definitions(-DIRRLICHT_EXPORTS)
+if(NOT BUILD_SHARED_LIBS)
+       add_definitions(-D_IRR_STATIC_LIB_)
+endif()
 if(CMAKE_BUILD_TYPE STREQUAL "Debug")
        add_definitions(-D_DEBUG)
 endif()
 set(CMAKE_POSITION_INDEPENDENT_CODE TRUE)
-
-# Compiler flags
+set(CMAKE_CXX_STANDARD 11)
+set(CMAKE_CXX_STANDARD_REQUIRED ON)
 
 if(CMAKE_CXX_COMPILER_ID MATCHES "^(GNU|Clang|AppleClang)$")
        set(CMAKE_CXX_FLAGS_RELEASE "-O3")
-       set(CMAKE_C_FLAGS_RELEASE ${CMAKE_CXX_FLAGS_RELEASE})
        set(CMAKE_CXX_FLAGS_DEBUG "-g")
-       set(CMAKE_C_FLAGS_DEBUG ${CMAKE_C_FLAGS_DEBUG})
 
        add_compile_options(-Wall -pipe -fno-exceptions -fno-rtti)
+
+       # Enable SSE for floating point math on 32-bit x86 by default
+       # reasoning see minetest issue #11810 and https://gcc.gnu.org/wiki/FloatingPointMath
+       if(CMAKE_SIZEOF_VOID_P EQUAL 4)
+               include(CheckCXXSourceCompiles)
+               check_cxx_source_compiles("#ifndef __i686__\n#error\n#endif\nint main(){}" IS_I686)
+               if(IS_I686)
+                       message(STATUS "Detected Intel x86: using SSE instead of x87 FPU")
+                       add_compile_options(-mfpmath=sse -msse)
+               endif()
+       endif()
+
 elseif(MSVC)
-       # entirely untested
-       set(CMAKE_CXX_FLAGS_RELEASE "/GL /MT /Ox")
-       set(CMAKE_C_FLAGS_RELEASE ${CMAKE_CXX_FLAGS_RELEASE})
-       set(CMAKE_CXX_FLAGS_DEBUG "/MTd /RTC1 /Zi")
-       set(CMAKE_C_FLAGS_DEBUG ${CMAKE_C_FLAGS_DEBUG})
-
-       set(CMAKE_CXX_FLAGS "/Gd /GF /GR- /GS /Gy /Zl")
-       set(CMAKE_EXE_LINKER_FLAGS "/nologo")
-       set(CMAKE_EXE_LINKER_FLAGS_RELEASE "/SUBSYSTEM:WINDOWS /OPT:REF /LTCG")
+       string(APPEND CMAKE_CXX_STANDARD_LIBRARIES " msvcrt.lib") # ???? fuck off
+
+       add_compile_options(/GR- /Zl)
+
+       # Enable SSE for floating point math on 32-bit x86 by default
+       # reasoning see minetest issue #11810 and https://gcc.gnu.org/wiki/FloatingPointMath
+       if(CMAKE_SIZEOF_VOID_P EQUAL 4)
+               add_compile_options(/arch:SSE)
+       endif()
 endif()
 
 # Required libs
@@ -34,13 +47,18 @@ endif()
 find_package(ZLIB REQUIRED)
 find_package(JPEG REQUIRED)
 find_package(PNG REQUIRED)
-include_directories(${ZLIB_INCLUDE_DIR} ${JPEG_INCLUDE_DIR} ${PNG_INCLUDE_DIR})
-link_libraries(${ZLIB_LIBRARY} ${JPEG_LIBRARY} ${PNG_LIBRARY})
 
-# To configure the features available in this Irrlicht build please edit
-# include/IrrCompileConfig.h and re-run CMake from a clean state
+# To configure the features available in this Irrlicht build please edit include/IrrCompileConfig.h.
 include(CheckSymbolExists)
-set(CMAKE_REQUIRED_INCLUDES ${CMAKE_SOURCE_DIR}/include)
+set(CMAKE_REQUIRED_INCLUDES ${PROJECT_SOURCE_DIR}/include)
+unset(OGLES1_ENABLED CACHE)
+unset(OGLES2_ENABLED CACHE)
+unset(OGL_ENABLED CACHE)
+unset(XINPUT2_ENABLED CACHE)
+unset(SDL_ENABLED CACHE)
+
+# tell cmake about the dependency
+set_property(DIRECTORY APPEND PROPERTY CMAKE_CONFIGURE_DEPENDS ${CMAKE_REQUIRED_INCLUDES}/IrrCompileConfig.h)
 
 check_symbol_exists(_IRR_COMPILE_WITH_OGLES1_ "IrrCompileConfig.h" OGLES1_ENABLED)
 if(OGLES1_ENABLED)
@@ -49,76 +67,86 @@ if(OGLES1_ENABLED)
        find_library(EGL_LIBRARY NAMES EGL REQUIRED)
 
        message(STATUS "Found OpenGLES: ${OPENGLES_LIBRARY}")
-       link_libraries(${OPENGLES_LIBRARY} ${EGL_LIBRARY})
 endif()
 check_symbol_exists(_IRR_COMPILE_WITH_OGLES2_ "IrrCompileConfig.h" OGLES2_ENABLED)
 if(OGLES2_ENABLED)
        find_package(OpenGLES2 REQUIRED)
-       include_directories(${OPENGLES2_INCLUDE_DIR} ${EGL_INCLUDE_DIR})
-       link_libraries(${OPENGLES2_LIBRARIES})
 endif()
 check_symbol_exists(_IRR_COMPILE_WITH_OPENGL_ "IrrCompileConfig.h" OGL_ENABLED)
 if(OGL_ENABLED)
        set(OpenGL_GL_PREFERENCE "LEGACY")
        find_package(OpenGL REQUIRED)
-       include_directories(${OPENGL_INCLUDE_DIR})
-       link_libraries(${OPENGL_LIBRARIES})
+endif()
+if(UNIX AND NOT ANDROID AND NOT APPLE)
+       check_symbol_exists(_IRR_LINUX_X11_XINPUT2_ "IrrCompileConfig.h" XINPUT2_ENABLED)
+endif()
+check_symbol_exists(_IRR_COMPILE_WITH_SDL_DEVICE_ "IrrCompileConfig.h" SDL_ENABLED)
+if(SDL_ENABLED)
+       find_package(SDL2 CONFIG REQUIRED)
+       message(STATUS "Found SDL2: ${SDL2_LIBRARIES}")
 endif()
 
 # Platform-specific libs
 
 if(ANDROID)
+       enable_language(C)
        add_library(native_app_glue STATIC ${ANDROID_NDK}/sources/android/native_app_glue/android_native_app_glue.c)
-       include_directories(${ANDROID_NDK}/sources/android/native_app_glue)
-       link_libraries(native_app_glue -landroid -llog)
 elseif(APPLE)
        find_library(COCOA_LIB Cocoa REQUIRED)
        find_library(IOKIT_LIB IOKit REQUIRED)
-       link_libraries(${COCOA_LIB} ${IOKIT_LIB})
 
        add_definitions(-DGL_SILENCE_DEPRECATION)
-elseif(WIN32)
-       link_libraries(gdi32 winmm)
 else()
        # Unix probably
        find_package(X11 REQUIRED)
-       include_directories(${X11_INCLUDE_DIR})
-       link_libraries(${X11_X11_LIB} ${X11_Xxf86vm_LIB})
+       if(XINPUT2_ENABLED AND NOT X11_Xi_FOUND)
+               message(FATAL_ERROR "XInput not found")
+       endif()
 endif()
 
+set(link_includes
+       "${PROJECT_SOURCE_DIR}/include"
+       "${CMAKE_CURRENT_SOURCE_DIR}"
+
+       "${ZLIB_INCLUDE_DIR}"
+       "${JPEG_INCLUDE_DIR}"
+       "${PNG_INCLUDE_DIR}"
+       "${SDL2_INCLUDE_DIRS}"
+
+       ${OPENGL_INCLUDE_DIR}
+       ${OPENGLES2_INCLUDE_DIR}
+       ${EGL_INCLUDE_DIR}
+
+       "$<$<PLATFORM_ID:Android>:${ANDROID_NDK}/sources/android/native_app_glue>"
+       ${X11_INCLUDE_DIR}
+)
+
+set(link_libs
+       "${ZLIB_LIBRARY}"
+       "${JPEG_LIBRARY}"
+       "${PNG_LIBRARY}"
+       "${SDL2_LIBRARIES}"
+
+       ${OPENGL_LIBRARIES}
+       ${OPENGLES_LIBRARY}
+       ${OPENGLES2_LIBRARIES}
+       ${EGL_LIBRARY}
+
+       "$<$<PLATFORM_ID:Android>:native_app_glue -landroid -llog>"
+       ${COCOA_LIB}
+       ${IOKIT_LIB}
+       "$<$<PLATFORM_ID:Windows>:gdi32>"
+       "$<$<PLATFORM_ID:Windows>:winmm>"
+       ${X11_X11_LIB}
+       ${X11_Xi_LIB}
+)
+
 # Source files
 
 set(IRRMESHLOADER
-       CBSPMeshFileLoader.cpp
-       CMD2MeshFileLoader.cpp
-       CMD3MeshFileLoader.cpp
-       CMS3DMeshFileLoader.cpp
        CB3DMeshFileLoader.cpp
-       C3DSMeshFileLoader.cpp
-       COgreMeshFileLoader.cpp
        COBJMeshFileLoader.cpp
-       CColladaFileLoader.cpp
-       CCSMLoader.cpp
-       CDMFLoader.cpp
-       CLMTSMeshFileLoader.cpp
-       CMY3DMeshFileLoader.cpp
-       COCTLoader.cpp
        CXMeshFileLoader.cpp
-       CIrrMeshFileLoader.cpp
-       CSTLMeshFileLoader.cpp
-       CLWOMeshFileLoader.cpp
-       CPLYMeshFileLoader.cpp
-       CSMFMeshFileLoader.cpp
-       CMeshTextureLoader.cpp
-)
-
-set(IRRMESHWRITER
-       CColladaMeshWriter.cpp
-       CIrrMeshWriter.cpp
-       CSTLMeshWriter.cpp
-       COBJMeshWriter.cpp
-       CPLYMeshWriter.cpp
-       CB3DMeshWriter.cpp
 )
 
 add_library(IRRMESHOBJ OBJECT
@@ -126,13 +154,7 @@ add_library(IRRMESHOBJ OBJECT
        CBoneSceneNode.cpp
        CMeshSceneNode.cpp
        CAnimatedMeshSceneNode.cpp
-       CAnimatedMeshMD2.cpp
-       CAnimatedMeshMD3.cpp
-       CQ3LevelMesh.cpp
-       CQuake3ShaderSceneNode.cpp
-       CAnimatedMeshHalfLife.cpp
        ${IRRMESHLOADER}
-       ${IRRMESHWRITER}
 )
 
 add_library(IRROBJ OBJECT
@@ -140,164 +162,51 @@ add_library(IRROBJ OBJECT
        CCameraSceneNode.cpp
        CDummyTransformationSceneNode.cpp
        CEmptySceneNode.cpp
-       CGeometryCreator.cpp
-       CLightSceneNode.cpp
        CMeshManipulator.cpp
-       CMetaTriangleSelector.cpp
-       COctreeSceneNode.cpp
-       COctreeTriangleSelector.cpp
        CSceneCollisionManager.cpp
        CSceneManager.cpp
-       CShadowVolumeSceneNode.cpp
-       CSkyBoxSceneNode.cpp
-       CSkyDomeSceneNode.cpp
-       CTerrainSceneNode.cpp
-       CTerrainTriangleSelector.cpp
-       CVolumeLightSceneNode.cpp
-       CCubeSceneNode.cpp
-       CSphereSceneNode.cpp
-       CTextSceneNode.cpp
-       CTriangleBBSelector.cpp
-       CTriangleSelector.cpp
-       CWaterSurfaceSceneNode.cpp
        CMeshCache.cpp
-       CDefaultSceneNodeAnimatorFactory.cpp
-       CDefaultSceneNodeFactory.cpp
-       CSceneLoaderIrr.cpp
-)
-
-add_library(IRRPARTICLEOBJ OBJECT
-       CParticleAnimatedMeshSceneNodeEmitter.cpp
-       CParticleBoxEmitter.cpp
-       CParticleCylinderEmitter.cpp
-       CParticleMeshEmitter.cpp
-       CParticlePointEmitter.cpp
-       CParticleRingEmitter.cpp
-       CParticleSphereEmitter.cpp
-       CParticleAttractionAffector.cpp
-       CParticleFadeOutAffector.cpp
-       CParticleGravityAffector.cpp
-       CParticleRotationAffector.cpp
-       CParticleSystemSceneNode.cpp
-       CParticleScaleAffector.cpp
-)
-
-add_library(IRRANIMOBJ OBJECT
-       CSceneNodeAnimatorCameraFPS.cpp
-       CSceneNodeAnimatorCameraMaya.cpp
-       CSceneNodeAnimatorCollisionResponse.cpp
-       CSceneNodeAnimatorDelete.cpp
-       CSceneNodeAnimatorFlyCircle.cpp
-       CSceneNodeAnimatorFlyStraight.cpp
-       CSceneNodeAnimatorFollowSpline.cpp
-       CSceneNodeAnimatorRotation.cpp
-       CSceneNodeAnimatorTexture.cpp
 )
 
 set(IRRDRVROBJ
        CNullDriver.cpp
        COpenGLCacheHandler.cpp
        COpenGLDriver.cpp
-       COpenGLNormalMapRenderer.cpp
-       COpenGLParallaxMapRenderer.cpp
        COpenGLShaderMaterialRenderer.cpp
        COpenGLSLMaterialRenderer.cpp
        COpenGLExtensionHandler.cpp
-       CD3D9Driver.cpp
-       CD3D9HLSLMaterialRenderer.cpp
-       CD3D9NormalMapRenderer.cpp
-       CD3D9ParallaxMapRenderer.cpp
-       CD3D9ShaderMaterialRenderer.cpp
-       CD3D9Texture.cpp
        COGLESDriver.cpp
        COGLESExtensionHandler.cpp
        COGLES2Driver.cpp
        COGLES2ExtensionHandler.cpp
        COGLES2FixedPipelineRenderer.cpp
        COGLES2MaterialRenderer.cpp
-       COGLES2NormalMapRenderer.cpp
-       COGLES2ParallaxMapRenderer.cpp
        COGLES2Renderer2D.cpp
        CWebGL1Driver.cpp
        CGLXManager.cpp
        CWGLManager.cpp
        CEGLManager.cpp
+       CSDLManager.cpp
+       mt_opengl_loader.cpp
 )
 
 set(IRRIMAGEOBJ
        CColorConverter.cpp
        CImage.cpp
        CImageLoaderBMP.cpp
-       CImageLoaderDDS.cpp
        CImageLoaderJPG.cpp
-       CImageLoaderPCX.cpp
        CImageLoaderPNG.cpp
-       CImageLoaderPSD.cpp
-       CImageLoaderPVR.cpp
        CImageLoaderTGA.cpp
-       CImageLoaderPPM.cpp
-       CImageLoaderWAL.cpp
-       CImageLoaderRGB.cpp
-       CImageWriterBMP.cpp
        CImageWriterJPG.cpp
-       CImageWriterPCX.cpp
        CImageWriterPNG.cpp
-       CImageWriterPPM.cpp
-       CImageWriterPSD.cpp
-       CImageWriterTGA.cpp
 )
 
 add_library(IRRVIDEOOBJ OBJECT
-       CVideoModeList.cpp
        CFPSCounter.cpp
        ${IRRDRVROBJ}
        ${IRRIMAGEOBJ}
 )
 
-add_library(IRRSWRENDEROBJ OBJECT
-       CSoftwareDriver.cpp
-       CSoftwareTexture.cpp
-       CTRFlat.cpp
-       CTRFlatWire.cpp
-       CTRGouraud.cpp
-       CTRGouraudWire.cpp
-       CTRNormalMap.cpp
-       CTRStencilShadow.cpp
-       CTRTextureFlat.cpp
-       CTRTextureFlatWire.cpp
-       CTRTextureGouraud.cpp
-       CTRTextureGouraudAdd.cpp
-       CTRTextureGouraudNoZ.cpp
-       CTRTextureGouraudWire.cpp
-       CZBuffer.cpp
-       CTRTextureGouraudVertexAlpha2.cpp
-       CTRTextureGouraudNoZ2.cpp
-       CTRTextureLightMap2_M2.cpp
-       CTRTextureLightMap2_M4.cpp
-       CTRTextureLightMap2_M1.cpp
-       CSoftwareDriver2.cpp
-       CSoftwareTexture2.cpp
-       CTRTextureGouraud2.cpp
-       CTRGouraud2.cpp
-       CTRGouraudAlpha2.cpp
-       CTRGouraudAlphaNoZ2.cpp
-       CTRTextureDetailMap2.cpp
-       CTRTextureGouraudAdd2.cpp
-       CTRTextureGouraudAddNoZ2.cpp
-       CTRTextureWire2.cpp
-       CTRTextureLightMap2_Add.cpp
-       CTRTextureLightMapGouraud2_M4.cpp
-       IBurningShader.cpp
-       CTRTextureBlend.cpp
-       CTRTextureGouraudAlpha.cpp
-       CTRTextureGouraudAlphaNoZ.cpp
-       CDepthBuffer.cpp
-       CBurningShader_Raster_Reference.cpp
-       CTR_transparent_reflection_2_layer.cpp
-       CTRGouraudNoZ2.cpp
-       burning_shader_color.cpp
-)
-
 add_library(IRRIOOBJ OBJECT
        CFileList.cpp
        CFileSystem.cpp
@@ -305,32 +214,21 @@ add_library(IRRIOOBJ OBJECT
        CMemoryFile.cpp
        CReadFile.cpp
        CWriteFile.cpp
-       CXMLReader.cpp
-       CXMLWriter.cpp
-       CWADReader.cpp
        CZipReader.cpp
-       CPakReader.cpp
-       CNPKReader.cpp
-       CTarReader.cpp
-       CMountPointReader.cpp
-       irrXML.cpp
        CAttributes.cpp
 )
 
 add_library(IRROTHEROBJ OBJECT
        CIrrDeviceSDL.cpp
        CIrrDeviceLinux.cpp
-       CIrrDeviceConsole.cpp
        CIrrDeviceStub.cpp
        CIrrDeviceWin32.cpp
-       CIrrDeviceFB.cpp
        CLogger.cpp
        COSOperator.cpp
        Irrlicht.cpp
        os.cpp
        leakHunter.cpp
        CProfiler.cpp
-       utf8.cpp
 )
 
 if(ANDROID)
@@ -353,56 +251,68 @@ add_library(IRRGUIOBJ OBJECT
        CGUIButton.cpp
        CGUICheckBox.cpp
        CGUIComboBox.cpp
-       CGUIContextMenu.cpp
        CGUIEditBox.cpp
        CGUIEnvironment.cpp
        CGUIFileOpenDialog.cpp
        CGUIFont.cpp
        CGUIImage.cpp
-       CGUIInOutFader.cpp
        CGUIListBox.cpp
-       CGUIMenu.cpp
-       CGUIMeshViewer.cpp
-       CGUIMessageBox.cpp
-       CGUIModalScreen.cpp
        CGUIScrollBar.cpp
-       CGUISpinBox.cpp
        CGUISkin.cpp
        CGUIStaticText.cpp
        CGUITabControl.cpp
-       CGUITable.cpp
-       CGUIToolBar.cpp
-       CGUIWindow.cpp
-       CGUIColorSelectDialog.cpp
-       CDefaultGUIElementFactory.cpp
        CGUISpriteBank.cpp
        CGUIImageList.cpp
-       CGUITreeView.cpp
-       CGUIProfiler.cpp
 )
 
 # Library
 
-option(BUILD_SHARED_LIBS "Build shared library" TRUE)
-
-add_library(Irrlicht
-       $<TARGET_OBJECTS:IRRMESHOBJ>
-       $<TARGET_OBJECTS:IRROBJ>
-       $<TARGET_OBJECTS:IRRPARTICLEOBJ>
-       $<TARGET_OBJECTS:IRRANIMOBJ>
-       $<TARGET_OBJECTS:IRRVIDEOOBJ>
-       $<TARGET_OBJECTS:IRRSWRENDEROBJ>
-       $<TARGET_OBJECTS:IRRIOOBJ>
-       $<TARGET_OBJECTS:IRROTHEROBJ>
-       $<TARGET_OBJECTS:IRRGUIOBJ>
+add_library(IrrlichtMt)
+foreach(object_lib
+       IRRMESHOBJ IRROBJ IRRVIDEOOBJ
+       IRRIOOBJ IRROTHEROBJ IRRGUIOBJ)
+       # Set include directories for object library compilation
+       target_include_directories(${object_lib} PRIVATE ${link_includes})
+       # Add objects from object library to main library
+       target_sources(IrrlichtMt PRIVATE $<TARGET_OBJECTS:${object_lib}>)
+endforeach()
+
+# Alias target provides add_submodule compatibility
+add_library(IrrlichtMt::IrrlichtMt ALIAS IrrlichtMt)
+
+target_include_directories(IrrlichtMt
+       PUBLIC
+               "$<BUILD_INTERFACE:${PROJECT_SOURCE_DIR}/include/>"
+               "$<BUILD_INTERFACE:${CMAKE_CURRENT_SOURCE_DIR}>"
+               "$<INSTALL_INTERFACE:${CMAKE_INSTALL_INCLUDEDIR}/irrlichtmt>"
+       PRIVATE
+               ${link_includes}
 )
 
-set_target_properties(Irrlicht PROPERTIES
-       VERSION ${VERSION}
-       SOVERSION ${IRRLICHT_VERSION_MAJOR}.${IRRLICHT_VERSION_MINOR}
+target_link_libraries(IrrlichtMt PRIVATE ${link_libs})
+
+# Propagate static library flag to lib users, only needed for Windows
+if(NOT BUILD_SHARED_LIBS)
+       target_compile_definitions(IrrlichtMt INTERFACE _IRR_STATIC_LIB_)
+endif()
+
+set_target_properties(IrrlichtMt PROPERTIES
+       VERSION ${PROJECT_VERSION}
+       SOVERSION ${PROJECT_VERSION_MAJOR}.${PROJECT_VERSION_MINOR}
 )
 
+if(WIN32)
+       set_target_properties(IrrlichtMt PROPERTIES PREFIX "") # for DLL name
+endif()
+
+# Installation of library
+if(ANDROID)
+       set(INSTALL_TARGETS IrrlichtMt native_app_glue)
+else()
+       set(INSTALL_TARGETS IrrlichtMt)
+endif()
 
-include(GNUInstallDirs)
-install(TARGETS Irrlicht DESTINATION "${CMAKE_INSTALL_LIBDIR}")
-install(DIRECTORY "${CMAKE_SOURCE_DIR}/include/" DESTINATION "${CMAKE_INSTALL_INCLUDEDIR}/irrlicht")
+install(TARGETS ${INSTALL_TARGETS}
+       EXPORT IrrlichtMt-export
+       DESTINATION "${CMAKE_INSTALL_LIBDIR}"
+)