From 5fcac0f1579751601a699e19184784bfc77e5eb3 Mon Sep 17 00:00:00 2001 From: Florian Sylvain Date: Sat, 10 May 2025 20:17:35 +0200 Subject: [PATCH] Initial commit --- .github/workflows/ci.yml | 39 +++++++++++++++ .gitignore | 6 +++ CMakeLists.txt | 17 +++++++ LICENSE.md | 50 +++++++++++++++++++ README.md | 101 +++++++++++++++++++++++++++++++++++++++ src/main.cpp | 21 ++++++++ 6 files changed, 234 insertions(+) create mode 100644 .github/workflows/ci.yml create mode 100644 .gitignore create mode 100644 CMakeLists.txt create mode 100644 LICENSE.md create mode 100644 README.md create mode 100644 src/main.cpp diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml new file mode 100644 index 0000000..2e35fb5 --- /dev/null +++ b/.github/workflows/ci.yml @@ -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 libxi-dev libudev-dev libflac-dev libvorbis-dev libgl1-mesa-dev libegl1-mesa-dev libfreetype-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 diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000..6af96b6 --- /dev/null +++ b/.gitignore @@ -0,0 +1,6 @@ +build +out +.cache +.idea +.vs +.vscode diff --git a/CMakeLists.txt b/CMakeLists.txt new file mode 100644 index 0000000..3a38747 --- /dev/null +++ b/CMakeLists.txt @@ -0,0 +1,17 @@ +cmake_minimum_required(VERSION 3.28) +project(CMakeSFMLProject LANGUAGES CXX) + +set(CMAKE_RUNTIME_OUTPUT_DIRECTORY ${CMAKE_BINARY_DIR}/bin) + +include(FetchContent) +FetchContent_Declare(SFML + GIT_REPOSITORY https://github.com/SFML/SFML.git + GIT_TAG 3.0.1 + GIT_SHALLOW ON + EXCLUDE_FROM_ALL + SYSTEM) +FetchContent_MakeAvailable(SFML) + +add_executable(main src/main.cpp) +target_compile_features(main PRIVATE cxx_std_17) +target_link_libraries(main PRIVATE SFML::Graphics) diff --git a/LICENSE.md b/LICENSE.md new file mode 100644 index 0000000..84b7a3c --- /dev/null +++ b/LICENSE.md @@ -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. diff --git a/README.md b/README.md new file mode 100644 index 0000000..84576c0 --- /dev/null +++ b/README.md @@ -0,0 +1,101 @@ +# 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 \ + libxi-dev \ + libudev-dev \ + libfreetype-dev \ + libflac-dev \ + libvorbis-dev \ + libgl1-mesa-dev \ + libegl1-mesa-dev \ + libfreetype-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` argument. +Currently it uses SFML 3 via the `3.0.0` tag. + +## 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__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. diff --git a/src/main.cpp b/src/main.cpp new file mode 100644 index 0000000..e1aec12 --- /dev/null +++ b/src/main.cpp @@ -0,0 +1,21 @@ +#include + +int main() +{ + auto window = sf::RenderWindow(sf::VideoMode({1920u, 1080u}), "CMake SFML Project"); + window.setFramerateLimit(144); + + while (window.isOpen()) + { + while (const std::optional event = window.pollEvent()) + { + if (event->is()) + { + window.close(); + } + } + + window.clear(); + window.display(); + } +}