I’m going to be dead tired before noon even approaches,  but I’m smiling now! The focus of my day, has been on getting tmk up to snuff enough that I can use it as a general purpose solution to my problem: cursing at the present ‘generation’ of such tools.

I worked on getting a base set of magic bound variables and teaching tmk that certain rules may be skipped, if a set of pre-conditions hold about the files involved. Getting that done was easy enough. The checking code is now more robust, properly handling an arbitrary set of input/output names, in as much is humanly possible ;). I’m smiling, because I spent most of the night being annoyed every which ways up, on top of an already splitting head. Ended up having to quit coding for a bit, and just hit RvS for a couple hours.

About two hours sleep, and still plenty of hours until sunrise, I woke up and got back to the codin’ and now it’s done!

So far, tmk is put together in a rather short amount of time, even if it’s been on my dancing list for a few months; finally it’s almost beta quality. Only show stopper that’s come up in testing, is it fails to handle unexisting tmk variables correctly, but that’s a one LOC fix. An outsanding issue, is that tmk variables with whitespace in them are improperly expanded, e.g. $(foo bar) expands to bar) even when a variable named ‘foo bar’ exists. That however is because of how the tokenization feeds the parsed data into the variable expansion system. Although for the sake of simplicity, I planned long ago to make the specs dictate such variable names as invalid whether or not tmk actually accepts them, so it’s a lesser issue. The include processor directive, also reports the wrong (e.g. parent) filename but correct line number (e.g. from the included file), yet that bug can be fixed in a few minutes; so I haven’t bothered yet.

Two features that remain to be done, is making rules relational (by dependency) rather then executing them in sequence, and to giving tmk the option of using checksums rather then modification times for minimising rebuilds.Which also comes into part of the leg work, for implementing a cache, hehe

Most of what needs doing, is some light polish and adding more builtin directives. Been thinking about making tmk understand a simple plugin system, that would allow it to load reasonably trusted bits of python code into part of the program, thus allowing new directives to be added at will, as well as replaced. I’ll worry about that later though.

A bit of fun with tmk

Yesterday I setup tmk to understand how to include files, by using a simple pre processing directive, making the syntax for tmk fairly simple:

variable = value

rule lhs -> rule rhs:
        command directive! word arguments

Where variable expansions and file name globbing is widely used as part of the design, while keeping the recipe parsing code fairly trivial. I designed it this way, both to be familiar with Make (although lhs/rhs are reversed), fairly obvious at a glance, and to be easy to implement. Now tmk also understands the concept of a (pre) processing directive. Since directive! is used within rules, the processing directives use the inverse, i.e. !directive. I believe that makes a better distinction then using a different symbol, especially since you can not use a command directive everywhere a processing directive is permitted. Right now there is only one directive, !include which slurps up it’s argument list as the name of a recipe file to include within the current, before continuing of course. Some form of conditional will probably be added later on; even though the rule syntax gives a way to define certain looping behaviour.

Today’s goal is to basically implement the concept of if the outputs (lhs) are more up to date then the inputs (rhs), the rule can be skipped. I don’t expect that to take to long, since most of it is just screwing with the rule expansions in order to properly stat the files. If I can get it done expeditiously, I’ll also have time to setup a few late binding `special` variables that will be useful, in proper Make fashion lol.

At which point, tmk will be effectively as good as a generic make implementation; and I can work on the parts that need to follow on. Namely the parallel support and portability aspects. The latter of course, being the main reason why CMake, SCons, and most every other such tool I’ve tried, has been rejected as more trouble then it’s worth.

An idiosyncrasy no one else gets

Whenever someone asks me how I am, I often phrase ‘and how are you?’ as ‘&you ?’, which is something usually lost on everyone. In the C programming language, the ampersand is used as an address-of operator used to create a reference of sorts, and is integer to utilising pointers. So litterally ‘address-of you ?’ makes a very explicitly reference while remaining a syntactically correct substitution of ‘&’ for ‘and’, in English anyway.

If anyone finds that odd, just try not to think about how Lisp and Perl have impacted my brain over the years lol.

One of those songs that just grows on you

This has been racking up the airwaves lately on 94.9:

You’ve been singing, that same old song
Far too long, far too long
Say you’ll buy me a shiny ring
But your words don’t mean a thing
No more calling me baby
No more loving like crazy

Til’ you take me down (take me down)
You better take me down (take me down)
Take me down to the little white church
Take me down (take me down) Take me down (take me down)
Take me down to the little white church
Take me down…

You can’t ride this gravy train,
Anymore, anyway
There’s a price for keeping me
I might be cheap, but I ain’t free
Now more calling me baby
No more loving like crazy

