xref: /haiku/Jamrules (revision 7d7f280ed3e93a3fb30660c6f5a349cf53d5cc2d)
152a38012Sejakowatz# Include BuildConfig
252a38012Sejakowatz{
352a38012Sejakowatz	local buildConfig = [ GLOB $(OBOS_TOP) : BuildConfig ] ;
452a38012Sejakowatz	if ! $(buildConfig)
552a38012Sejakowatz	{
652a38012Sejakowatz		EXIT "No BuildConfig!"
752a38012Sejakowatz			 "Run ./configure in the source tree's root directory first!" ;
852a38012Sejakowatz	}
952a38012Sejakowatz	include $(buildConfig) ;
1052a38012Sejakowatz}
1152a38012Sejakowatz
1252a38012Sejakowatz# Determine if we're building on PPC or x86
1352a38012Sejakowatz# Determine mimetype of executable
1452a38012Sejakowatz# Cross compiling can come later
1552a38012Sejakowatz
1652a38012Sejakowatzif $(METROWERKS) {
1752a38012Sejakowatz	OBOS_TARGET ?= "ppc.R5" ;
1852a38012Sejakowatz	OBOS_TARGET_TYPE ?= "application/x-be-executable" ;
1952a38012Sejakowatz	OBOS_ARCH ?= "ppc" ;
2052a38012Sejakowatz	OBOS_TARGET_DEFINE ?= "ARCH_ppc" ;
2152a38012Sejakowatz} else {
2252a38012Sejakowatz	OBOS_TARGET ?= "x86.R5" ;
2352a38012Sejakowatz	OBOS_TARGET_TYPE ?= "application/x-vnd.Be-elfexecutable" ;
2452a38012Sejakowatz	OBOS_ARCH ?= "x86" ;
2552a38012Sejakowatz	OBOS_TARGET_DEFINE ?= "ARCH_x86" ;
2652a38012Sejakowatz	OBOS_TARGET_DIR ?= "x86" ;
2752a38012Sejakowatz}
2852a38012Sejakowatz
2952a38012SejakowatzKERNEL_CCFLAGS ?= "-Wall -Wno-multichar -Wmissing-prototypes -finline -nostdinc" ;
3052a38012SejakowatzKERNEL_CCFLAGS += "-fno-builtin -D$(OBOS_TARGET_DEFINE) " ;
3152a38012Sejakowatz
3252a38012SejakowatzAR = ar r ;
3352a38012SejakowatzOPTIM = -O2 ;
3452a38012Sejakowatz
3552a38012Sejakowatz# If no OBOS_OBJECT_TARGET is not defined yet, use our default directory and
3652a38012Sejakowatz# include our "OBOS_TARGET" as subdirectory in there (to prevent different
3752a38012Sejakowatz# builds mixing objects from different targets).
3852a38012Sejakowatzif ! $(OBOS_OBJECT_TARGET) {
3952a38012Sejakowatz	OBOS_OBJECT_TARGET ?= [ FDirName $(OBOS_TOP) objects $(OBOS_TARGET) ] ;
4052a38012Sejakowatz}
4152a38012Sejakowatz
4252a38012Sejakowatz# If no OBOS_DISTRO_TARGET is not defined yet, use our default directory and
4352a38012Sejakowatz# include our "OBOS_TARGET" as subdirectory in there (to prevent different
4452a38012Sejakowatz# builds mixing executables from different targets).
4552a38012Sejakowatzif ! $(OBOS_DISTRO_TARGET) {
4652a38012Sejakowatz	OBOS_DISTRO_TARGET ?= [ FDirName $(OBOS_TOP) distro $(OBOS_TARGET) ] ;
4752a38012Sejakowatz}
4852a38012Sejakowatz
4952a38012Sejakowatz# Set our version number if not already set and mark it as a developer build
5052a38012Sejakowatzif ! $(OBOS_BUILD_VERSION) {
5152a38012Sejakowatz	OBOS_BUILD_VERSION ?= "1 0 0 a 1" ;
5252a38012Sejakowatz	OBOS_BUILD_DESCRIPTION ?= "Developer Build" ;
5352a38012Sejakowatz}
5452a38012Sejakowatz
5552a38012Sejakowatz# If OBOS_BUILD_VERSION is set, but OBOS_BUILD_DESCRIPTION isn't, mark it as
5652a38012Sejakowatz# an unknown build.
5752a38012Sejakowatzif ! $(OBOS_BUILD_DESCRIPTION) {
5852a38012Sejakowatz	OBOS_BUILD_DESCRIPTION ?= "Unknown Build" ;
5952a38012Sejakowatz}
6052a38012Sejakowatz
6152a38012Sejakowatz# Relative subdirs for distro dir (these are for *INTERNAL* use by the following rules only!)
625f281ed5SejakowatzOBOS_APPS_DIR   ?= [ FDirName $(OBOS_DISTRO_TARGET) beos apps ] ;
6352a38012SejakowatzOBOS_PREFS_DIR  ?= [ FDirName $(OBOS_DISTRO_TARGET) beos preferences ] ;
6452a38012SejakowatzOBOS_SERVER_DIR ?= [ FDirName $(OBOS_DISTRO_TARGET) beos system servers ] ;
6552a38012SejakowatzOBOS_ADDON_DIR  ?= [ FDirName $(OBOS_DISTRO_TARGET) beos system add-ons ] ;
6652a38012SejakowatzOBOS_SHLIB_DIR  ?= [ FDirName $(OBOS_DISTRO_TARGET) beos system lib ] ;
6752a38012SejakowatzOBOS_STLIB_DIR  ?= [ FDirName $(OBOS_DISTRO_TARGET) beos system lib ] ;
6852a38012SejakowatzOBOS_KERNEL_DIR ?= [ FDirName $(OBOS_DISTRO_TARGET) beos system ] ;
6952a38012SejakowatzOBOS_TEST_DIR   ?= [ FDirName $(OBOS_TOP) tests ] ;
7052a38012Sejakowatz
7152a38012SejakowatzOBOS_KERNEL_CONFIG = config.$(OBOS_ARCH).ini ;
7252a38012SejakowatzOBOS_KERNEL = kernel.$(OBOS_ARCH) ;
7352a38012SejakowatzOBOS_FLOPPY = floppy.$(OBOS_ARCH) ;
7452a38012Sejakowatz
7552a38012Sejakowatzrule SetupIncludes
7652a38012Sejakowatz{
7752a38012Sejakowatz	OBOS_INCLUDES ?= . add-ons app be_apps device drivers game interface kernel mail media midi midi2 net opengl storage support translation ;
7852a38012Sejakowatz	UsePublicHeaders $(OBOS_INCLUDES) ;
7952a38012Sejakowatz}
8052a38012Sejakowatz
8152a38012Sejakowatz#-------------------------------------------------------------------------------
8252a38012Sejakowatz# Things Jam needs in order to work :)
8352a38012Sejakowatz#-------------------------------------------------------------------------------
8452a38012Sejakowatz
8552a38012Sejakowatzrule UserObject
8652a38012Sejakowatz{
8752a38012Sejakowatz	switch $(2)
8852a38012Sejakowatz	{
8952a38012Sejakowatz	case *.S    : assemble $(1) : $(2) ;
9052a38012Sejakowatz	case *      : ECHO "unknown suffix on" $(2) ;
9152a38012Sejakowatz	}
9252a38012Sejakowatz}
9352a38012Sejakowatz
9452a38012Sejakowatz# Override the default to give "prettier" command lines.
9552a38012Sejakowatzactions Cc
9652a38012Sejakowatz{
9752a38012Sejakowatz	$(CC) -c $(2) $(CCFLAGS) $(CCDEFS) $(CCHDRS) -o $(1) ;
9852a38012Sejakowatz}
9952a38012Sejakowatz
10052a38012Sejakowatzactions C++
10152a38012Sejakowatz{
10252a38012Sejakowatz	$(C++) -c $(2) $(C++FLAGS) $(CCDEFS) $(CCHDRS) -o $(1) ;
10352a38012Sejakowatz}
10452a38012Sejakowatz
10552a38012Sejakowatz
10652a38012Sejakowatz#-------------------------------------------------------------------------------
10752a38012Sejakowatz# General High-level OBOS target rules
10852a38012Sejakowatz#-------------------------------------------------------------------------------
10952a38012Sejakowatz
1105f281ed5Sejakowatzrule App
1115f281ed5Sejakowatz{
1125f281ed5Sejakowatz	# App <name> : <sources> ;
1135f281ed5Sejakowatz	SetupObjectsDir ;
1145f281ed5Sejakowatz	Main $(<) : $(>) ;
1155f281ed5Sejakowatz	MakeLocate $(<) : $(OBOS_APPS_DIR) ;
1165f281ed5Sejakowatz}
1175f281ed5Sejakowatz
11852a38012Sejakowatzrule Preference
11952a38012Sejakowatz{
12052a38012Sejakowatz	# Preference <name> : <sources> ;
12152a38012Sejakowatz#	SetupIncludes ;
12252a38012Sejakowatz	SetupObjectsDir ;
12352a38012Sejakowatz	Main $(<) : $(>) ;
12452a38012Sejakowatz	MakeLocate $(<) : $(OBOS_PREFS_DIR) ;
12552a38012Sejakowatz}
12652a38012Sejakowatz
12752a38012Sejakowatzrule Server
12852a38012Sejakowatz{
12952a38012Sejakowatz	# Server <name> : <sources> ;
13052a38012Sejakowatz
13152a38012Sejakowatz	SetupIncludes ;
13252a38012Sejakowatz	SetupObjectsDir ;
13352a38012Sejakowatz	Main $(<) : $(>) ;
13452a38012Sejakowatz	MakeLocate $(<) : $(OBOS_SERVER_DIR) ;
13552a38012Sejakowatz}
13652a38012Sejakowatz
13752a38012Sejakowatz# test pseudo targets
13852a38012SejakowatzNOTFILE obostests ;
13952a38012SejakowatzNOTFILE r5tests ;
14052a38012Sejakowatz
14152a38012Sejakowatzrule CommonUnitTest
14252a38012Sejakowatz{
14352a38012Sejakowatz	# CommonUnitTest <target> : <sources> : <dest> : <obos libraries>
14452a38012Sejakowatz	#	: <r5 libraries> : <public headers>;
14552a38012Sejakowatz	# Builds a unit test for both OBOS and R5 modules.
14652a38012Sejakowatz	# <target> The name of the target.
14752a38012Sejakowatz	# <sources> The list of sources.
14852a38012Sejakowatz	# <dest> The directory for the target (as passed to FDirName).
14952a38012Sejakowatz	# <obos libraries> A list of link libraries for the OBOS tests (as passed
15052a38012Sejakowatz	# to LinkSharedOSLibs).
15152a38012Sejakowatz	# <r5 libraries> A list of link libraries for the R5 tests (as passed
15252a38012Sejakowatz	# to LinkSharedOSLibs).
15352a38012Sejakowatz	# <public headers> A list of public header dirs (as passed to
15452a38012Sejakowatz	# UsePublicHeaders).
15552a38012Sejakowatz
15652a38012Sejakowatz	UnitTest $(1) : $(2) : $(3) : $(4) : $(6) ;
15752a38012Sejakowatz	R5UnitTest $(1) : $(2) : $(3) : $(5) ;
15852a38012Sejakowatz}
15952a38012Sejakowatz
16052a38012Sejakowatzrule UnitTest
16152a38012Sejakowatz{
16252a38012Sejakowatz	# UnitTest <target> : <sources> : <dest> : <libraries> : <public headers>
16352a38012Sejakowatz	# Builds a unit test for an OBOS module.
16452a38012Sejakowatz	# <target> The name of the target.
16552a38012Sejakowatz	# <sources> The list of sources.
16652a38012Sejakowatz	# <dest> The directory for the target (as passed to FDirName).
16752a38012Sejakowatz	# <libraries> A list of link libraries (as passed to LinkSharedOSLibs).
16852a38012Sejakowatz	# <public headers> A list of public header dirs (as passed to
16952a38012Sejakowatz	# UsePublicHeaders).
17052a38012Sejakowatz
17152a38012Sejakowatz	local target = $(1) ;
17252a38012Sejakowatz	local sources = $(2) ;
17352a38012Sejakowatz	local dest = $(3) ;
17452a38012Sejakowatz	local libraries = $(4) ;
17552a38012Sejakowatz	local headerDirs = $(5) ;
17652a38012Sejakowatz
1773b9eae39SIngo Weinhold	# Turn optimization off.
1783b9eae39SIngo Weinhold	local optim = $(OPTIM) ;
1793b9eae39SIngo Weinhold	OPTIM = ;
1803b9eae39SIngo Weinhold
18152a38012Sejakowatz#	SetupIncludes ;
18252a38012Sejakowatz	UseCppUnitHeaders ;
18352a38012Sejakowatz	SetupObjectsDir ;
18452a38012Sejakowatz	MakeLocateObjects $(sources) ;
18552a38012Sejakowatz	Main $(target) : $(sources) ;
18652a38012Sejakowatz	MakeLocate $(target) : [ FDirName $(OBOS_TEST_DIR) $(dest) ] ;
18752a38012Sejakowatz	DEPENDS $(target) : libcppunit.so ;
18852a38012Sejakowatz	DEPENDS obostests : $(target) ;
18952a38012Sejakowatz	LinkSharedOSLibs $(target) : libcppunit.so $(libraries) ;
190*7d7f280eSIngo Weinhold	UsePublicObjectHeaders $(sources) : $(headerDirs) ;
19152a38012Sejakowatz	ObjectDefines $(sources) : TEST_OBOS ;
19252a38012Sejakowatz
19352a38012Sejakowatz	# Turn debugging on. That is usually desired for test code.
19452a38012Sejakowatz	ObjectCcFlags $(sources) : "-g" ;
19552a38012Sejakowatz	ObjectC++Flags $(sources) : "-g" ;
1963b9eae39SIngo Weinhold
1973b9eae39SIngo Weinhold	# Turn optimization on again.
1983b9eae39SIngo Weinhold	OPTIM = $(optim) ;
19952a38012Sejakowatz}
20052a38012Sejakowatz
20152a38012Sejakowatzrule R5UnitTest
20252a38012Sejakowatz{
20352a38012Sejakowatz	# R5UnitTest <target> : <sources> : <dest> : <libraries>
20452a38012Sejakowatz	# Builds a unit test for an R5 module. "_r5" is appended to the object
20552a38012Sejakowatz	# and the target name.
20652a38012Sejakowatz	# <target> The name of the target.
20752a38012Sejakowatz	# <sources> The list of sources.
20852a38012Sejakowatz	# <dest> The directory for the target (as passed to FDirName).
20952a38012Sejakowatz	# <libraries> A list of link libraries (as passed to LinkSharedOSLibs).
21052a38012Sejakowatz
21152a38012Sejakowatz	local target = $(1)_r5 ;
21252a38012Sejakowatz	local sources = $(2) ;
21352a38012Sejakowatz	local dest = $(3) ;
21452a38012Sejakowatz	local libraries = $(4) ;
21552a38012Sejakowatz	local objects = [ R5ObjectNames $(sources) ] ;
21652a38012Sejakowatz
2173b9eae39SIngo Weinhold	# Turn optimization off.
2183b9eae39SIngo Weinhold	local optim = $(OPTIM) ;
2193b9eae39SIngo Weinhold	OPTIM = ;
2203b9eae39SIngo Weinhold
22152a38012Sejakowatz	UseCppUnitHeaders ;
22252a38012Sejakowatz	SetupObjectsDir ;
22352a38012Sejakowatz	MakeLocateObjects $(objects) ;
22452a38012Sejakowatz
22552a38012Sejakowatz	# Our Main replacement.
22652a38012Sejakowatz	MainFromObjects $(target) : $(objects) ;
22752a38012Sejakowatz	local source ;
22852a38012Sejakowatz	for source in [ FGristFiles $(sources) ]
22952a38012Sejakowatz	{
23052a38012Sejakowatz		local object = [ R5ObjectNames $(source) ] ;
23152a38012Sejakowatz		Object $(object) : $(source) ;
23252a38012Sejakowatz		Depends obj : $(object) ;
23352a38012Sejakowatz	}
23452a38012Sejakowatz
23552a38012Sejakowatz	MakeLocate $(target) : [ FDirName $(OBOS_TEST_DIR) $(dest) ] ;
23652a38012Sejakowatz	DEPENDS $(target) : libcppunit.so ;
23752a38012Sejakowatz	DEPENDS r5tests : $(target) ;
23852a38012Sejakowatz	LinkSharedOSLibs $(target) : libcppunit.so $(libraries) ;
23952a38012Sejakowatz	ObjectDefines $(objects) : TEST_R5 ;
24052a38012Sejakowatz
24152a38012Sejakowatz	# Turn debugging on. That is usually desired for test code.
24252a38012Sejakowatz	ObjectCcFlags $(objects) : "-g" ;
24352a38012Sejakowatz	ObjectC++Flags $(objects) : "-g" ;
2443b9eae39SIngo Weinhold
2453b9eae39SIngo Weinhold	# Turn optimization on again.
2463b9eae39SIngo Weinhold	OPTIM = $(optim) ;
24752a38012Sejakowatz}
24852a38012Sejakowatz
24952a38012Sejakowatzrule R5ObjectNames
25052a38012Sejakowatz{
25152a38012Sejakowatz	# R5ObjectNames <sources> ;
25252a38012Sejakowatz	# Returns a list of gristed object names given a list of source file names.
25352a38012Sejakowatz	# Moreover each object names gets "_r5" inserted before the object suffix.
25452a38012Sejakowatz	local objects = $(1:S=)_r5 ;
25552a38012Sejakowatz	return [ FGristFiles $(objects:S=$(SUFOBJ)) ] ;
25652a38012Sejakowatz}
25752a38012Sejakowatz
25852a38012Sejakowatzrule Addon
25952a38012Sejakowatz{
26052a38012Sejakowatz	# Addon <name> : <relpath> : <sources> ;
26152a38012Sejakowatz
262*7d7f280eSIngo Weinhold#	SetupIncludes ;
26352a38012Sejakowatz	SetupObjectsDir ;
26452a38012Sejakowatz	Main $(1) : $(3) ;
26552a38012Sejakowatz
26652a38012Sejakowatz	# Create output dir path for addon
26752a38012Sejakowatz	local targetdir;
26852a38012Sejakowatz	targetdir = [ FDirName $(OBOS_ADDON_DIR) $(2) ] ;
26952a38012Sejakowatz
27052a38012Sejakowatz	MakeLocate $(1) : $(targetdir) ;
27152a38012Sejakowatz	LINKFLAGS on $(1) = $(LINKFLAGS) -nostart -Xlinker -soname=\"$(1)\" ;
27252a38012Sejakowatz}
27352a38012Sejakowatz
27452a38012Sejakowatzrule MakeLocateObjects
27552a38012Sejakowatz{
27652a38012Sejakowatz	# MakeLocateObjects <gristed_sources_or_objects> ;
27752a38012Sejakowatz
27852a38012Sejakowatz	local _objs = $(1:S=$(SUFOBJ)) ;
27952a38012Sejakowatz
28052a38012Sejakowatz	for o in $(_objs)
28152a38012Sejakowatz	{
28252a38012Sejakowatz		local dir = $(o:D) ;
28352a38012Sejakowatz		if $(dir) {
28452a38012Sejakowatz			MakeLocate $(o) : [ FDirName $(LOCATE_TARGET) $(dir) ] ;
28552a38012Sejakowatz		} else {
28652a38012Sejakowatz			MakeLocate $(o) : $(LOCATE_TARGET) ;
28752a38012Sejakowatz		}
28852a38012Sejakowatz	}
28952a38012Sejakowatz}
29052a38012Sejakowatz
29152a38012Sejakowatzrule StaticLibrary
29252a38012Sejakowatz{
29352a38012Sejakowatz	# StaticLibrary <name> : <sources> ;
29452a38012Sejakowatz
29552a38012Sejakowatz	SetupIncludes ;
29652a38012Sejakowatz	SetupObjectsDir ;
29752a38012Sejakowatz	MakeLocateObjects $(2) ;
29852a38012Sejakowatz	Library lib$(<).a : $(>) ;
29952a38012Sejakowatz	MakeLocate lib$(<).a : $(OBOS_STLIB_DIR) ;
30052a38012Sejakowatz}
30152a38012Sejakowatz
30252a38012Sejakowatzrule SharedLibrary
30352a38012Sejakowatz{
30452a38012Sejakowatz	# SharedLibrary <name> : <sources> ;
30552a38012Sejakowatz	local _lib = lib$(1).so ;
30652a38012Sejakowatz
30752a38012Sejakowatz#	SetupIncludes ;
30852a38012Sejakowatz	SetupObjectsDir ;
30952a38012Sejakowatz	MakeLocateObjects $(2) ;
31052a38012Sejakowatz	Main $(_lib) : $(2) ;
31152a38012Sejakowatz	MakeLocate $(_lib) : $(OBOS_SHLIB_DIR) ;
31252a38012Sejakowatz	LINKFLAGS on $(_lib) = $(LINKFLAGS) -nostart -Xlinker -soname=\"$(_lib)\" ;
31352a38012Sejakowatz}
31452a38012Sejakowatz
31552a38012Sejakowatzrule LinkSharedOSLibs
31652a38012Sejakowatz{
31752a38012Sejakowatz	# LinkSharedOSLibs <name> : <libs> ;
31852a38012Sejakowatz	# Valid elements for <libs> are e.g. "be" or "libopenbeos.so" or
3194236d490SIngo Weinhold	# "/boot/.../libfoo.so". If the basename starts with "lib" or the thingy
3204236d490SIngo Weinhold	# has a dirname or grist, it is added to the NEEDLIBS variable (i.e. the
3214236d490SIngo Weinhold	# file will be bound!), otherwise it is prefixed "-l" and added to
3224236d490SIngo Weinhold	# LINKLIBS.
32352a38012Sejakowatz
32452a38012Sejakowatz	for i in $(>)
32552a38012Sejakowatz	{
3264236d490SIngo Weinhold		local isfile = ;
3274236d490SIngo Weinhold		if $(i:D) || $(i:G) {
3284236d490SIngo Weinhold			isfile = true ;
3294236d490SIngo Weinhold		} else {
33052a38012Sejakowatz			switch $(i:B)
33152a38012Sejakowatz			{
3324236d490SIngo Weinhold				case lib*	: isfile = true ;
3334236d490SIngo Weinhold				case *		: isfile = ;
3344236d490SIngo Weinhold			}
3354236d490SIngo Weinhold		}
3364236d490SIngo Weinhold		if $(isfile) {
3374236d490SIngo Weinhold			NEEDLIBS on $(1) += $(i) ;
3384236d490SIngo Weinhold			DEPENDS $(1) : $(i) ;
3394236d490SIngo Weinhold		} else {
3404236d490SIngo Weinhold			LINKLIBS on $(1) += -l$(i) ;
34152a38012Sejakowatz		}
34252a38012Sejakowatz	}
34352a38012Sejakowatz}
34452a38012Sejakowatz
34552a38012Sejakowatzrule LinkStaticOSLibs
34652a38012Sejakowatz{
34752a38012Sejakowatz	# LinkStaticOSLibs <name> : <libs> ;
34852a38012Sejakowatz
34952a38012Sejakowatz	for i in $(>)
35052a38012Sejakowatz	{
35152a38012Sejakowatz		LINKLIBS on $(<) = $(LINKLIBS) -l $(i) ;
35252a38012Sejakowatz	}
35352a38012Sejakowatz}
35452a38012Sejakowatz
35552a38012Sejakowatzrule AddResources
35652a38012Sejakowatz{
35752a38012Sejakowatz	# AddResources <name> : <resourcefiles> ;
35852a38012Sejakowatz
35952a38012Sejakowatz	local dir;
36052a38012Sejakowatz
36152a38012Sejakowatz	dir = [ FDirName $(OBOS_TOP) $(SUBDIR_TOKENS) ] ;
36252a38012Sejakowatz
36352a38012Sejakowatz	for i in $(>)
36452a38012Sejakowatz	{
36552a38012Sejakowatz	    RESFILES on $(<) = [ FDirName $(dir) $(i) ] ;
36652a38012Sejakowatz	    DEPENDS $(<) : [ FDirName $(dir) $(i) ] ;
36752a38012Sejakowatz	}
36852a38012Sejakowatz}
36952a38012Sejakowatz
370*7d7f280eSIngo Weinholdrule PublicHeaders
37152a38012Sejakowatz{
372*7d7f280eSIngo Weinhold	# PublicHeaders <group list>
37352a38012Sejakowatz	#
374*7d7f280eSIngo Weinhold	# Returns the directory names for the public header dirs identified by
375*7d7f280eSIngo Weinhold	# <group list>.
37652a38012Sejakowatz
37752a38012Sejakowatz	local list = $(1) ;
378*7d7f280eSIngo Weinhold	local dirs ;
37952a38012Sejakowatz	for i in $(list) {
380*7d7f280eSIngo Weinhold		dirs += [ FDirName $(OBOS_TOP) headers os $(i) ] ;
381*7d7f280eSIngo Weinhold	}
382*7d7f280eSIngo Weinhold	return $(dirs) ;
38352a38012Sejakowatz}
38452a38012Sejakowatz
385*7d7f280eSIngo Weinholdrule PrivateHeaders
386*7d7f280eSIngo Weinhold{
387*7d7f280eSIngo Weinhold	# PrivateHeaders <group list>
388*7d7f280eSIngo Weinhold	#
389*7d7f280eSIngo Weinhold	# Returns the directory names for the private header dirs identified by
390*7d7f280eSIngo Weinhold	# <group list>.
391*7d7f280eSIngo Weinhold
392*7d7f280eSIngo Weinhold	local list = $(1) ;
393*7d7f280eSIngo Weinhold	local dirs ;
394*7d7f280eSIngo Weinhold	for i in $(list) {
395*7d7f280eSIngo Weinhold		dirs += [ FDirName $(OBOS_TOP) headers private $(i) ] ;
396*7d7f280eSIngo Weinhold	}
397*7d7f280eSIngo Weinhold	return $(dirs) ;
398*7d7f280eSIngo Weinhold}
399*7d7f280eSIngo Weinhold
400*7d7f280eSIngo Weinholdrule ArchHeaders
401*7d7f280eSIngo Weinhold{
402*7d7f280eSIngo Weinhold	# usage: ArchHeaders <arch> ;
403*7d7f280eSIngo Weinhold	#
404*7d7f280eSIngo Weinhold	# <arch> specifies the architecture (e.g. x86).
405*7d7f280eSIngo Weinhold
406*7d7f280eSIngo Weinhold	return [ FDirName $(OBOS_TOP) headers private kernel arch $(1) ] ;
407*7d7f280eSIngo Weinhold}
408*7d7f280eSIngo Weinhold
409*7d7f280eSIngo Weinholdrule UsePublicHeaders
410*7d7f280eSIngo Weinhold{
411*7d7f280eSIngo Weinhold	# UsePublicHeaders <group list> ;
412*7d7f280eSIngo Weinhold	#
413*7d7f280eSIngo Weinhold	# Adds the public C header dirs given by <group list> to the header search
414*7d7f280eSIngo Weinhold	# dirs of the subdirectory.
415*7d7f280eSIngo Weinhold	# NOTE: This rule must be invoked *before* the rule that builds the objects.
416*7d7f280eSIngo Weinhold
417*7d7f280eSIngo Weinhold	UseHeaders [ PublicHeaders $(1) ] ;
418*7d7f280eSIngo Weinhold}
419*7d7f280eSIngo Weinhold
420*7d7f280eSIngo Weinholdrule UsePublicObjectHeaders
421*7d7f280eSIngo Weinhold{
422*7d7f280eSIngo Weinhold	# UsePublicObjectHeaders <sources_or_objects> : <group list> ;
423*7d7f280eSIngo Weinhold	#
424*7d7f280eSIngo Weinhold	# Adds the public C header dirs given by <group list> to the header search
425*7d7f280eSIngo Weinhold	# dirs of <sources_or_objects>.
426*7d7f280eSIngo Weinhold	# NOTE: This rule must be invoked *after* the rule that builds the objects.
427*7d7f280eSIngo Weinhold
428*7d7f280eSIngo Weinhold	ObjectHdrs $(1) : [ PublicHeaders $(2) ] ;
42952a38012Sejakowatz}
43052a38012Sejakowatz
43152a38012Sejakowatzrule UsePrivateHeaders
43252a38012Sejakowatz{
433*7d7f280eSIngo Weinhold	# UsePrivateHeaders <group list> ;
43452a38012Sejakowatz	#
43552a38012Sejakowatz	# Adds the private C header dirs given by <group list> to the header search
436*7d7f280eSIngo Weinhold	# dirs of the subdirectory.
437*7d7f280eSIngo Weinhold	# NOTE: This rule must be invoked *before* the rule that builds the objects.
43852a38012Sejakowatz
439*7d7f280eSIngo Weinhold	UseHeaders [ PrivateHeaders $(1) ] ;
44052a38012Sejakowatz}
44152a38012Sejakowatz
442*7d7f280eSIngo Weinholdrule UsePrivateObjectHeaders
443*7d7f280eSIngo Weinhold{
444*7d7f280eSIngo Weinhold	# UsePrivateObjectHeaders <sources_or_objects> : <group list> ;
445*7d7f280eSIngo Weinhold	#
446*7d7f280eSIngo Weinhold	# Adds the private C header dirs given by <group list> to the header search
447*7d7f280eSIngo Weinhold	# dirs of <sources_or_objects>.
448*7d7f280eSIngo Weinhold	# NOTE: This rule must be invoked *after* the rule that builds the objects.
449*7d7f280eSIngo Weinhold
450*7d7f280eSIngo Weinhold	ObjectHdrs $(1) : [ PrivateHeaders $(2) ] ;
45152a38012Sejakowatz}
45252a38012Sejakowatz
45352a38012Sejakowatzrule UseHeaders
45452a38012Sejakowatz{
455*7d7f280eSIngo Weinhold	# UseHeaders <headers> ;
45652a38012Sejakowatz	#
45752a38012Sejakowatz	# Adds the C header dirs <headers> to the header search
458*7d7f280eSIngo Weinhold	# dirs of the subdirectory.
459*7d7f280eSIngo Weinhold	# NOTE: This rule must be invoked *before* the rule that builds the objects.
46052a38012Sejakowatz
461*7d7f280eSIngo Weinhold	local header ;
462*7d7f280eSIngo Weinhold	for header in $(1) {
46352a38012Sejakowatz		SubDirHdrs $(header) ;
46452a38012Sejakowatz	}
46552a38012Sejakowatz}
46652a38012Sejakowatz
46752a38012Sejakowatzrule UseCppUnitHeaders
46852a38012Sejakowatz{
469*7d7f280eSIngo Weinhold	SubDirHdrs [ FDirName $(OBOS_TOP) headers tools cppunit ] ;
47052a38012Sejakowatz}
47152a38012Sejakowatz
47252a38012Sejakowatzrule UseArchHeaders
47352a38012Sejakowatz{
474*7d7f280eSIngo Weinhold	# usage: UseArchHeaders <arch> ;
475*7d7f280eSIngo Weinhold	#
47652a38012Sejakowatz	# <arch> specifies the architecture (e.g. x86).
477*7d7f280eSIngo Weinhold	# NOTE: This rule must be invoked *before* the rule that builds the objects.
478*7d7f280eSIngo Weinhold
479*7d7f280eSIngo Weinhold	local headers = [ ArchHeaders $(1) ] ;
48052a38012Sejakowatz	local opt = -D$(OBOS_TARGET_DEFINE) ;
481c633961aSIngo Weinhold
48252a38012Sejakowatz	SubDirCcFlags $(opt)  ;
48352a38012Sejakowatz	SubDirC++Flags $(opt)  ;
484c633961aSIngo Weinhold	SubDirHdrs $(headers) ;
485c633961aSIngo Weinhold}
486c633961aSIngo Weinhold
487*7d7f280eSIngo Weinholdrule UseArchObjectHeaders
488*7d7f280eSIngo Weinhold{
489*7d7f280eSIngo Weinhold	# usage: UseArchObjectHeaders <sources_or_objects> : <arch> ;
490*7d7f280eSIngo Weinhold	#
491*7d7f280eSIngo Weinhold	# <arch> specifies the architecture (e.g. x86).
492*7d7f280eSIngo Weinhold	# <sources_or_objects> Source or object files.
493*7d7f280eSIngo Weinhold	# NOTE: This rule must be invoked *after* the rule that builds the objects.
494*7d7f280eSIngo Weinhold
495*7d7f280eSIngo Weinhold	local targets = $(1) ;
496*7d7f280eSIngo Weinhold	local headers = [ ArchHeaders $(2) ] ;
497*7d7f280eSIngo Weinhold	local opt = -D$(OBOS_TARGET_DEFINE) ;
498*7d7f280eSIngo Weinhold
499*7d7f280eSIngo Weinhold	ObjectCcFlags $(targets) : $(opt)  ;
500*7d7f280eSIngo Weinhold	ObjectC++Flags $(targets) : $(opt)  ;
501*7d7f280eSIngo Weinhold	ObjectHdrs $(targets) : $(headers) ;
50252a38012Sejakowatz}
50352a38012Sejakowatz
5043b9eae39SIngo Weinholdrule SplitPath
5053b9eae39SIngo Weinhold{
5063b9eae39SIngo Weinhold	# SplitPath <path> ;
5073b9eae39SIngo Weinhold	# Decomposes a path into its components.
5083b9eae39SIngo Weinhold	local path = $(1:G=) ;
5093b9eae39SIngo Weinhold	local components ;
5103b9eae39SIngo Weinhold	while $(path:D)
5113b9eae39SIngo Weinhold	{
5123b9eae39SIngo Weinhold		# Note: $(path:B) returns "." for "..", but $(path:D=) is fine.
5133b9eae39SIngo Weinhold		components = $(path:D=) $(components) ;
5143b9eae39SIngo Weinhold		path = $(path:D) ;
5153b9eae39SIngo Weinhold	}
5163b9eae39SIngo Weinhold	components = $(path) $(components) ;
5173b9eae39SIngo Weinhold	return $(components) ;
5183b9eae39SIngo Weinhold}
5193b9eae39SIngo Weinhold
5203b9eae39SIngo Weinholdrule SymLink
5213b9eae39SIngo Weinhold{
5223b9eae39SIngo Weinhold	# SymLink <target> : <source> ;
5233b9eae39SIngo Weinhold	# Links <target> to <source>.
5243b9eae39SIngo Weinhold	# <source> is the exact link contents. No binding is done.
5253b9eae39SIngo Weinhold	LINKCONTENTS on $(1) = $(2) ;
5263b9eae39SIngo Weinhold	SymLink1 $(1) ;
5273b9eae39SIngo Weinhold}
5283b9eae39SIngo Weinhold
5293b9eae39SIngo Weinholdactions SymLink1
5303b9eae39SIngo Weinhold{
5313b9eae39SIngo Weinhold	$(RM) $(1) && $(LN) -s $(LINKCONTENTS) $(1)
5323b9eae39SIngo Weinhold}
5333b9eae39SIngo Weinhold
53452a38012Sejakowatz#-------------------------------------------------------------------------------
53552a38012Sejakowatz# Low-level OBOS utility rules
53652a38012Sejakowatz#-------------------------------------------------------------------------------
53752a38012Sejakowatzrule SetupObjectsDir
53852a38012Sejakowatz{
53952a38012Sejakowatz	local rel_objectsdir;
54052a38012Sejakowatz
54152a38012Sejakowatz	# Copy subdir tokens except the first, as that will be "sources", and we
54252a38012Sejakowatz	# do not want to include that :)
54352a38012Sejakowatz	rel_objectsdir = [ FDirName $(SUBDIR_TOKENS[2-]) ] ;
54452a38012Sejakowatz	LOCATE_TARGET = [ FDirName $(OBOS_OBJECT_TARGET) $(rel_objectsdir) ] ;
54552a38012Sejakowatz}
54652a38012Sejakowatz
54752a38012Sejakowatz#-------------------------------------------------------------------------------
54852a38012Sejakowatz# Link rule/action are overwritten as they don't handle linking files who's name
54952a38012Sejakowatz# contain spaces very well. Also adds resources and version to executable.
55052a38012Sejakowatz#-------------------------------------------------------------------------------
55152a38012Sejakowatzrule Link
55252a38012Sejakowatz{
55352a38012Sejakowatz	# Note: RESFILES must be set before invocation.
55452a38012Sejakowatz	MODE on $(<) = $(EXEMODE) ;
55552a38012Sejakowatz	on $(1) XRes $(1) : $(RESFILES) ;
55652a38012Sejakowatz	SetVersion $(1) ;
55752a38012Sejakowatz	Chmod $(<) ;
55852a38012Sejakowatz	SetType $(1) ;
55952a38012Sejakowatz	MimeSet $(1) ;
56052a38012Sejakowatz}
56152a38012Sejakowatz
56252a38012Sejakowatzactions Link bind NEEDLIBS
56352a38012Sejakowatz{
56452a38012Sejakowatz	$(LINK) $(LINKFLAGS) -o "$(1)" $(UNDEFS) $(2) $(NEEDLIBS) $(LINKLIBS) ;
56552a38012Sejakowatz}
56652a38012Sejakowatz
56752a38012Sejakowatz# BeOS specific rules
56852a38012Sejakowatz
56952a38012Sejakowatzrule XRes
57052a38012Sejakowatz{
57152a38012Sejakowatz	# XRes <target> : <resource files>
57252a38012Sejakowatz	if $(2)
57352a38012Sejakowatz	{
57452a38012Sejakowatz		DEPENDS $(1) : $(2) ;
57552a38012Sejakowatz		XRes1 $(1) : $(2) ;
57652a38012Sejakowatz	}
57752a38012Sejakowatz}
57852a38012Sejakowatz
57952a38012Sejakowatzrule XRes1 { }
58052a38012Sejakowatz
58152a38012Sejakowatzrule SetVersion
58252a38012Sejakowatz{
58352a38012Sejakowatz	# SetVersion <target>
58452a38012Sejakowatz}
58552a38012Sejakowatz
58652a38012Sejakowatzrule SetType
58752a38012Sejakowatz{
58852a38012Sejakowatz	# SetType <target>
58952a38012Sejakowatz}
59052a38012Sejakowatz
59152a38012Sejakowatzrule MimeSet
59252a38012Sejakowatz{
59352a38012Sejakowatz	# SetType <target>
59452a38012Sejakowatz}
59552a38012Sejakowatz
59652a38012Sejakowatz
59752a38012Sejakowatzif $(OS) = BEOS
59852a38012Sejakowatz{
59952a38012Sejakowatz
60052a38012Sejakowatzactions XRes1
60152a38012Sejakowatz{
60252a38012Sejakowatz	xres -o "$(1)" $(2) ;
60352a38012Sejakowatz}
60452a38012Sejakowatz
60552a38012Sejakowatzactions SetVersion
60652a38012Sejakowatz{
60752a38012Sejakowatz	setversion "$(1)" -system $(OBOS_BUILD_VERSION) -short "$(OBOS_BUILD_DESCRIPTION)" ;
60852a38012Sejakowatz}
60952a38012Sejakowatz
61052a38012Sejakowatzactions SetType
61152a38012Sejakowatz{
61252a38012Sejakowatz	settype -t $(OBOS_TARGET_TYPE) "$(1)" ;
61352a38012Sejakowatz}
61452a38012Sejakowatz
61552a38012Sejakowatzactions MimeSet
61652a38012Sejakowatz{
61752a38012Sejakowatz	mimeset -f "$(1)" ;
61852a38012Sejakowatz}
61952a38012Sejakowatz
62052a38012Sejakowatz}	# if BEOS
62152a38012Sejakowatz
62252a38012Sejakowatz
62352a38012Sejakowatzrule assemble
62452a38012Sejakowatz{
62552a38012Sejakowatz	DEPENDS $(1) : $(2) ;
62652a38012Sejakowatz	Clean clean : $(1) ;
62752a38012Sejakowatz}
62852a38012Sejakowatz
62952a38012Sejakowatzactions assemble
63052a38012Sejakowatz{
63152a38012Sejakowatz$(CC) -c $(2) -O2 $(KERNEL_CCFLAGS) -o $(1) ;
63252a38012Sejakowatz}
63352a38012Sejakowatz
63452a38012Sejakowatz## Kernel stuff!
63552a38012Sejakowatz
63652a38012Sejakowatzrule SetupKernel
63752a38012Sejakowatz{
63852a38012Sejakowatz	# Usage SetupKernel <sources_or_objects> : <extra_cc_flags>;
63952a38012Sejakowatz
64052a38012Sejakowatz	local _objs = $(1:S=$(SUFOBJ)) ;
64152a38012Sejakowatz
64252a38012Sejakowatz	UsePublicHeaders kernel ;
643c633961aSIngo Weinhold	UsePublicHeaders [ FDirName os kernel ] ;
64452a38012Sejakowatz	UsePrivateHeaders kernel ;
64552a38012Sejakowatz	UseArchHeaders $(OBOS_ARCH) ;
64652a38012Sejakowatz
64752a38012Sejakowatz	SetupObjectsDir ;
64852a38012Sejakowatz
64952a38012Sejakowatz	CCFLAGS on $(_objs) = $(KERNEL_CCFLAGS) $(2) ;
65052a38012Sejakowatz	C++FLAGS on $(_objs) = $(KERNEL_CCFLAGS) $(2) ;
65152a38012Sejakowatz}
65252a38012Sejakowatz
65352a38012Sejakowatzrule KernelObjects
65452a38012Sejakowatz{
65552a38012Sejakowatz	SetupKernel $(1) : $(2) ;
65652a38012Sejakowatz
65752a38012Sejakowatz	Objects $(1) ;
65852a38012Sejakowatz}
65952a38012Sejakowatz
66052a38012Sejakowatzrule KernelLd
66152a38012Sejakowatz{
66252a38012Sejakowatz	# KernelLd <name> : <objs> : <linkerscript> : <args> : <gcc_off> ;
66352a38012Sejakowatz
66452a38012Sejakowatz	SetupKernel $(2) ;
66552a38012Sejakowatz	LINK on $(1) = ld ;
66652a38012Sejakowatz
66752a38012Sejakowatz	LINKFLAGS on $(1) = $(4) ;
66852a38012Sejakowatz	if $(3) { LINKFLAGS on $(1) += --script=$(3) ; }
66952a38012Sejakowatz
67052a38012Sejakowatz	# Remove any preset LINKLIBS
67152a38012Sejakowatz	LINKLIBS on $(1) =  ;
67252a38012Sejakowatz
67352a38012Sejakowatz	# Show that we depend on the libraries we need
67452a38012Sejakowatz	Clean clean : $(1) ;
67552a38012Sejakowatz	Depends all : $(1) ;
67652a38012Sejakowatz	Depends $(1) : $(2) ;
67752a38012Sejakowatz
67852a38012Sejakowatz	if $(6) {
67952a38012Sejakowatz		Depends $(OBOS_KERNEL_CONFIG) : $(1) ;
68052a38012Sejakowatz		for i in $(6) {
68152a38012Sejakowatz			SECTIONS on $(OBOS_KERNEL_CONFIG) += ":" $(i) elf32 [ FDirName $(LOCATE_TARGET) $(1) ] ;
68252a38012Sejakowatz		}
68352a38012Sejakowatz	}
68452a38012Sejakowatz
68552a38012Sejakowatz	MakeLocate $(1) : $(LOCATE_TARGET) ;
68652a38012Sejakowatz
68752a38012Sejakowatz	# Add libgcc.a - NB this should be detected not hard coded!
68852a38012Sejakowatz	if ! $(5) {
68952a38012Sejakowatz		LINKLIBS on $(1) += "-L $(GCC_PATH) -lgcc" ;
69052a38012Sejakowatz	}
69152a38012Sejakowatz}
69252a38012Sejakowatz
69352a38012Sejakowatzactions KernelLd
69452a38012Sejakowatz{
69552a38012Sejakowatz$(LINK) $(LINKFLAGS) -o $(1) $(2) $(LINKLIBS) ;
69652a38012Sejakowatz}
69752a38012Sejakowatz
69852a38012Sejakowatzrule KernelStaticLibrary
69952a38012Sejakowatz{
70052a38012Sejakowatz	# Usage KernelStaticLibrary <name> : <sources> : <extra cc flags>  ;
70152a38012Sejakowatz	# This is designed to take a set of sources and libraries and create
70252a38012Sejakowatz	# a file called lib<name>.a
70352a38012Sejakowatz
70452a38012Sejakowatz	SetupKernel $(2) : $(3) ;
70552a38012Sejakowatz
70652a38012Sejakowatz	MakeLocateObjects $(2) ;
70752a38012Sejakowatz	Library $(1) : $(2) ;
70852a38012Sejakowatz}
70952a38012Sejakowatz
71052a38012Sejakowatzrule KernelStaticLibraryObjects
71152a38012Sejakowatz{
71252a38012Sejakowatz	# Usage KernelStaticLibrary <name> : <sources> ;
71352a38012Sejakowatz	# This is designed to take a set of sources and libraries and create
71452a38012Sejakowatz	# a file called <name>
71552a38012Sejakowatz
71652a38012Sejakowatz	SetupKernel $(2) ;
71752a38012Sejakowatz
71852a38012Sejakowatz	# Show that we depend on the libraries we need
71952a38012Sejakowatz	Clean clean : $(1) ;
72052a38012Sejakowatz	Depends all : $(1) ;
72152a38012Sejakowatz	Depends $(1) : $(2) ;
72252a38012Sejakowatz
72352a38012Sejakowatz	MakeLocate $(1) : $(LOCATE_TARGET) ;
72452a38012Sejakowatz}
72552a38012Sejakowatz
72652a38012Sejakowatzactions KernelStaticLibraryObjects
72752a38012Sejakowatz{
72852a38012Sejakowatzar -r $(1) $(2) ;
72952a38012Sejakowatz}
73052a38012Sejakowatz
73152a38012Sejakowatzrule SystemMain
73252a38012Sejakowatz{
73352a38012Sejakowatz	# Usage SystemMain <target> : <sources> : <rqd_by> ;
73452a38012Sejakowatz	SetupObjectsDir ;
73552a38012Sejakowatz
73652a38012Sejakowatz	LINKLIBS = ;
73752a38012Sejakowatz
73852a38012Sejakowatz	# This allows us to preset certain commands we use
73952a38012Sejakowatz	# for building.
74052a38012Sejakowatz	if $(3) {
74152a38012Sejakowatz		for obj in $(3) {
74252a38012Sejakowatz			BUILD_CMD on $(obj) = [ FDirName $(LOCATE_TARGET) $(1) ] ;
74352a38012Sejakowatz		}
74452a38012Sejakowatz	}
74552a38012Sejakowatz
74652a38012Sejakowatz	Main $(1) : $(2) ;
74752a38012Sejakowatz}
74852a38012Sejakowatz
74952a38012Sejakowatzrule KernelConfigSection
75052a38012Sejakowatz{
75152a38012Sejakowatz	# KernelConfigSection <section> : <type> : <file>  ;
75252a38012Sejakowatz	SECTIONS on $(OBOS_KERNEL_CONFIG) += ":" $(1) $(2) $(3) ;
75352a38012Sejakowatz}
75452a38012Sejakowatz
75552a38012Sejakowatzrule WriteKernelConfig
75652a38012Sejakowatz{
75752a38012Sejakowatz	# usage: WriteKernelConfig <target> ;
75852a38012Sejakowatz
75952a38012Sejakowatz	Depends files : $(1) ;
76052a38012Sejakowatz
76152a38012Sejakowatz	LOCATE on $(1) = $(LOCATE_TARGET) ;
76252a38012Sejakowatz
76352a38012Sejakowatz	MakeLocate $(1) : $(LOCATE_TARGET) ;
76452a38012Sejakowatz
76552a38012Sejakowatz	Clean clean : $(1) ;
76652a38012Sejakowatz}
76752a38012Sejakowatz
76852a38012Sejakowatzactions WriteKernelConfig
76952a38012Sejakowatz{
77052a38012Sejakowatz	target=$(1)
77152a38012Sejakowatz	echo "# OpenBeOS Kernel Config File" > $target
77252a38012Sejakowatz	echo "# Automatically generated - do not edit!" >> $target
77352a38012Sejakowatz	issection="0"
77452a38012Sejakowatz	section=
77552a38012Sejakowatz	for i in "$(SECTIONS)" ; do
77652a38012Sejakowatz		if [ $issection == 1  ]; then
77752a38012Sejakowatz			section=$i
77852a38012Sejakowatz			issection=2
77952a38012Sejakowatz			echo "["$section"]" >> $target
78052a38012Sejakowatz		elif [ $issection == 2 ]; then
78152a38012Sejakowatz			type=$i
78252a38012Sejakowatz			issection=3
78352a38012Sejakowatz			echo "type="$type >> $target
78452a38012Sejakowatz		else
78552a38012Sejakowatz			if [ $i == ":" ]; then
78652a38012Sejakowatz				issection=1
78752a38012Sejakowatz				echo "" >> $target
78852a38012Sejakowatz			else
78952a38012Sejakowatz				file=$i
79052a38012Sejakowatz				case $file in
79152a38012Sejakowatz					/*) ;;
79252a38012Sejakowatz					*) file=`pwd`/$file;;
79352a38012Sejakowatz				esac
79452a38012Sejakowatz				echo "file="$file >> $target
79552a38012Sejakowatz			fi
79652a38012Sejakowatz		fi
79752a38012Sejakowatz	done
79852a38012Sejakowatz}
79952a38012Sejakowatz
80052a38012Sejakowatzrule BuildKernel
80152a38012Sejakowatz{
80252a38012Sejakowatz	# Usage BuildKernel <target> : <config_file> ;
80352a38012Sejakowatz
80452a38012Sejakowatz	Depends all : $(1) ;
80552a38012Sejakowatz	Depends $(1) : $(2) ;
80652a38012Sejakowatz	Clean clean : $(1) ;
80752a38012Sejakowatz
80852a38012Sejakowatz	MakeLocate $(1) : $(LOCATE_TARGET) ;
80952a38012Sejakowatz}
81052a38012Sejakowatz
81152a38012Sejakowatzactions BuildKernel
81252a38012Sejakowatz{
81352a38012Sejakowatz	$(BUILD_CMD) --strip-debug --strip-binary strip $(2) -o $(1) ;
81452a38012Sejakowatz	echo ""
81552a38012Sejakowatz	echo "Kernel linked!"
81652a38012Sejakowatz	echo ""
81752a38012Sejakowatz}
81852a38012Sejakowatz
81952a38012Sejakowatz# At present I don't bother moving the final location for
82052a38012Sejakowatz# the floppy image as it makes copying it onto a floppy easier if it's
82152a38012Sejakowatz# where you did the build. This is easy enough changed.
82252a38012Sejakowatzrule KernelFloppyImage
82352a38012Sejakowatz{
82452a38012Sejakowatz	# Usage KernelFloppyImage <target> : <kernel> : <bootblock> ;
82552a38012Sejakowatz
82652a38012Sejakowatz	Depends all : $(1) ;
82752a38012Sejakowatz	Depends $(1) : $(2) ;
82852a38012Sejakowatz	Clean clean : $(1) ;
82952a38012Sejakowatz
83052a38012Sejakowatz	BOOT_BLOCK on $(1) = $(3) ;
83152a38012Sejakowatz}
83252a38012Sejakowatz
83352a38012Sejakowatz# This may be a bit verbose, but I think it's useful to show what's
83452a38012Sejakowatz# going on, at least in this early stage of development.
83552a38012Sejakowatzactions KernelFloppyImage
83652a38012Sejakowatz{
83752a38012Sejakowatz	$(BUILD_CMD) $(BOOT_BLOCK) $(2) $(1) ;
83852a38012Sejakowatz	echo ""
83952a38012Sejakowatz	echo "*************************************************"
84052a38012Sejakowatz	echo "*         Kernel build completed!               *"
84152a38012Sejakowatz	echo "*    Boot image for a 1.44M floppy created      *"
84252a38012Sejakowatz	echo "*************************************************"
84352a38012Sejakowatz	echo ""
84452a38012Sejakowatz	echo "Floppy image is $(OBOS_FLOPPY)"
84552a38012Sejakowatz	echo "The following command will write it to a floppy on BeOS"
84652a38012Sejakowatz	echo "  dd if=$(OBOS_FLOPPY) of=/dev/disk/floppy/raw bs=18k"
84752a38012Sejakowatz	echo ""
84852a38012Sejakowatz}
84952a38012Sejakowatz
85052a38012Sejakowatz
851