Script 'mail_helper' called by obssrc Hello community, here is the log from the commit of package anura for openSUSE:Factory checked in at 2026-10-15 13:05:05 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ Comparing /work/SRC/openSUSE:Factory/anura (Old) and /work/SRC/openSUSE:Factory/.anura.new.3698736 (New) ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Package is "anura" Thu Oct 15 13:05:05 2026 rev:1 rq:1384118 version:4.0.0~git20260430 Changes: -------- New Changes file: --- /dev/null 2026-10-01 08:55:47.155000000 +0200 +++ /work/SRC/openSUSE:Factory/.anura.new.3698736/anura.changes 2026-10-15 13:05:08.631813251 +0200 @@ -0,0 +1,12 @@ +------------------------------------------------------------------- +Tue Sep 22 12:50:57 UTC 2026 - Yunhe Guo <[email protected]> + +- Initial package of the anura engine, version 4.0.0~git20260430, split + out of frogatto +- Install the engine's own game data (data, images, music) and the + modules it bundles (gui, icons, lib_2d) below /usr/share/anura +- Add an /usr/bin/anura wrapper: the engine resolves data/, images/ and + modules/ relative to the current directory and uses that directory as + its built-in "core" module, so it has to be started from the data + directory. The engine binary itself moved to /usr/libexec/anura/anura + New: ---- _service _servicedata anura-4.0.0~git20260430.tar.xz anura.changes anura.spec boost-191-compat.patch fix-git-download.patch imgui-1.89.7.tar.gz silence-unused-but-set-variable.patch use-glew-imported-target.patch ----------(New B)---------- New: WARN: boost-191-compat.patch not found in changes New: WARN: fix-git-download.patch not found in changes New: WARN: silence-unused-but-set-variable.patch not found in changes New: WARN: use-glew-imported-target.patch not found in changes ----------(New E)---------- ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ Other differences: ------------------ ++++++ anura.spec ++++++ # # spec file for package anura # # Copyright (c) 2026 SUSE LLC and contributors # # All modifications and additions to the file contributed by third parties # remain the property of their copyright owners, unless otherwise agreed # upon. The license for this file, and modifications and additions to the # file, is the same license as for the pristine package itself (unless the # license for the pristine package is not an Open Source License, in which # case the license is the MIT License). An "Open Source License" is a # license that conforms to the Open Source Definition (Version 1.9) # published by the Open Source Initiative. # Please submit bugfixes or comments via https://bugs.opensuse.org/ # %define _lto_cflags %{nil} Name: anura Version: 4.0.0~git20260430 Release: 0 Summary: A fully-featured 2D game engine (Core for Frogatto) License: Zlib Group: Amusements/Games/Action/Arcade URL: https://github.com/anura-engine/anura Source: %{name}-%{version}.tar.xz Source1: imgui-1.89.7.tar.gz Patch1: fix-git-download.patch Patch2: use-glew-imported-target.patch Patch3: silence-unused-but-set-variable.patch Patch4: boost-191-compat.patch BuildRequires: boost-devel BuildRequires: cmake BuildRequires: fdupes BuildRequires: gcc-c++ >= 7 BuildRequires: git BuildRequires: libboost_filesystem-devel BuildRequires: libboost_locale-devel BuildRequires: libboost_regex-devel BuildRequires: pkgconfig BuildRequires: xz BuildRequires: pkgconfig(SDL2_image) BuildRequires: pkgconfig(SDL2_mixer) BuildRequires: pkgconfig(SDL2_ttf) BuildRequires: pkgconfig(cairo) BuildRequires: pkgconfig(gl) BuildRequires: pkgconfig(glew) BuildRequires: pkgconfig(glm) BuildRequires: pkgconfig(libpng) BuildRequires: pkgconfig(sdl2) %description Anura is a multi-platform C++ game engine rolling its own functional scripting language (FFL) to build games. Originally created for Frogatto & Friends. %prep %autosetup -p1 -a 1 %build cd buildsystem/linux-dynamic # anura downloads imgui 1.89.7 from GitHub while configuring, which is not # possible here. The imgui source tree from Source1 is used instead, because # the imgui 1.92 shipped by the distribution removed API anura still uses. imgui_dir="$(realpath ../../imgui-1.89.7)" %cmake \ -D ANURA_USE_SYSTEM_IMGUI=ON \ -D ANURA_IMGUI_DIR="$imgui_dir" \ -D ANURA_USE_SYSTEM_GLM=ON %cmake_build %install # anura's linux-dynamic CMake build has no install() rules, the engine binary is # simply built in its build directory, so install it by hand. The real binary # lives in %{_libexecdir}, because the engine resolves data/, images/ and # modules/ relative to the current working directory and treats that directory # as its built-in "core" module - so it has to be started from the data root, # which only a wrapper can guarantee. install -D -m 0755 buildsystem/linux-dynamic/build/anura %{buildroot}%{_libexecdir}/%{name}/%{name} # the engine's own game data and the modules it bundles: the "gui" widget system # and its dependencies "icons" and "lib_2d", which game modules such as frogatto # declare as dependencies. Test modules and the tbs sample game are not # installed. install -d %{buildroot}%{_datadir}/%{name} cp -a data images music %{buildroot}%{_datadir}/%{name}/ install -d %{buildroot}%{_datadir}/%{name}/modules cp -a modules/gui modules/icons modules/lib_2d %{buildroot}%{_datadir}/%{name}/modules/ install -d %{buildroot}%{_bindir} cat > %{buildroot}%{_bindir}/%{name} << 'EOF' #!/bin/sh # The engine looks for data/, images/ and modules/ relative to the current # directory, so it must run from the directory holding its data. cd %{_datadir}/%{name} || exit 1 exec %{_libexecdir}/%{name}/%{name} "$@" EOF chmod 0755 %{buildroot}%{_bindir}/%{name} %fdupes %{buildroot}%{_datadir}/%{name} %files %license LICENSE %{_bindir}/%{name} %{_libexecdir}/%{name} %dir %{_datadir}/%{name} %{_datadir}/%{name}/data %{_datadir}/%{name}/images %{_datadir}/%{name}/music %dir %{_datadir}/%{name}/modules %{_datadir}/%{name}/modules/gui %{_datadir}/%{name}/modules/icons %{_datadir}/%{name}/modules/lib_2d %changelog ++++++ _service ++++++ <services> <service name="tar_scm" mode="localonly"> <param name="scm">git</param> <param name="url">https://github.com/anura-engine/anura.git</param> <param name="filename">anura</param> <param name="revision">trunk</param> <param name="versionformat">@PARENT_TAG@~git%cd</param> <param name="versionrewrite-pattern">v(.*)</param> <param name="changesgenerate">enable</param> </service> <!-- anura wants to download imgui 1.89.7 while configuring, which is not possible on a build host without network access. The build uses this tarball through -D ANURA_IMGUI_DIR= instead. --> <service name="download_url" mode="localonly"> <param name="protocol">https</param> <param name="host">codeload.github.com</param> <param name="path">/ocornut/imgui/tar.gz/refs/tags/v1.89.7</param> <param name="filename">imgui-1.89.7.tar.gz</param> </service> <service name="recompress" mode="localonly"> <param name="file">*.tar</param> <param name="compression">xz</param> </service> <service name="set_version" mode="localonly"> <param name="basename">anura</param> </service> <service name="format_spec_file" mode="localonly"/> </services> ++++++ _servicedata ++++++ <servicedata> <service name="tar_scm"> <param name="url">https://github.com/anura-engine/anura.git</param> <param name="changesrevision">4385fdd8957c08d8cca0f714f58e8a68f7de83d9</param></service></servicedata> (No newline at EOF) ++++++ boost-191-compat.patch ++++++ >From 6d1c7f83b9a5e4d3c2b1a0f9e8d7c6b5a4f31209 Mon Sep 17 00:00:00 2001 From: Guo Yunhe <[email protected]> Date: Tue, 22 Sep 2026 19:50:00 +0800 Subject: [PATCH] Fix the build with Boost 1.91 Boost 1.91 trimmed a lot of includes which used to come in transitively: * boost/asio.hpp does not include deadline_timer.hpp any more and the deprecated deadline_timer/expires_from_now are gone from the default API. The timers are ported to steady_timer with expires_after and std::chrono types - the same shape as the system_timer which the Boost deprecation notice suggests, but with a monotonic clock, which is what a timeout wants. * tbs_web_server.cpp used boost::shared_ptr without including <boost/shared_ptr.hpp>. * tbs_web_server.hpp names boost::interprocess::named_semaphore in a member declaration without including it. Seven timer declarations and eleven expires_from_now() calls are affected. --- a/src/module_web_server.cpp +++ b/src/module_web_server.cpp @@ -72,7 +72,7 @@ void ModuleWebServer::heartbeat() { - timer_.expires_from_now(boost::posix_time::seconds(1)); + timer_.expires_after(std::chrono::seconds(1)); timer_.async_wait(std::bind(&ModuleWebServer::heartbeat, this)); } --- a/src/module_web_server.hpp +++ b/src/module_web_server.hpp @@ -43,7 +43,7 @@ std::string getChunkPath(const std::string& chunk_id) const; void add_chunks_to_manifest(const std::string& data_path, variant manifest) const; - boost::asio::deadline_timer timer_; + boost::asio::steady_timer timer_; int nheartbeat_; std::string getDataFilePath() const; --- a/src/stats_web_server.cpp +++ b/src/stats_web_server.cpp @@ -144,6 +144,6 @@ LOG_INFO("WROTE STATS IN " << time_us << "us"); } - timer_.expires_from_now(boost::posix_time::seconds(1)); + timer_.expires_after(std::chrono::seconds(1)); timer_.async_wait(std::bind(&web_server::heartbeat, this)); } --- a/src/stats_web_server.hpp +++ b/src/stats_web_server.hpp @@ -35,7 +35,7 @@ virtual void handlePost(socket_ptr socket, variant doc, const http::environment& env, const std::string& raw_msg) override; virtual void handleGet(socket_ptr socket, const std::string& url, const std::map<std::string, std::string>& args) override; - boost::asio::deadline_timer timer_; + boost::asio::steady_timer timer_; int nheartbeat_; }; --- a/src/tbs_bot.cpp +++ b/src/tbs_bot.cpp @@ -74,7 +74,7 @@ { LOG_DEBUG("YYY: create_bot: " << intptr_t(this) << ", (" << v["on_create"].write_json() << ") -> " << intptr_t(on_create_.get())); - timer_.expires_from_now(boost::posix_time::milliseconds(g_tbs_bot_delay_ms)); + timer_.expires_after(std::chrono::milliseconds(g_tbs_bot_delay_ms)); timer_proxy_ = new tbs_bot_timer_proxy(this); timer_.async_wait(std::bind(&tbs_bot_timer_proxy::signal, timer_proxy_, std::placeholders::_1)); @@ -140,7 +140,7 @@ } } - timer_.expires_from_now(boost::posix_time::milliseconds(g_tbs_bot_delay_ms)); + timer_.expires_after(std::chrono::milliseconds(g_tbs_bot_delay_ms)); timer_proxy_ = new tbs_bot_timer_proxy(this); timer_.async_wait(std::bind(&tbs_bot_timer_proxy::signal, timer_proxy_, std::placeholders::_1)); } --- a/src/tbs_bot.hpp +++ b/src/tbs_bot.hpp @@ -68,7 +68,7 @@ ffl::IntrusivePtr<ipc_client> ipc_client_; boost::asio::io_context& context_; - boost::asio::deadline_timer timer_; + boost::asio::steady_timer timer_; game_logic::FormulaPtr on_create_, on_message_; --- a/src/tbs_matchmaking_server.cpp +++ b/src/tbs_matchmaking_server.cpp @@ -277,10 +277,10 @@ this->gen_game_id_ = user_info.as_int(1); }); - db_timer_.expires_from_now(boost::posix_time::milliseconds(10)); + db_timer_.expires_after(std::chrono::milliseconds(10)); db_timer_.async_wait(std::bind(&matchmaking_server::db_process, this, std::placeholders::_1)); - timer_.expires_from_now(boost::posix_time::milliseconds(1000)); + timer_.expires_after(std::chrono::milliseconds(1000)); timer_.async_wait(std::bind(&matchmaking_server::heartbeat, this, std::placeholders::_1)); for(int i = 0; i != 256; ++i) { @@ -304,7 +304,7 @@ void db_process(const boost::system::error_code& error) { - db_timer_.expires_from_now(boost::posix_time::milliseconds(10)); + db_timer_.expires_after(std::chrono::milliseconds(10)); db_timer_.async_wait(std::bind(&matchmaking_server::db_process, this, std::placeholders::_1)); db_client_->process(1000); @@ -441,7 +441,7 @@ next_stats_write_ = cur_time + 300; } - timer_.expires_from_now(boost::posix_time::milliseconds(g_matchmaking_heartbeat_ms)); + timer_.expires_after(std::chrono::milliseconds(g_matchmaking_heartbeat_ms)); timer_.async_wait(std::bind(&matchmaking_server::heartbeat, this, std::placeholders::_1)); } @@ -2279,8 +2279,8 @@ boost::asio::io_context& io_context_; int port_; - boost::asio::deadline_timer timer_; - boost::asio::deadline_timer db_timer_; + boost::asio::steady_timer timer_; + boost::asio::steady_timer db_timer_; DbClientPtr db_client_, registration_db_client_; --- a/src/tbs_server_base.cpp +++ b/src/tbs_server_base.cpp @@ -418,7 +418,7 @@ LOG_INFO("tbs_server::heartbeat cancelled"); return; } - timer_.expires_from_now(boost::posix_time::milliseconds(g_tbs_server_delay_ms)); + timer_.expires_after(std::chrono::milliseconds(g_tbs_server_delay_ms)); timer_.async_wait(std::bind(&server_base::heartbeat, this, std::placeholders::_1)); for(game_info_ptr g : games_) { --- a/src/tbs_server_base.hpp +++ b/src/tbs_server_base.hpp @@ -117,7 +117,7 @@ std::map<int, client_info> clients_; std::vector<game_info_ptr> games_; - boost::asio::deadline_timer timer_; + boost::asio::steady_timer timer_; // send_fn's waiting on status info. std::vector<send_function> status_fns_; --- a/src/tbs_web_server.cpp +++ b/src/tbs_web_server.cpp @@ -24,6 +24,7 @@ #include <algorithm> #include <boost/algorithm/string/replace.hpp> #include <boost/interprocess/sync/named_semaphore.hpp> +#include <boost/shared_ptr.hpp> #include <iostream> #include "asserts.hpp" @@ -81,7 +82,7 @@ : http::web_server(io_context, port), server_(serv), timer_(io_context) { web_server_instance = this; - timer_.expires_from_now(boost::posix_time::milliseconds(1000)); + timer_.expires_after(std::chrono::milliseconds(1000)); timer_.async_wait(std::bind(&web_server::heartbeat, this, std::placeholders::_1)); } @@ -169,7 +170,7 @@ } debug_state_sockets.clear(); - timer_.expires_from_now(boost::posix_time::milliseconds(1000)); + timer_.expires_after(std::chrono::milliseconds(1000)); timer_.async_wait(std::bind(&web_server::heartbeat, this, std::placeholders::_1)); } --- a/src/tbs_web_server.hpp +++ b/src/tbs_web_server.hpp @@ -23,6 +23,8 @@ #pragma once +#include <boost/interprocess/sync/named_semaphore.hpp> + #include "http_server.hpp" namespace tbs @@ -51,6 +53,6 @@ void heartbeat(const boost::system::error_code& error); server& server_; - boost::asio::deadline_timer timer_; + boost::asio::steady_timer timer_; }; } ++++++ fix-git-download.patch ++++++ ++++ 612 lines (skipped) ++++++ silence-unused-but-set-variable.patch ++++++ >From 3f9c1d2a7b6e5f4c3d2b1a09f8e7d6c5b4a39281 Mon Sep 17 00:00:00 2001 From: Guo Yunhe <[email protected]> Date: Tue, 22 Sep 2026 19:00:00 +0800 Subject: [PATCH] Silence -Wunused-but-set-variable for the whole GCC build GCC 16 also reports variables which are only ever set, for example by incrementing them, and never read. That is more than the per file list in 03-all/gcc/06-unused-but-set-variable was written for, so the build with warnings as errors now fails on eight more files: src/auto_update_window.cpp nupdate_cycle src/formula.cpp num_where, num_opt_where, nline, sum src/formula_garbage_collector.cpp save_count src/kre/TextureOGL.cpp colors_mapped src/level_object.cpp count src/particle_system.cpp row src/tile_map.cpp total_time src/utility_object_compiler.cpp row_width All of those are dead code, they could be removed as well, but silencing the warning for the whole build keeps this working for files which have not been looked at yet. 04-extra/CMakeLists.txt already does the same thing for -Wno-maybe-uninitialized. --- a/buildsystem/cmake-includes/silence-warnings/03-all/gcc/06-unused-but-set-variable/CMakeLists.txt +++ b/buildsystem/cmake-includes/silence-warnings/03-all/gcc/06-unused-but-set-variable/CMakeLists.txt @@ -1,6 +1,11 @@ # In an optimal state, this file does not exist # XXX - The leading spaces in this file are meaningful for string concatenation! +# GCC 16 also reports variables which are only ever set, for example by +# incrementing them, and never read. That covers more files than the list below, +# so silence the warning for the whole build instead of listing every file. +set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -Wno-unused-but-set-variable") + set_property( SOURCE "${CMAKE_SOURCE_DIR}/../../src/custom_object.cpp" APPEND_STRING -- 2.51.0 ++++++ use-glew-imported-target.patch ++++++ >From 8b6e0af5f8e8c8f0e4b4a4f2a2b0f5b1a1d2c3e4 Mon Sep 17 00:00:00 2001 From: Guo Yunhe <[email protected]> Date: Tue, 22 Sep 2026 18:50:00 +0800 Subject: [PATCH] Link the GLEW imported target instead of GLEW_LIBRARIES CMake's FindGLEW module prefers GLEW's own CMake package when the distribution ships one, which openSUSE does. With CMake 4 that path reads Windows only imported properties (IMPORTED_IMPLIB_*), so the legacy GLEW_LIBRARIES variable ends up as the literal "GLEW_LIBRARY-NOTFOUND" and generation then fails with: The following variables are used in this project, but they are set to NOTFOUND. Please set them or make sure they are set and tested correctly in the CMake files: GLEW_LIBRARY linked by target "anura" in directory ... The GLEW::GLEW imported target is right in both cases, GLEW's own CMake package provides it and FindGLEW creates it as well when it has to search for the libraries itself, so link that instead. The linux-steam build already does it this way. --- a/buildsystem/linux-dynamic/CMakeLists.txt +++ b/buildsystem/linux-dynamic/CMakeLists.txt @@ -239,7 +239,9 @@ "${Boost_LIBRARIES}" "${ZLIB_LIBRARIES}" "${OPENGL_LIBRARIES}" - "${GLEW_LIBRARIES}" + # GLEW::GLEW is the imported target, "${GLEW_LIBRARIES}" is set to a + # NOTFOUND value when GLEW provides its own CMake package + GLEW::GLEW "${FREETYPE_LIBRARIES}" "${SDL2_LIBRARY}" "${SDL2_IMAGE_LIBRARIES}" -- 2.51.0
