The "l" target is a metatarget and only exists within the Jam logic. In order to build it, if you're in the same directory as the build.jam that declares it, then you can simply specify its name:
bjam l
If you're going to specify the directory where the target is declared, you must use the target reference syntax: [directory of a build.jam]//[target name]. In this case, to build "l" specifying the directory, the command would look like this:
bjam .//l
The other two targets are the actualized virtual target names, a.k.a. low-level Jam engine targets. They are declared to the engine during the actualization phase in the virtual-target module:
DEPENDS $(target:G=e) : $(target) ;
DEPENDS $(target:G=e:R=$(path)) : $(target) ;
An <e> grist is used to denote both of these targets.
--------- Original Message ---------
Subject: [Boost-build] target naming
From: "Stefan Seefeld" <>
Date: 1/20/17 9:16 am
To: "Boost.Build developer's and user's list" <>

With a Jamfile as simple as:

lib l : l.cpp : <link>shared ;
exe hello : hello.cpp l ;

I can refer to the defined targets using different names (e.g., 'l',
'', 'bin/gcc-6.3.1/debug/'). Where are these aliases
defined ? Are they all registered to the engine (backend) ? Or is the
translation handled inside the Jamfile logic ?

Using the --debug-building option, I get output such as

Building target './l'

Usage requirements for l:

However, './l' isn't a known target, i.e. calling `bjam ./l` yields an
What are the exact rules by which targets are named ?



...ich hab' noch einen Koffer in Berlin...

Unsubscribe & other changes: