Building Shared Libraries (DLLs)

2001-07-04 07:00:00 +0000

The default Jambase file doesn’t come with a rule to make DLLs (or shared libraries in the Unix parlance).

The fix consists of cloning the Main and MainFromObjects rules, and modifying them as follows, to create a SharedLibrary rule.

rule **SharedLibrary**
{
	**SharedLibraryFromObjects** $(<) : $(>:S=$(SUFOBJ)) ;
	Objects $(>) ;
}

This is exactly the same as the Main rule, except that we’ve changed the names.

rule **SharedLibraryFromObjects**
{
	local _s _t ;

	# Add grist to file names
	**# Add suffix to dll/so**

	_s = [ FGristFiles $(>) ] ;
	_t = [ FAppendSuffix $(<) : **$(SUFSHR)** ] ;

	if $(_t) != $(<)
	{
	    DEPENDS $(<) : $(_t) ;
	    NOTFILE $(<) ;
	}

	# make compiled sources a dependency of target

	DEPENDS exe : $(_t) ;
	DEPENDS $(_t) : $(_s) ;
	MakeLocate $(_t) : $(LOCATE_TARGET) ;

	**# Tell jam where it can find the import library
	MakeLocate $(_t:S=$(SUFLIB)) : $(LOCATE_TARGET) ;**

	Clean clean : $(_t) ;

	**LINKFLAGS on $(_t) += /dll ;**
	Link $(_t) : $(_s) ;
}

This is a clone of the MainFromObjects, except that we’ve:

  1. Changed the name.
  2. Changed the suffix for DLL/.so files.
  3. Told jam where the import library is going to go.
  4. Set some LINKFLAGS on the target. These are needed in order to let Microsoft LINK know that it’s building a DLL.