generated from SFML/cmake-sfml-project
-
Notifications
You must be signed in to change notification settings - Fork 0
Commit
This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.
- Loading branch information
0 parents
commit 23ebdae
Showing
6 changed files
with
245 additions
and
0 deletions.
There are no files selected for viewing
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,39 @@ | ||
name: CI | ||
|
||
on: [push, pull_request] | ||
|
||
defaults: | ||
run: | ||
shell: bash | ||
|
||
jobs: | ||
build: | ||
name: ${{ matrix.platform.name }} ${{ matrix.config.name }} | ||
runs-on: ${{ matrix.platform.os }} | ||
|
||
strategy: | ||
fail-fast: false | ||
matrix: | ||
platform: | ||
- { name: Windows VS2019, os: windows-2019 } | ||
- { name: Windows VS2022, os: windows-2022 } | ||
- { name: Linux GCC, os: ubuntu-latest } | ||
- { name: Linux Clang, os: ubuntu-latest, flags: -DCMAKE_C_COMPILER=clang -DCMAKE_CXX_COMPILER=clang++ } | ||
- { name: macOS, os: macos-latest } | ||
config: | ||
- { name: Shared, flags: -DBUILD_SHARED_LIBS=TRUE } | ||
- { name: Static, flags: -DBUILD_SHARED_LIBS=FALSE } | ||
|
||
steps: | ||
- name: Install Linux Dependencies | ||
if: runner.os == 'Linux' | ||
run: sudo apt-get update && sudo apt-get install libxrandr-dev libxcursor-dev libudev-dev libopenal-dev libflac-dev libvorbis-dev libgl1-mesa-dev libegl1-mesa-dev | ||
|
||
- name: Checkout | ||
uses: actions/checkout@v4 | ||
|
||
- name: Configure | ||
run: cmake -B build ${{matrix.platform.flags}} ${{matrix.config.flags}} | ||
|
||
- name: Build | ||
run: cmake --build build --config Release |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,6 @@ | ||
build | ||
out | ||
.cache | ||
.idea | ||
.vs | ||
.vscode |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,26 @@ | ||
cmake_minimum_required(VERSION 3.28) | ||
project(CMakeSFMLProject LANGUAGES CXX) | ||
|
||
set(CMAKE_RUNTIME_OUTPUT_DIRECTORY ${CMAKE_BINARY_DIR}/bin) | ||
option(BUILD_SHARED_LIBS "Build shared libraries" OFF) | ||
|
||
include(FetchContent) | ||
FetchContent_Declare(SFML | ||
GIT_REPOSITORY https://github.com/SFML/SFML.git | ||
GIT_TAG 2.6.x | ||
GIT_SHALLOW ON | ||
EXCLUDE_FROM_ALL | ||
SYSTEM) | ||
FetchContent_MakeAvailable(SFML) | ||
|
||
add_executable(main src/main.cpp) | ||
target_link_libraries(main PRIVATE sfml-graphics) | ||
target_compile_features(main PRIVATE cxx_std_17) | ||
|
||
if(WIN32) | ||
add_custom_command( | ||
TARGET main | ||
COMMENT "Copy OpenAL DLL" | ||
PRE_BUILD COMMAND ${CMAKE_COMMAND} -E copy ${SFML_SOURCE_DIR}/extlibs/bin/$<IF:$<EQUAL:${CMAKE_SIZEOF_VOID_P},8>,x64,x86>/openal32.dll $<TARGET_FILE_DIR:main> | ||
VERBATIM) | ||
endif() |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,50 @@ | ||
# CMake SFML Project Licenses | ||
|
||
*This software is available under 2 licenses -- choose whichever you prefer.* | ||
|
||
## Public Domain | ||
|
||
This is free and unencumbered software released into the public domain. | ||
|
||
Anyone is free to copy, modify, publish, use, compile, sell, or | ||
distribute this software, either in source code form or as a compiled | ||
binary, for any purpose, commercial or non-commercial, and by any | ||
means. | ||
|
||
In jurisdictions that recognize copyright laws, the author or authors | ||
of this software dedicate any and all copyright interest in the | ||
software to the public domain. We make this dedication for the benefit | ||
of the public at large and to the detriment of our heirs and | ||
successors. We intend this dedication to be an overt act of | ||
relinquishment in perpetuity of all present and future rights to this | ||
software under copyright law. | ||
|
||
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, | ||
EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF | ||
MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. | ||
IN NO EVENT SHALL THE AUTHORS BE LIABLE FOR ANY CLAIM, DAMAGES OR | ||
OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, | ||
ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR | ||
OTHER DEALINGS IN THE SOFTWARE. | ||
|
||
## MIT License | ||
|
||
Copyright (c) 2022 Lukas Dürrenberger | ||
|
||
Permission is hereby granted, free of charge, to any person obtaining a copy | ||
of this software and associated documentation files (the "Software"), to deal | ||
in the Software without restriction, including without limitation the rights | ||
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell | ||
copies of the Software, and to permit persons to whom the Software is | ||
furnished to do so, subject to the following conditions: | ||
|
||
The above copyright notice and this permission notice shall be included in all | ||
copies or substantial portions of the Software. | ||
|
||
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR | ||
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, | ||
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE | ||
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER | ||
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, | ||
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE | ||
SOFTWARE. |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,103 @@ | ||
# CMake SFML Project Template | ||
|
||
This repository template should allow for a fast and hassle-free kick start of your next SFML project using CMake. | ||
Thanks to [GitHub's nature of templates](https://docs.github.com/en/repositories/creating-and-managing-repositories/creating-a-repository-from-a-template), you can fork this repository without inheriting its Git history. | ||
|
||
The template starts out very basic, but might receive additional features over time: | ||
|
||
- Basic CMake script to build your project and link SFML on any operating system | ||
- Basic [GitHub Actions](https://github.com/features/actions) script for all major platforms | ||
|
||
## How to Use | ||
|
||
1. Install [Git](https://git-scm.com/downloads) and [CMake](https://cmake.org/download/). Use your system's package manager if available. | ||
2. Follow [GitHub's instructions](https://docs.github.com/en/repositories/creating-and-managing-repositories/creating-a-repository-from-a-template) for how to use their project template feature to create your own project. If you don't want to use GitHub, see the section below. | ||
3. Clone your new GitHub repo and open the repo in your text editor of choice. | ||
4. Open [CMakeLists.txt](CMakeLists.txt). Rename the project and the target name of the executable to whatever name you want. Make sure to change all occurrences. | ||
5. If you want to add or remove any .cpp files, change the source files listed in the `add_executable` call in CMakeLists.txt to match the source files your project requires. If you plan on keeping the default main.cpp file then no changes are required. | ||
6. If your code uses the Audio or Network modules then add `sfml-audio` or `sfml-network` to the `target_link_libraries` call alongside the existing `sfml-graphics` library that is being linked. | ||
7. If you use Linux, install SFML's dependencies using your system package manager. On Ubuntu and other Debian-based distributions you can use the following commands: | ||
``` | ||
sudo apt update | ||
sudo apt install \ | ||
libxrandr-dev \ | ||
libxcursor-dev \ | ||
libudev-dev \ | ||
libfreetype-dev \ | ||
libopenal-dev \ | ||
libflac-dev \ | ||
libvorbis-dev \ | ||
libgl1-mesa-dev \ | ||
libegl1-mesa-dev | ||
``` | ||
8. Configure and build your project. Most popular IDEs support CMake projects with very little effort on your part. | ||
|
||
- [VS Code](https://code.visualstudio.com) via the [CMake extension](https://code.visualstudio.com/docs/cpp/cmake-linux) | ||
- [Visual Studio](https://docs.microsoft.com/en-us/cpp/build/cmake-projects-in-visual-studio?view=msvc-170) | ||
- [CLion](https://www.jetbrains.com/clion/features/cmake-support.html) | ||
- [Qt Creator](https://doc.qt.io/qtcreator/creator-project-cmake.html) | ||
|
||
Using CMake from the command line is straightforward as well. | ||
Be sure to run these commands in the root directory of the project you just created. | ||
|
||
``` | ||
cmake -B build | ||
cmake --build build | ||
``` | ||
|
||
9. Enjoy! | ||
|
||
## Upgrading SFML | ||
|
||
SFML is found via CMake's [FetchContent](https://cmake.org/cmake/help/latest/module/FetchContent.html) module. | ||
FetchContent automatically downloads SFML from GitHub and builds it alongside your own code. | ||
Beyond the convenience of not having to install SFML yourself, this ensures ABI compatibility and simplifies things like specifying static versus shared libraries. | ||
|
||
Modifying what version of SFML you want is as easy as changing the [`GIT_TAG`](CMakeLists.txt#L7) argument. | ||
Currently it uses the latest in-development version of SFML 2 via the `2.6.x` tag. | ||
If you're feeling adventurous and want to give SFML 3 a try, use the `master` tag. | ||
Beware, this requires changing your code to suit the modified API! | ||
The nice folks in the [SFML community](https://github.com/SFML/SFML#community) can help you with that transition and the bugs you may encounter along the way. | ||
|
||
## But I want to... | ||
|
||
Modify CMake options by adding them as configuration parameters (with a `-D` flag) or by modifying the contents of CMakeCache.txt and rebuilding. | ||
|
||
### Not use GitHub | ||
|
||
You can use this project without a GitHub account by [downloading the contents](https://github.com/SFML/cmake-sfml-project/archive/refs/heads/master.zip) of the repository as a ZIP archive and unpacking it locally. | ||
This approach also avoids using Git entirely if you would prefer to not do that. | ||
|
||
### Change Compilers | ||
|
||
See the variety of [`CMAKE_<LANG>_COMPILER`](https://cmake.org/cmake/help/latest/variable/CMAKE_LANG_COMPILER.html) options. | ||
In particular you'll want to modify `CMAKE_CXX_COMPILER` to point to the C++ compiler you wish to use. | ||
|
||
### Change Compiler Optimizations | ||
|
||
CMake abstracts away specific optimizer flags through the [`CMAKE_BUILD_TYPE`](https://cmake.org/cmake/help/latest/variable/CMAKE_BUILD_TYPE.html) option. | ||
By default this project recommends `Release` builds which enable optimizations. | ||
Other build types include `Debug` builds which enable debug symbols but disable optimizations. | ||
If you're using a multi-configuration generator (as is often the case on Windows), you can modify the [`CMAKE_CONFIGURATION_TYPES`](https://cmake.org/cmake/help/latest/variable/CMAKE_CONFIGURATION_TYPES.html#variable:CMAKE_CONFIGURATION_TYPES) option. | ||
|
||
### Change Generators | ||
|
||
While CMake will attempt to pick a suitable default generator, some systems offer a number of generators to choose from. | ||
Ubuntu, for example, offers Makefiles and Ninja as two potential options. | ||
For a list of generators, click [here](https://cmake.org/cmake/help/latest/manual/cmake-generators.7.html). | ||
To modify the generator you're using you must reconfigure your project providing a `-G` flag with a value corresponding to the generator you want. | ||
You can't simply modify an entry in the CMakeCache.txt file unlike the above options. | ||
Then you may rebuild your project with this new generator. | ||
|
||
## More Reading | ||
|
||
Here are some useful resources if you want to learn more about CMake: | ||
|
||
- [Official CMake Tutorial](https://cmake.org/cmake/help/latest/guide/tutorial/) | ||
- [How to Use CMake Without the Agonizing Pain - Part 1](https://alexreinking.com/blog/how-to-use-cmake-without-the-agonizing-pain-part-1.html) | ||
- [How to Use CMake Without the Agonizing Pain - Part 2](https://alexreinking.com/blog/how-to-use-cmake-without-the-agonizing-pain-part-2.html) | ||
- [Better CMake YouTube series by Jefferon Amstutz](https://www.youtube.com/playlist?list=PL8i3OhJb4FNV10aIZ8oF0AA46HgA2ed8g) | ||
|
||
## License | ||
|
||
The source code is dual licensed under Public Domain and MIT -- choose whichever you prefer. |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,21 @@ | ||
#include <SFML/Graphics.hpp> | ||
|
||
int main() | ||
{ | ||
auto window = sf::RenderWindow({1920u, 1080u}, "CMake SFML Project"); | ||
window.setFramerateLimit(144); | ||
|
||
while (window.isOpen()) | ||
{ | ||
for (auto event = sf::Event(); window.pollEvent(event);) | ||
{ | ||
if (event.type == sf::Event::Closed) | ||
{ | ||
window.close(); | ||
} | ||
} | ||
|
||
window.clear(); | ||
window.display(); | ||
} | ||
} |