From: Daniel Dickman Subject: [update] games/boswars 2.7 -> 2.8 To: ports@openbsd.org Date: Sun, 30 Aug 2026 22:17:09 -0400 This update of boswars catches up on about 10 years of development. Some big improvements upstram: - scons support was removed - Python 3 support was added - no more need to fix the images with optipng as upstream makde a fix The game launched on my amd64 laptop and I played through a few minutes without any problems. ok? Index: Makefile =================================================================== RCS file: /cvs/ports/games/boswars/Makefile,v diff -u -p -u -r1.32 Makefile --- Makefile 18 Feb 2025 22:30:15 -0000 1.32 +++ Makefile 31 Aug 2026 02:09:57 -0000 @@ -1,11 +1,10 @@ COMMENT= real-time strategy game -V= 2.7 +V= 2.8 DISTNAME= boswars-${V}-src PKGNAME= boswars-${V} CATEGORIES= games x11 SITES= https://www.boswars.org/dist/releases/ -REVISION= 4 HOMEPAGE= https://www.boswars.org/ @@ -17,14 +16,11 @@ WANTLIB += ${MODLUA_WANTLIB} COMPILER = base-clang ports-gcc -MODULES= devel/scons \ - lang/lua -MODSCONS_FLAGS= CPPPATH="${LOCALBASE}/include ${X11BASE}/include" \ - CXX="c++ -std=gnu++14" \ - opengl=1 +MODULES= lang/lua \ + lang/python + +MODPY_RUNDEP= No -BUILD_DEPENDS= devel/sdl-image \ - graphics/optipng LIB_DEPENDS= devel/sdl \ multimedia/libtheora \ audio/libvorbis \ @@ -36,20 +32,19 @@ NO_TEST= Yes DATA_DIR= campaigns graphics intro languages maps patches \ scripts sounds units -# the shipped images are considered broken by newer libpng: use opting -# to fix them pre-configure: - @${SUBST_CMD} ${WRKSRC}/SConstruct \ - ${WRKSRC}/engine/include/stratagus.h -.for f in maps/antarticum.map/terrain.png graphics/ui/ui_*.png \ - units/radar/radar*.png units/tree*/tree*.png - optipng -force -fix ${WRKSRC}/${f} -.endfor + ${SUBST_CMD} ${WRKSRC}/engine/include/stratagus.h + +do-build: + cd ${WRKSRC} && ${MODPY_BIN} ./make.py -j ${MAKE_JOBS} release \ + cc=${CXX} \ + cflags="${CXXFLAGS} -I${LOCALBASE}/include -I${X11BASE}/include" \ + ldflags="-L${LOCALBASE}/lib -L${X11BASE}/lib" do-install: ${INSTALL_DATA_DIR} ${PREFIX}/share/boswars ${INSTALL_DATA_DIR} ${PREFIX}/share/doc/boswars/html/scripts - ${INSTALL_PROGRAM} ${WRKSRC}/build/boswars-release \ + ${INSTALL_PROGRAM} ${WRKSRC}/fbuild/release/boswars \ ${PREFIX}/bin/boswars ${INSTALL_DATA} ${WRKSRC}/doc/*.html ${PREFIX}/share/doc/boswars/html ${INSTALL_DATA} ${WRKSRC}/doc/scripts/{*.html,*.py} \ Index: distinfo =================================================================== RCS file: /cvs/ports/games/boswars/distinfo,v diff -u -p -u -r1.7 distinfo --- distinfo 24 Sep 2013 04:53:18 -0000 1.7 +++ distinfo 31 Aug 2026 02:09:57 -0000 @@ -1,2 +1,2 @@ -SHA256 (boswars-2.7-src.tar.gz) = 3DcY9THp6kE8834TM7YqTF5p8UBVAtnFm55CRjUTXj4= -SIZE (boswars-2.7-src.tar.gz) = 77280735 +SHA256 (boswars-2.8-src.tar.gz) = UYUgaZC/Z2XHpdOALObmBIoQh89MMHsJmlaRo+7GuGo= +SIZE (boswars-2.8-src.tar.gz) = 77240542 Index: patches/patch-SConstruct =================================================================== RCS file: patches/patch-SConstruct diff -N patches/patch-SConstruct --- patches/patch-SConstruct 18 Feb 2025 22:30:15 -0000 1.10 +++ /dev/null 1 Jan 1970 00:00:00 -0000 @@ -1,166 +0,0 @@ -2to3 and additional fixes - -Index: SConstruct ---- SConstruct.orig -+++ SConstruct -@@ -32,12 +32,12 @@ SConsignFile() - - def DefineOptions(filename, args): - opts = Variables(filename, args) -- opts.Add('CPPPATH', 'Additional preprocessor paths', ['/usr/local/include']) -+ opts.Add('CPPPATH', 'Additional preprocessor paths', ['/usr/local/include'], Split('')) - opts.Add('CPPFLAGS', 'Additional preprocessor flags') - opts.Add('CPPDEFINES', 'defined constants', Split('')) -- opts.Add('LIBPATH', 'Additional library paths', ['/usr/local/lib']) -+ opts.Add('LIBPATH', 'Additional library paths', ['/usr/local/lib'], Split('')) - opts.Add('LIBS', 'Additional libraries') -- opts.Add('CCFLAGS', 'C Compiler flags', Split(ccflags)) -+ opts.Add('CCFLAGS', 'C Compiler flags', Split(ccflags), Split('')) - opts.Add('LINKFLAGS', 'Linker Compiler flags') - opts.Add('CC', 'C Compiler') - opts.Add('CXX', 'C++ Compiler') -@@ -51,6 +51,9 @@ def DefineOptions(filename, args): - opts = DefineOptions("build_options.py", ARGUMENTS) - env = Environment(ENV = {'PATH':os.environ['PATH']}) # for an unknown reason Environment(options=opts) doesnt work well - opts.Update(env) # Needed as Environment(options=opts) doesnt seem to work -+env['CCFLAGS'] = Split(ccflags) + Split(env['CCFLAGS']) -+env['CPPPATH'] = Split(env['CPPPATH']) -+env['LIBPATH'] = Split(env['LIBPATH']) - Help(opts.GenerateHelpText(env)) - mingw = env.Clone() - optionsChanged = True -@@ -122,7 +125,7 @@ def ParseConfig(env, command, function=None): - flags['LINKFLAGS'].append(arg) - else: - flags['CCFLAGS'].append(arg) -- apply(env.Append, (), flags) -+ env.Append(*(), **flags) - return static_libs - - if function is None: -@@ -144,6 +147,10 @@ def CheckOpenGL(env, conf): - 'LIBS': ['GL'], - 'LIBPATH': ['/usr/lib', '/usr/X11R6/lib'], - 'CPPPATH': ['/usr/include']} -+ opengl['openbsd'] = { -+ 'LIBS': ['GL'], -+ 'LIBPATH': ['/usr/X11R6/lib'], -+ 'CPPPATH': ['/usr/X11R6/include']} - opengl['cygwin'] = { - 'LIBS': ['opengl3']} - opengl['darwin'] = { -@@ -155,6 +162,8 @@ def CheckOpenGL(env, conf): - else: - if sys.platform[:5] == 'linux' or sys.platform.startswith('gnukfreebsd'): - platform = 'linux' -+ if sys.platform[:7] == 'openbsd': -+ platform = 'openbsd' - glconfig = opengl.get(platform, {}) - for key in glconfig: - if key != 'LIBS': -@@ -168,17 +177,12 @@ def CheckOpenGL(env, conf): - return True - - def CheckLuaLib(env, conf): -- if not 'USE_WIN32' in env['CPPDEFINES']: -- if env.WhereIs('pkg-config'): -- for packagename in ['lua5.1', 'lua51', 'lua']: -- exitcode,_ = ParseConfig(env, 'pkg-config --cflags --libs ' + packagename) -- if exitcode == 0: -- break -+ env.ParseConfig('pkg-config --cflags --libs lua51') - if conf.CheckLibWithHeader('lua51', 'lua.h', 'c'): - return 1 - if conf.CheckLibWithHeader('lua5.1', 'lua.h', 'c'): - return 1 -- if not conf.CheckLibWithHeader('lua', 'lua.h', 'c'): -+ if not conf.CheckLibWithHeader('lua', 'lualib.h', 'c'): - return 0 - # make sure we have lualib which is included in lua 5.1 - if conf.CheckFunc('luaopen_base'): -@@ -189,30 +193,30 @@ def AutoConfigure(env): - conf = Configure(env) - - ## check for required libs ## -- if not conf.CheckLibWithHeader('png', 'png.h', 'c'): -- print 'Did not find png library or headers, exiting!' -- Exit(1) - if not conf.CheckLibWithHeader('z', 'zlib.h', 'c'): -- print 'Did not find the zlib library or headers, exiting!' -+ print('Did not find the zlib library or headers, exiting!') - Exit(1) -- if not 'USE_WIN32' in env['CPPDEFINES'] and not sys.platform.startswith('freebsd'): -+ if not conf.CheckLibWithHeader('png', 'png.h', 'c'): -+ print('Did not find png library or headers, exiting!') -+ Exit(1) -+ if not 'USE_WIN32' in env['CPPDEFINES'] and not sys.platform.startswith('openbsd'): - if not conf.CheckLib('dl'): -- print 'Did not find dl library or header which is needed on some systems for lua. Exiting!' -+ print('Did not find dl library or header which is needed on some systems for lua. Exiting!') - Exit(1) - if not CheckLuaLib(env, conf): -- print 'Did not find required lua library. Exiting!' -+ print('Did not find required lua library. Exiting!') - Exit(1) - if not CheckOpenGL(env, conf): -- print 'Did not find required OpenGL library. Exiting!' -+ print('Did not find required OpenGL library. Exiting!') - Exit(1) - - # Check for optional libraries # -+ if conf.CheckLib('ogg'): -+ env.Append(CPPDEFINES = 'USE_OGG') - if conf.CheckLib('vorbis'): - env.Append(CPPDEFINES = 'USE_VORBIS') - if conf.CheckLib('theora'): - env.Append(CPPDEFINES = 'USE_THEORA') -- if conf.CheckLib('ogg'): -- env.Append(CPPDEFINES = 'USE_OGG') - - # check for optional functions - if conf.CheckFunc('strcasestr'): -@@ -232,7 +236,7 @@ def AutoConfigure(env): - env.ParseConfig('sdl-config --libs') - if sys.platform != "darwin" and not '-Dmain=SDL_main' in env['CCFLAGS']: - if not conf.CheckLibWithHeader('SDL', 'SDL.h', 'c'): -- print 'Did not find SDL library or headers, exiting!' -+ print('Did not find SDL library or headers, exiting!') - Exit(1) - - env = conf.Finish() -@@ -245,14 +249,14 @@ def AutoConfigureIfNeeded(env, name): - # Remove outdated cache file - os.remove(cachename) - if optionsChanged or not os.path.exists(cachename): -- print cachename + " doesn't exist or out of date." -- print "Generating new build config cache ..." -+ print(cachename + " doesn't exist or out of date.") -+ print("Generating new build config cache ...") - cache = DefineOptions(cachename, {}) - AutoConfigure(env) - cache.Save(cachename, env) - else: - cache = DefineOptions(cachename, {}) -- print "Using " + cachename -+ print("Using " + cachename) - cache.Update(env) - - AutoConfigureIfNeeded(env, '') -@@ -265,7 +269,7 @@ addBosWarsPaths(env) - - # define the different build environments (variants) - release = env.Clone() --release.Append(CCFLAGS = Split('-O2 -pipe -fomit-frame-pointer -fexpensive-optimizations -ffast-math')) -+release.Append(CCFLAGS = Split('-fomit-frame-pointer -ffast-math')) - - if mingw['extrapath']: - mingw.Tool('crossmingw', toolpath = ['tools/scons/']) -@@ -311,7 +315,7 @@ if sys.platform.startswith('linux') or sys.platform.st - def DefineVariant(venv, v, vv = None): - if vv == None: - vv = '-' + v -- BuildDir('build/' + v, engineSourceDir, duplicate = 0) -+ VariantDir('build/' + v, engineSourceDir, duplicate = 0) - r = venv.Program('build/boswars' + vv, buildSourcesList('build/' + v)) - Alias(v, 'boswars' + vv) - return r Index: patches/patch-fabricate_py =================================================================== RCS file: patches/patch-fabricate_py diff -N patches/patch-fabricate_py --- /dev/null 1 Jan 1970 00:00:00 -0000 +++ patches/patch-fabricate_py 31 Aug 2026 02:09:57 -0000 @@ -0,0 +1,24 @@ +Python compat for Python 3.8+ + +Index: fabricate.py +--- fabricate.py.orig ++++ fabricate.py +@@ -378,10 +378,6 @@ class AtimesRunner(Runner): + """ Run command and return its dependencies and outputs, using before + and after access times to determine dependencies. """ + +- # For Python pre-2.5, ensure os.stat() returns float atimes +- old_stat_float = os.stat_float_times() +- os.stat_float_times(True) +- + originals = self.file_times() + if self.atimes == 2: + befores = originals +@@ -425,7 +421,6 @@ class AtimesRunner(Runner): + if original != afters.get(name, None): + self._utime(name, original[0], original[1]) + +- os.stat_float_times(old_stat_float) # restore stat_float_times value + return deps, outputs + + class StraceProcess(object): Index: patches/patch-make_py =================================================================== RCS file: patches/patch-make_py diff -N patches/patch-make_py --- /dev/null 1 Jan 1970 00:00:00 -0000 +++ patches/patch-make_py 31 Aug 2026 02:09:57 -0000 @@ -0,0 +1,12 @@ +Index: make.py +--- make.py.orig ++++ make.py +@@ -55,7 +55,7 @@ sources = find('engine', '*.cpp') + + def tolist(x): + if isinstance(x, str): +- return x.split(' ') ++ return x.split() + else: + return list(x) + Index: pkg/PLIST =================================================================== RCS file: /cvs/ports/games/boswars/pkg/PLIST,v diff -u -p -u -r1.8 PLIST --- pkg/PLIST 11 Mar 2022 19:04:09 -0000 1.8 +++ pkg/PLIST 31 Aug 2026 02:09:57 -0000 @@ -318,6 +318,10 @@ share/boswars/maps/clover.map/ share/boswars/maps/clover.map/presentation.smp share/boswars/maps/clover.map/setup.sms share/boswars/maps/clover.map/terrain.lua +share/boswars/maps/cornered.map/ +share/boswars/maps/cornered.map/presentation.smp +share/boswars/maps/cornered.map/setup.sms +share/boswars/maps/cornered.map/terrain.lua share/boswars/maps/empty-buildings.map/ share/boswars/maps/empty-buildings.map/presentation.smp share/boswars/maps/empty-buildings.map/setup.sms @@ -349,6 +353,37 @@ share/boswars/maps/lava-river.map/setup. share/boswars/maps/multiple-fronts-total-war.map/ share/boswars/maps/multiple-fronts-total-war.map/presentation.smp share/boswars/maps/multiple-fronts-total-war.map/setup.sms +share/boswars/maps/oasis/ +share/boswars/maps/oasis/oasis-01.map/ +share/boswars/maps/oasis/oasis-01.map/presentation.smp +share/boswars/maps/oasis/oasis-01.map/setup.sms +share/boswars/maps/oasis/oasis-02.map/ +share/boswars/maps/oasis/oasis-02.map/presentation.smp +share/boswars/maps/oasis/oasis-02.map/setup.sms +share/boswars/maps/oasis/oasis-03.map/ +share/boswars/maps/oasis/oasis-03.map/presentation.smp +share/boswars/maps/oasis/oasis-03.map/setup.sms +share/boswars/maps/oasis/oasis-04.map/ +share/boswars/maps/oasis/oasis-04.map/presentation.smp +share/boswars/maps/oasis/oasis-04.map/setup.sms +share/boswars/maps/oasis/oasis-05.map/ +share/boswars/maps/oasis/oasis-05.map/presentation.smp +share/boswars/maps/oasis/oasis-05.map/setup.sms +share/boswars/maps/oasis/oasis-06.map/ +share/boswars/maps/oasis/oasis-06.map/presentation.smp +share/boswars/maps/oasis/oasis-06.map/setup.sms +share/boswars/maps/oasis/oasis-07.map/ +share/boswars/maps/oasis/oasis-07.map/presentation.smp +share/boswars/maps/oasis/oasis-07.map/setup.sms +share/boswars/maps/oasis/oasis-08.map/ +share/boswars/maps/oasis/oasis-08.map/presentation.smp +share/boswars/maps/oasis/oasis-08.map/setup.sms +share/boswars/maps/oasis/oasis-09.map/ +share/boswars/maps/oasis/oasis-09.map/presentation.smp +share/boswars/maps/oasis/oasis-09.map/setup.sms +share/boswars/maps/oasis/oasis-10.map/ +share/boswars/maps/oasis/oasis-10.map/presentation.smp +share/boswars/maps/oasis/oasis-10.map/setup.sms share/boswars/maps/overpopulation-destroyers.map/ share/boswars/maps/overpopulation-destroyers.map/presentation.smp share/boswars/maps/overpopulation-destroyers.map/setup.sms @@ -372,6 +407,10 @@ share/boswars/maps/overpopulation-stampe share/boswars/maps/patches.map/ share/boswars/maps/patches.map/presentation.smp share/boswars/maps/patches.map/setup.sms +share/boswars/maps/ringway.map/ +share/boswars/maps/ringway.map/presentation.smp +share/boswars/maps/ringway.map/setup.sms +share/boswars/maps/ringway.map/terrain.lua share/boswars/maps/river.map/ share/boswars/maps/river.map/patch.lua share/boswars/maps/river.map/presentation.smp @@ -420,6 +459,10 @@ share/boswars/maps/wetlands02.map/presen share/boswars/maps/wetlands02.map/setup.sms share/boswars/maps/wetlands02.map/terrain.png share/boswars/maps/wetlands02.map/wetlands02-access-water.png +share/boswars/maps/wormroads.map/ +share/boswars/maps/wormroads.map/presentation.smp +share/boswars/maps/wormroads.map/setup.sms +share/boswars/maps/wormroads.map/terrain.lua share/boswars/maps/zombies.map/ share/boswars/maps/zombies.map/presentation.smp share/boswars/maps/zombies.map/setup.sms