Skip to main content

Project: Boost-free goblins

The headache: Boost

Don't take me wrongly: Boost library is a powerful set of tools for bleeding-edge technology. Much of it gets absorbed into the C++ Standard Libraries.

The problem lies in our project being inactive for 7 years, which means it is relying on a library that is 7 years behind. Installing such an old library is a chore, and securing a pre-built package is problematic at best. The project is even incompatible with the later versions of Boost. It may have once given the original developers a powerful technology to propel their project in the past, but now we are stuck with clock stopped at 2011. Along with libtcod being stuck also in 2012, dealing with Boost is critical to bringing the project up-to-date.

Options

There are several ways to address the issue.

Option 1 : Upgrade

We can read each related source code, research how Boost has modified the relevant function calls, and either fix the expected return type or required input type, This may lead to more and more changes like a ripple effect, and would be very difficult for a group of developers who have only just inherited a very complex code without any real documentation.

Option 2 : Keep it as is

Who cares? Let's just recompile the whole thing from an outdated repository and hope for the best. Yeah, I am kidding.

Option 3 : Remove Boost

It is in our way. Take it out. Sounds like a bold and drastic move, but given the library being 7 years old, with much of its function now integrated over several iterations of C++ standardization, this sounds almost plausible.

The Choice

Coincidentally, Robert, a major contributor to the project, thought similarly and took action: he got rid boost::cstdint library by converting it to std::cstdint, a comparable STL to the Boost version. The choice was made.
I jumped in.

Action

Identification

I started out by identifying all libraries from Boost. On bash command line, I entered the following:
git grep '#include [<]boost' | sed -n 's/^.*<\([^>]*\)>.*$/\1/p' | sort | uniq
  1. This first calls git grep to find all lines of include statement for Boost libraries.
  2. Then, it filters out all other information except for the actual name of the library between < and >.
  3. Lastly, it sorts them by name and finds just unique lines, leaving us with a nice list of all Boost libraries being used.
There was 52 lines. 52 Boost libraries to remove. Well, what is a good open-source developer to do with so many things just categorized as bugs?

Cry

So I cried the battle cry of a tired programmer on a warpath to remove Boost: I made Issues on the repository. 52 of them. I even made a project to group and track progresses.

Possible Outcome

I am fairly confident that removing Boost is going to be a challenge. The experience will teach me much about the repository itself and how it was designed. And if completed, that's one less dependency to track. Even if I fail, this will at least minimize and maybe update the Boost libraries. And afterwards, the work will still be far from being finished. We still need to bring libtcod up-to-date, and also figure out how to compile the project in Windows platform, not necessarily in that order. Much to do. Still, I am confident that this little war of mine will be finished; I have the entire open-source community to rely on. It is just a matter of time they answer my call-to-arms and cry the same cry of a frenzied programmer facing an interesting puzzle.

Comments

Popular posts from this blog

Project: Boost-free Goblins, Part 2

Last time at the goblin_camp The mad developers went on a warpath to rinse away Boost from the goblins. Loud yelling and crying was involved, 52 of them. But now that all the yelling is out of the way, how should we do this? Repetition, repetition, ... I am personally a very lazy programmer. If I can make computer do the job for me, I would have the computer do the job for me. While hunting down every instance of a library manually is doable in small number, as it was for cstdint, Other Boost libraries are more widely used and require much more effort scanning the text.
Text.
Text.
Well, if we are talking about text-manipulation in sh ... Scripting my problem away My beloved hobby tools If it is not apparently already, I love automating tasks, and UNIX shell scripting had been my go-to solution for any binary scripting needs, especially in the days before I learned to program. This problem can be solved quite easily using few lines of scripts. Caveat We will be making a simple scr…

Project: Boost-free Goblins, part 3

Ready, Aim, and Fire After the battle-cry, and then calming down to make some preparation, I decided to take the shot. The target: boost::shared_ptr. To Action A quick search turns up that shared_ptr is supported in the STL's memory library since c++11. Well, that seems like an easy task. Let's take our script for a spin. tools/boostrm.sh shared_ptr memory Now I have a bunch of std::shared_ptr replacing the boost variant. Seems like everything is in good order. After pushing it into the github to have Travis CI do the honors of compiling it, turns out, some boost::weak_ptr, apparently derived from boost::shared_ptr, was being casted into boost::shared_ptr, and they are not compatible with std::shared_ptr since that's not what they inherited. Well, after a bit of research, it seems the weak_ptr has a STL version. It seems like weak_ptr needs to go, too. tools/boostrm.sh weak_ptr memory After another push into github, and another build run by Travis CI, it turns ou…

Me and the 7 Dwa.. I mean Goblins

Brief Introduction of the Dwarf Fortress The Dwarf Fortress is a well-established, closed-source, free game that has been continuously developed since 2006. It has inspired some of the most famous games, such as Minecraft. It is considered a rouge-like game, and it chiefly relies on ASCII characters to represent various parts of the game, although there had been many successful efforts to add more advanced graphics to make the game look more attractive. Despite the modest-looking graphics, the game is packed with many features including highly complex physics emulation (liquid and solid), path-finding of multiple characters based on various personal needs, and comprehensive mechanical construct emulation. Curiosity that is about the kill the Cat The game is closed source, so how it is designed and scaled is unknown to the public. That said, it seems to be a public understanding that the game, despite having many moving parts, is created to be a single-threaded program as was the …