# Using SDL2 in a CMake project: generating package configuration files for find\_package(SDL2)

**URL:** <https://discourse.libsdl.org/t/using-sdl2-in-a-cmake-project-generating-package-configuration-files-for-find-package-sdl2/20448>\
**Category:** SDL Development\
**Created:** [March 4, 2014, 3:56pm UTC](https://discourse.libsdl.org/t/using-sdl2-in-a-cmake-project-generating-package-configuration-files-for-find-package-sdl2/20448 "2014-03-04T15:56:40Z")\
**Posts on this page:** 1\
**Page:** 1

<div class="post-metadata">

**Author:** ![Luis\_Torres](https://discourse.libsdl.org/user_avatar/discourse.libsdl.org/luis_torres/32/2494_2.png) [@Luis\_Torres](https://discourse.libsdl.org/u/Luis_Torres)\
**Post date:** [March 4, 2014, 3:56pm UTC](https://discourse.libsdl.org/t/using-sdl2-in-a-cmake-project-generating-package-configuration-files-for-find-package-sdl2/20448/1 "2014-03-04T15:56:40Z")

</div>

Howdy,

It seems that there still doesn’t exist an official way for a user to use  
SDL2 in a CMake project. There’s a way to do it using pkg-config [1] but  
this might not work in a Windows environment without cygwin. Another option  
is to supply a FindSDL2.cmake file; this could work, but the CMake people  
actually don’t recommend doing this when the package in question is already  
built using CMake (see top of [2]).

An interesting option is to actually have SDL’s CMakeLists.txt file  
generate a “package configuration file” that can be found and used by  
find\_package(SDL2). These files have the form of  
"\<package\_name\>Config.cmake". This is the recommended option if our package  
is already being built using CMake. I’ve taken a stab at doing this, using  
the tutorial [3] as a guide.

I have a fork [4] of SDL demonstrating this functionality. All the changes  
are in the root directory:

\*) CMakeLists.txt - and updated version of SDL’s CMakeLists.txt file for  
generation of the package configuration files. Most of the new stuff is at  
the bottom of the file.

\*) [SDL2Config.cmake.in](http://SDL2Config.cmake.in) - a new template file for the final SDL2Config.cmake  
file.

\*) [SDL2ConfigVersion.cmake.in](http://SDL2ConfigVersion.cmake.in) - a new template file for a script that CMake  
uses to verify that the version of SDL2 being requested in find\_package()  
can be fulfilled by this version of the code.

For your convenience I’ve also attached an archive with the above files.

What’s cool about the way this is done is that if the user has “make  
install”-ed SDL2 to a system directory, then find\_package(SDL2) will “just  
work”. If the user has not installed SDL2 to a system directory (useful  
when doing dev), find\_package() will work as long as she has supplied a  
CMake variable “SDL2\_DIR” that points to the directory containing the  
SDL2Config.cmake file. This works both in the CMake build tree AND the  
install tree!

Of course, we have CAVEATS:

\*) In order to get OSX to properly link to the SDL2 shared libraries when  
the libs were not installed to a system directory, I had to set a variable  
called “CMAKE\_MACOSX\_RPATH”. This feature is super cool [5], but only works  
for CMake versions 2.8.12 and later. If you’re not on a Mac and don’t have  
CMake 2.8.12, you can still try this out by reducing the  
cmake\_minimum\_required() version.

\*) This all assumes that SDL2 gets built/packaged using CMake. If SDL2 was  
built and installed using configure scripts, the SDL2Config.cmake files  
won’t get generated and CMake users won’t be able to use find\_package(SDL2).

\*) I’m not a CMake expert, so the ways I’ve done things (especially  
handling SDL2’s shared/static libs) might not be optimal. As I said before,  
I’d love to see feedback on how to make this better/more robust.

\*) I tested building SDL2 and linking it in a sample program. This works  
great in OSX and Ubuntu! I’ve also tested this with Visual Studio with less  
stellar results. When compiling SDL2, I get an error about a missing  
library “dxguid.lib”. A hack [6] lets SDL2 compile, and then I can run the  
sample SDL2 program if I copy SDL.dll into the executable directory, which  
I kind of expected for Windows. Therefore this method needs more work to be  
perfectly

Let me know what y’all think of this approach!

Thanks,  
Luis

[1] [http://duganchen.ca/building-sdl2-programs-with-cmake-and-pkgconfig/](http://duganchen.ca/building-sdl2-programs-with-cmake-and-pkgconfig/)

[2] [http://www.cmake.org/Wiki/CMake/Tutorials/Packaging](http://www.cmake.org/Wiki/CMake/Tutorials/Packaging)

[3]  
[http://www.cmake.org/Wiki/CMake/Tutorials/How\_to\_create\_a\_ProjectConfig.cmake\_file](http://www.cmake.org/Wiki/CMake/Tutorials/How_to_create_a_ProjectConfig.cmake_file)

[4]  
[https://bitbucket.org/giogadi/sdl2/src/9566eb5a463381bc8a3d0a2244dc27ecea22a764/?at=add\_cmake\_package\_config](https://bitbucket.org/giogadi/sdl2/src/9566eb5a463381bc8a3d0a2244dc27ecea22a764/?at=add_cmake_package_config)

[5] [http://www.kitware.com/blog/home/post/510](http://www.kitware.com/blog/home/post/510)

[6] [http://stackoverflow.com/questions/11253383/cannot-open-file-dxguid-lib](http://stackoverflow.com/questions/11253383/cannot-open-file-dxguid-lib)  
-------------- next part --------------  
A non-text attachment was scrubbed…  
Name: SDL2-cmake.zip  
Type: application/zip  
Size: 12750 bytes  
Desc: not available  
URL: [http://lists.libsdl.org/pipermail/sdl-libsdl.org/attachments/20140304/f78454d4/attachment-0001.zip](http://lists.libsdl.org/pipermail/sdl-libsdl.org/attachments/20140304/f78454d4/attachment-0001.zip)
