Posted in Software Development on 07 Feb 2026 at 22:10 UTC
Just a quick post to share how to install universal (arm64+x64) Lua modules on macOS using LuaRocks, since by default it only compiles for the current architecture and I couldn't find it documented anywhere:
$ luarocks \
CFLAGS="-arch arm64 -arch x86_64" \
LIBFLAG="-arch arm64 -arch x86_64 -undefined dynamic_lookup -all_load" \
install someluamodule
The CFLAGS parameter does what you would expect, and LIBFLAG is the flags supplied to the link command when linking dynamic libraries. I looked at a few modules and the default values for macOS varied a bit, but -undefined dynamic_lookup -all_load seems to be a good default for most/all modules.
Posted in Software Development on 27 May 2020 at 21:39 UTC
At the end of the last article (In September 2017 actually), I had a fully automated regression testing system for IPXWrapper. In September of 2019, after two years of not touching the system and doing a little work on IPXWrapper itself, I felt it was time to install Windows updates in the VM images... and that's where everything went wrong....
Posted in Software Development on 07 Oct 2019 at 18:48 UTC
The GNU Make shell function executes a shell command, expanding to whatever it wrote to standard output. If the command fails, thats just fiiine - however much it did or didn't output is what you get.
command_output := $(shell command)
I use the shell function for (among other things) getting compiler flags necessary for using libraries (e.g. from pkg-config), and Make's behaviour of ignoring these errors is rather annoying, since it can mask the actual error with pages of output before getting to a build command that actually fails. Sometimes it can even mess up the compiler flags to the point you (or at least I) spend ages hunting down a phantom problem that doesn't exist.
Weirdly, I couldn't find any good solution on the web, with a bit of experimentation I wound up developing the following macro:
# Wrapper around the $(shell) function that aborts the build if the command # exits with a nonzero status. shell-or-die = $\ $(eval sod_out := $(shell $(1); echo $$?))$\ $(if $(filter 0,$(lastword $(sod_out))),$\ $(wordlist 1, $(shell echo $$(($(words $(sod_out)) - 1))), $(sod_out)),$\ $(error $(1) exited with status $(lastword $(sod_out)))) WX_CXXFLAGS := $(call shell-or-die,wx-config --cxxflags base core aui propgrid adv) WX_LIBS := $(call shell-or-die,wx-config --libs base core aui propgrid adv)
If you don't mind depending on GNU Make 4.2 (a bit too new for my tastes), if can be simplified to:
shell-or-die = $\ $(eval sod_out := $(shell $(1)))$\ $(if $(filter 0,$(.SHELLSTATUS)),$\ $(sod_out),$\ $(error $(1) exited with status $(.SHELLSTATUS)))
Posted in Software Development on 06 Mar 2018 at 21:39 UTC
In 2014 I wrote a fairly comprehensive test suite for IPXWrapper, which tests it end-to-end, from the APIs through to the network traffic they generate and process. It depends on a meticulously configured set of Windows and Linux machines, which I had duplicated using several different versions of Windows.
Eventually bit-rot set in and some of the Windows VMs became unusable for quick testing; sat installing updates whenever I booted them, broke themselves in odd ways, etc. Also my workstation doesn't have enough RAM for Chrome and several Windows VMs at the same time. No machine does.
...Posted in Software Development on 22 Dec 2017 at 15:29 UTC
Today I was writing some C++ and wanted to add a private struct within a class for storing some data, but not just any struct - I wanted a private abstract base struct with a couple of implementations.
So I wrote something like this:
...
That didn't compile, GCC gave me the following error and Google wasn't terribly helpful when I searched for it:
/home/solemnwarning/test.cpp:8:3: error: ‘struct Thing::PrivateAbstract::A’ redeclared with different access...