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

Creating a patch for GNU GCC using Git

Overview and Target Audience The GNU GCC project followed a blend of a traditional method with contemporary git tools when it comes to contributing code, making the experience unique from some other, git-based projects. This blog post will explore different aspects of the process, helpful commands, and various scripts that would make the experience more pleasent for new contributors. While this blog aims to help new contributors get acustomed to the GNU GCC code culture and make contributing easier, it must be stressed that this is not in any way in-depth exploration of the process. This should help you put your first foot forward; the community will help you take the rest of the steps from that point on. This post also assumes the user is in a POSIX environment (e.g. Linux, FreeBSD). Git and GNU As stated in this phoronix post , GNU GCC made a full transition to git early 2020. As of this writing, the community seems to be adjusting to the new tools. GNU GCC hosts its own git serve...

Debugging with GCC: GIMPLE

GCC and GIMPLE One of the very first thing GCC asks the GSoC applicants to do, even before writing the application, is to try various different debugging techniques using GCC. I was personally familiar with the basic, compile-with-g-flag-and-use-gdb method. Turns out, there's more: GIMPLE. A Simple but Non-trivial Program Problem Description The instruction asks to compile a simple but non-trivial program with some flags that generates debugging information: -O3 -S -fdump-tree-all -fdump-ipa-all -fdump-rtl-all . Because I was keep reading on ways to debug GCC just prior to the statement, I immediately thought "GCC" and tried make -j8 CXXFLAGS="-O3 -S -fdump-tree-all -fdump-ipa-all -fdump-rtl-all" . This was a mistake: turns out, GCC can't be compiled with those flags. Thankfully, GCC developers have a very active IRC channel for me to signal SOS. Resolution jakub and segher were quick to respond to my call for help. jakub: it isn't meant that y...

Act 3 Scene 1

Wait, what? The last post ended with completing Act1 Scene1, with hints to Act1 Scene2. Yeah, a lot happened since. Goblin Camp Some of the last work in the blog was about the Goblin Camp, a revival project of an abandoned source code, which in turn was inspired by a great game, Dwarf Fortress. Since then, I learned more about data structures, and object design patterns. With each enlightenment in programming, I was more and more aware why this code was abandoned multiple times by different groups. I became one of them. This doesn't mean my goal of marrying parallel programming with the great game concept is abandoned: ever since the last communication, I also took a course on GPU programming, and it is giving me new ideas and goals. It just would not be happening with the existing Goblin Camp. More on this in the future. And this concluded my Act 1. How about Act2 My Act 2 began with my Coop placement at Fundserv. It was truly a learning experience, in the best sense of the wor...