Skip to main content

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 script targeting simple solution of replacing a single Boost library to the identically-named STL library. The compatibility between the two must be checked by the user, and anything more complex than that cannot be addressed by this particular script. Just blind execution of this script is likely a horrible idea. Before running any script, make sure to understand its intention and method before using it. There. Now, let's look at the script.

Plan

The script will take two arguments: Boost objects to turn into STL objects, and the library to include.
 boostrm.sh shared_ptr memory 
  • The first argument will be used to search through all files that uses the object and change the namingspace from boost:: to std::
  • The second argument will be used to change all of the relevant Boost include statements to STL counterpart.
git grep -E and associated commands will be useful to find all instances of necessary files. Then, we can loop through those files and change every instance of the target boost objects into STL objects. We can also change the include statement in the same loop.
The completed script looks like this.

#!/usr/bin/env sh

#
#Boost Remove
#
#By Tony Sim (y2s82)
#
#Requires: git grep mv sed sort uniq compatible-shell
#
#This is a dumb script that takes two argument: bash objects to change into its std:: counterpart
#It will search for the object in all source code, and replace boost:: into std::
#

if [[ $# != 2 ]] 
then
    echo "USAGE: ./boostrm object-name-or-extended-regex library-name"
    echo "The first argument is used by git grep with extended regular expression to find the boost libraries" 
    echo "The second argument is for the #include that should be added to get the std:: counterpart to run"
    echo "E.g. ./boostrm weak_ptr memory"
    echo "E.g. ./boostrm '(weak|shared)_ptr' memory"
    exit 1
fi

OBJ=$(echo $1 | sed "s/boost:://") #filter the 1st argument to contain just the name of the object without a tag
INC_LIB=$2 #the STL for the std:: version
TEMP=temp.$RANDOM.$(date) #temporary file to store the changes


for file in $(git grep -E $OBJ | sed -ne 's/^\([^:]*\):.*$/\1/p' | sort | uniq)
do
    sed\
    -e "s%^.*#include.*<.*boost/$OBJ.hpp>.*$%#include <$INC_LIB>%"\ #replace the boost library with the STL library specified
    -e "s/boost::$OBJ/std::$OBJ/g"\                                 #replace the boost:: tags with std:: tags for the given object specified
    $file\
    > $TEMP

    mv $TEMP $file
done


Armed with a small helper script, and with a written instruction at the ready, I am ready. Now, onto its application.

Comments

Popular posts from this blog

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 mor...

Vehicles with a Broken Frame

Browsing through github projects in C/C++ Trying to find ways to link up the goblin_camp project with more automated testers, I started looking around the Readme.md files of other C/C++ projects in github. From neovim, I found AppVeyor, and although I have not yet set it up, it promises to supplement Travis CI with Windows test builds. I also found Coverity Scan, which might be a way for us to scan the large, preexisting code and fix goblin_camp. Then, from Cataclysm-DDA, I found Bounty Source . The icon had a dollar figures on it, so I assumed it was some sort of funnily-named fund raising site. It was, but with a twist. Show Me The Money Apparently, this site is designed to help the project by having people put down money into a pot to fix certain issues listed in Github. Some of the issues were very popular: enough people contributed to the pot of 250 dollars. I would also imagine those are tough ones. I found myself a less-popular, 4 year-old issue of 15 dollars . I am mor...