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