Til’ you take me down (take me down)
You better take me down (take me down)
Take me down to the little white church
Take me down (take me down) Take me down (take me down)
Take me down to the little white church
Take me down…

Come on!

Charming devil, silver tongue
Had your fun, now you’re done
Mama warned me ’bout your games
She don’t like you anyways

No more calling me baby
No more loving like crazy
No more chicken and gravy
I ain’t gonna have your baby!

Til’ you take me down (take me down)
You better take me down (take me down)
Take me down to the little white church
Take me down (take me down) Take me down (take me down)
Take me down to the little white church
Take me down…

Take me down to the little white church, take me down,
Take me down, take me down to the little white church, take me down, take me down, take me down, take me down to the little white church, take me down to the little white church, take me down to the little white church

Little White Church—Little Big Town

So far in the past week’ish, I’ve had two days work, two days deep-coding dawn to dusk, and two days spent with a nose like a cherry bomb :-(.

At least on the positive side, 3-4 days worth of work split between December 2009 and April 2010, my on-the-back-burner build tool has almost reached the level of utility of an early make tool. If conditionals were supported, it would be able to handle building Stargella as easily as Microsoft NMake and GNU Make can. The next steps for tmk will likely be implementing local variable bindings (think $< and friends), and a mechanism for including other files.

With this habit of getting up so insanely early, I also find it more difficult to stay up all night, unless my brain *is* focused intently on something. In which case I barely sleep at all lol. I also seem to be able to throw more hours of labour behind projects on my days off, when I get up earlier rather than later.

Now if I could do something about being pushed a few months behind schedule o/.

Visual C++ 2010 Express, new levels of weirdness…

As usual there is a redist.txt file in the Visual Studio root, that explains about what Microsoft supplied files you’re allowed to redistribute with your applications. In MSVC9.0, the express edition only came with release and (non re-distributable) debug assemblies of the C, C++, and  managed code runtime libraries.

In looking at the files installed by the latest and strangest version yet, I see that there is no vcredist folder… instead there is a vccrt folder, that contains a mungle of C and C++ that appears to be source code for some type of MS C/C++ runtime libraries :-/.

You know RvS is brain damaged ….

when you’ve got three tangos shoulder to shoulder and shotgun aimed shells do nothing at point blank, except hit the snow directly behind them!

when you’re running like a bat out of hell and can still snipe a tango 30m away with a snapped buckshot

when tangos can dance around a load of buck like Michael Jackson on stage

when hand guns are better short range weapons then a shotgun

when tangos are better dancers then shooters, are worse shooters then noobs, and more accurate then Hathcock, while sliding down a staircase backwards!

I could go on and on, but I’ll just say Raven Shield demonstrates much brain damage.

+1 simple relationals

On my way to the head, I was thinking about ways to improve the robustness of a program  that I’ve been tinkering with on the side. Simply put it defines an ordered set of roughly hierarchical data, that is integral to processing later based on certain groupings of it. The set is such a collection of information, that recalling it later would best be done through an associative container, where in the keys may be any unique attribute of the data set being processed, rather then having to be any given accessor.

The obvious solution to bundling the data, is to create an abstract record representing the keys that need querying, e.g. each objects attributes are expected to correspond to an unique instance formed by the data set. In thinking about how such a thing might be implemented without losing the speed of a hashed table look up; the first thought to come to mind, of course was the most simple and straight forward idea. If the implementation language was C, it would be trivial to throw together a set of structures for representing items in the data set, and wrap them in an opaque record that binds together a group of hash tables or balancing BSTs for each key type we want, which would then look up a pointer to the individual records, through a structure tuned for minimal memory usage. Second to come to mind, was a rather interesting tree structure to minimise cost for retrieving any given node. In which of course I remembered that this particular implementation case dealt with a certain language that traded such memory conciousness for a garbage collector.

On my way back to my work station, I thunk to myself, “Well hell, I just defined a relational data structure!”, and with the idea of running an SQLite database in process memory now floating through my mind, sure enough the API that I had envisioned, was little more then a relational algebra tuned to the problem domain being worked in.

The implementation language might lack an equivalent to Cs memory management, and gives no guarantee that the amount of copying and GC work involved wouldn’t grow exponentially with the data set size… but it does have a binding to the SQLite database, which is fairly handy, hehehe. So the obvious question is which way handles things more efficiently: relying on the language implementation to avoid unnecessary copying of memory, or going through the overhead of a lite weight SQL database.

Sometimes I love how these kind of things are so simple to work out in the course of short trip down the hall, lol.

QOTD 2010-04-12

There is a reason soldering iron handles are bright yellow. It will still not stop you from picking it up by the hot bit at least once…

source: /.