SDL2Config.cmake 5.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122
  1. if(EXISTS "${CMAKE_CURRENT_LIST_DIR}/SDL2Targets.cmake")
  2. include("${CMAKE_CURRENT_LIST_DIR}/SDL2Targets.cmake")
  3. endif()
  4. if(EXISTS "${CMAKE_CURRENT_LIST_DIR}/SDL2mainTargets.cmake")
  5. include("${CMAKE_CURRENT_LIST_DIR}/SDL2mainTargets.cmake")
  6. endif()
  7. if(EXISTS "${CMAKE_CURRENT_LIST_DIR}/SDL2staticTargets.cmake")
  8. include("${CMAKE_CURRENT_LIST_DIR}/SDL2staticTargets.cmake")
  9. endif()
  10. if(EXISTS "${CMAKE_CURRENT_LIST_DIR}/SDL2testTargets.cmake")
  11. include("${CMAKE_CURRENT_LIST_DIR}/SDL2testTargets.cmake")
  12. endif()
  13. # on static-only builds create an alias
  14. if(NOT TARGET SDL2::SDL2 AND TARGET SDL2::SDL2-static)
  15. if(CMAKE_VERSION VERSION_LESS "3.18")
  16. # Aliasing local targets is not supported on CMake < 3.18, so make it global.
  17. set_target_properties(SDL2::SDL2-static PROPERTIES IMPORTED_GLOBAL TRUE)
  18. endif()
  19. add_library(SDL2::SDL2 ALIAS SDL2::SDL2-static)
  20. endif()
  21. # provide ${SDL2_LIBRARIES}, ${SDL2_INCLUDE_DIRS} etc, like sdl2-config.cmake does,
  22. # for compatibility between SDL2 built with autotools and SDL2 built with CMake
  23. # the following seems to work on Windows for both MSVC and MINGW+MSYS and with both SDL2Config/Target.cmake
  24. # from vcpkg and from building myself with cmake from latest git
  25. # AND on Linux when building SDL2 (tested current git) with CMake
  26. # the headers are easy - but note that this adds both .../include/ and .../include/SDL2/
  27. # while the SDL2_INCLUDE_DIRS of sdl2-config.cmake only add ...include/SDL2/
  28. # But at least if building worked with sdl2-config.cmake it will also work with this.
  29. get_target_property(SDL2_INCLUDE_DIRS SDL2::SDL2 INTERFACE_INCLUDE_DIRECTORIES)
  30. # get the paths to the files to link against (.lib or .dll.a on Windows, .so or .a on Unix, ...) for both SDL2 and SDL2main
  31. # for the "normal"/release build they could be in lots of different properties..
  32. set(relprops IMPORTED_IMPLIB_RELEASE IMPORTED_IMPLIB_NOCONFIG IMPORTED_IMPLIB IMPORTED_IMPLIB_MINSIZEREL IMPORTED_IMPLIB_RELWITHDEBINFO
  33. IMPORTED_LOCATION_RELEASE IMPORTED_LOCATION_NOCONFIG IMPORTED_LOCATION IMPORTED_LOCATION_MINSIZEREL IMPORTED_LOCATION_RELWITHDEBINFO)
  34. # fewer possibilities for debug builds
  35. set(dbgprops IMPORTED_IMPLIB_DEBUG IMPORTED_LOCATION_DEBUG)
  36. foreach(prop ${relprops})
  37. get_target_property(sdl2implib SDL2::SDL2 ${prop})
  38. if(sdl2implib)
  39. #message("set sdl2implib from ${prop}")
  40. break()
  41. endif()
  42. endforeach()
  43. foreach(prop ${relprops})
  44. get_target_property(sdl2mainimplib SDL2::SDL2main ${prop})
  45. if(sdl2mainimplib)
  46. #message("set sdl2mainimplib from ${prop}")
  47. break()
  48. endif()
  49. endforeach()
  50. foreach(prop ${dbgprops})
  51. get_target_property(sdl2implibdbg SDL2::SDL2 ${prop})
  52. if(sdl2implibdbg)
  53. #message("set sdl2implibdbg from ${prop}")
  54. break()
  55. endif()
  56. endforeach()
  57. foreach(prop ${dbgprops})
  58. get_target_property(sdl2mainimplibdbg SDL2::SDL2main ${prop})
  59. if(sdl2mainimplibdbg)
  60. #message("set sdl2mainimplibdbg from ${prop}")
  61. break()
  62. endif()
  63. endforeach()
  64. if( sdl2implib AND sdl2mainimplib AND sdl2implibdbg AND sdl2mainimplibdbg )
  65. # we have both release and debug builds of SDL2 and SDL2main, so use this ugly
  66. # generator expression in SDL2_LIBRARIES to support both in MSVC, depending on build type configured there
  67. set(SDL2_LIBRARIES $<IF:$<CONFIG:Debug>,${sdl2mainimplibdbg},${sdl2mainimplib}> $<IF:$<CONFIG:Debug>,${sdl2implibdbg},${sdl2implib}>)
  68. else()
  69. if( (NOT sdl2implib) AND sdl2implibdbg ) # if we only have a debug version of the lib
  70. set(sdl2implib ${sdl2implibdbg})
  71. endif()
  72. if( (NOT sdl2mainimplib) AND sdl2mainimplibdbg ) # if we only have a debug version of the lib
  73. set(sdl2mainimplib ${sdl2mainimplibdbg})
  74. endif()
  75. if( sdl2implib AND sdl2mainimplib )
  76. set(SDL2_LIBRARIES ${sdl2mainimplib} ${sdl2implib})
  77. elseif(WIN32 OR APPLE) # I think these platforms have a non-dummy SDLmain?
  78. message(FATAL_ERROR, "SDL2::SDL2 and/or SDL2::SDL2main don't seem to contain any kind of IMPORTED_IMPLIB* or IMPORTED_LOCATION*")
  79. elseif(sdl2implib) # on other platforms just libSDL2 will hopefully do?
  80. set(SDL2_LIBRARIES ${sdl2implib})
  81. message(STATUS, "No SDL2main lib not found, I hope you don't need it..")
  82. else()
  83. message(FATAL_ERROR, "SDL2::SDL2 doesn't seem to contain any kind of lib to link against in IMPORTED_IMPLIB* or IMPORTED_LOCATION*")
  84. endif()
  85. # TODO: should something like INTERFACE_LINK_LIBRARIES be appended? or wherever -mwindows and things like that
  86. # might be defined (if they were defined by the CMake build at all; autotools has @SDL_RLD_FLAGS@ @SDL_LIBS@)?
  87. # LINK_DEPENDS? LINK_FLAGS?
  88. endif()
  89. get_filename_component(SDL2_LIBDIR ${sdl2implib} PATH)
  90. # NOTE: SDL2_LIBRARIES now looks like "c:/path/to/SDL2main.lib;c:/path/to/SDL2.lib"
  91. # which is different to what it looks like when coming from sdl2-config.cmake
  92. # (there it's more like "-L${SDL2_LIBDIR} -lSDL2main -lSDL2" - and also -lmingw32 and -mwindows)
  93. # This seems to work with both MSVC and MinGW though, while the other only worked with MinGW
  94. # On Linux it looks like "/tmp/sdl2inst/lib/libSDL2main.a;/tmp/sdl2inst/lib/libSDL2-2.0.so.0.14.1" which also seems to work
  95. # the exec prefix is one level up from lib/ - TODO: really, always? at least on Linux there's /usr/lib/x86_64-bla-blub/libSDL2-asdf.so.0 ..
  96. get_filename_component(SDL2_EXEC_PREFIX ${SDL2_LIBDIR} PATH)
  97. set(SDL2_PREFIX ${SDL2_EXEC_PREFIX}) # TODO: could this be somewhere else? parent dir of include or sth?
  98. unset(sdl2implib)
  99. unset(sdl2mainimplib)
  100. unset(sdl2implibdbg)
  101. unset(sdl2mainimplibdbg)
  102. unset(relprops)
  103. unset(dbgprops)