From a0a9d225d3e48f81429a769b8c0ed5c961bf1516 Mon Sep 17 00:00:00 2001 From: Ingo Weinhold Date: Wed, 2 Apr 2008 20:29:43 +0000 Subject: [PATCH] Added a new fancy build system feature called "build profiles". Especially people building various kinds of images with different settings may want to have a look at the respective section in the UserBuildConfig.ReadMe. git-svn-id: file:///srv/svn/repos/haiku/haiku/trunk@24757 a95241bf-73f2-0310-859d-f6bbb57e9c96 --- Jamrules | 11 +++ build/jam/BuildSetup | 74 ++++++++++++------- build/jam/HaikuImage | 14 ++-- build/jam/MiscRules | 118 +++++++++++++++++++++++++++++++ build/jam/UserBuildConfig.ReadMe | 72 +++++++++++++++++++ 5 files changed, 258 insertions(+), 31 deletions(-) diff --git a/Jamrules b/Jamrules index 417dd199b4..5497dfc023 100644 --- a/Jamrules +++ b/Jamrules @@ -45,4 +45,15 @@ include [ FDirName $(HAIKU_BUILD_RULES_DIR) BuildSetup ] ; } } +# If a build profile was specified on the command line, now is the time to +# check whether it is unknown or one of the default profiles. +if $(HAIKU_BUILD_PROFILE) && ! $(HAIKU_BUILD_PROFILE_DEFINED) { + # define the obvious default profiles + if $(HAIKU_BUILD_PROFILE) in image vmware-image install { + DefineBuildProfile $(HAIKU_BUILD_PROFILE) : $(HAIKU_BUILD_PROFILE) ; + } else { + Exit "Build profile" $(HAIKU_BUILD_PROFILE) "not defined." ; + } +} + PrepareConfigVariables ; diff --git a/build/jam/BuildSetup b/build/jam/BuildSetup index 1f45a204f0..4fa705d8c0 100644 --- a/build/jam/BuildSetup +++ b/build/jam/BuildSetup @@ -43,37 +43,63 @@ HAIKU_CONTAINER_GRIST on $(HAIKU_CD_BOOT_IMAGE_CONTAINER_NAME) = CDBootImage ; HAIKU_INSTALL_TARGETS_VAR on $(HAIKU_CD_BOOT_IMAGE_CONTAINER_NAME) = HAIKU_CD_BOOT_IMAGE_INSTALL_TARGETS ; +# Haiku image/install defaults +HAIKU_DEFAULT_IMAGE_NAME = haiku.image ; +HAIKU_DEFAULT_IMAGE_DIR = $(HAIKU_OUTPUT_DIR) ; +HAIKU_DEFAULT_VMWARE_IMAGE_NAME = haiku.vmdk ; +HAIKU_DEFAULT_INSTALL_DIR = /Haiku ; +HAIKU_DEFAULT_IMAGE_SIZE ?= 100 ; # 100 MB + + # analyze an optionally replace jam's target parameters HAIKU_ORIGINAL_JAM_TARGETS = $(JAM_TARGETS) ; +HAIKU_BUILD_PROFILE = ; if $(JAM_TARGETS) { - # If the target to be built is "all" (i.e. the default) and we're in the - # output directory, the root directory of the build system, or in "src/", we - # change the target to be built to "haiku-image". - if $(JAM_TARGETS) = all { - if ! $(INVOCATION_SUBDIR) || $(INVOCATION_SUBDIR) = src { - JAM_TARGETS = haiku-image ; + switch $(JAM_TARGETS[1]) { + # If the target to be built is "all" (i.e. the default) and we're in + # the output directory, the root directory of the build system, or + # in "src/", we change the target to be built to "haiku-image". + case all : { + if ! $(INVOCATION_SUBDIR) || $(INVOCATION_SUBDIR) = src { + JAM_TARGETS = haiku-image ; + } } - # The "run" target allows for running arbitrary command lines containing - # build system targets, which are built and replaced accordingly. - } else if $(JAM_TARGETS[1]) = run && $(JAM_TARGETS[2]) { - local run = [ RunCommandLine $(JAM_TARGETS[2-]) ] ; - JAM_TARGETS = $(run) ; + # The "run" target allows for running arbitrary command lines containing + # build system targets, which are built and replaced accordingly. + case run : { + if $(JAM_TARGETS[2]) { + JAM_TARGETS = [ RunCommandLine $(JAM_TARGETS[2-]) ] ; + } else { + Exit "\"jam run\" requires parameters!" ; + } + } - # "update-image", "update-vmware-image", and "update-install" targets allow - # for updating only specific targets in the image/installation dir. - } else if $(JAM_TARGETS[1]) = update-image - || $(JAM_TARGETS[1]) = update-vmware-image - || $(JAM_TARGETS[1]) = update-install { - SetUpdateHaikuImageOnly 1 ; - HAIKU_INCLUDE_IN_IMAGE on $(JAM_TARGETS[2-]) = 1 ; + # A target starting with "@" is a build profile. + case @* : { + HAIKU_BUILD_PROFILE = [ Match "@(.*)" : $(JAM_TARGETS[1]) ] ; + HAIKU_BUILD_PROFILE_ACTION = $(JAM_TARGETS[2]:E=build) ; + HAIKU_BUILD_PROFILE_PARAMETERS = $(JAM_TARGETS[3-]) ; + HAIKU_BUILD_PROFILE_DEFINED = ; + } - if $(JAM_TARGETS[1]) = update-image { - JAM_TARGETS = haiku-image ; - } else if $(JAM_TARGETS[1]) = update-vmware-image { - JAM_TARGETS = haiku-vmware-image ; - } else { - JAM_TARGETS = install-haiku ; + case * : { + # "update-image", "update-vmware-image", and "update-install" + # targets allow for updating only specific targets in the + # image/installation dir. + if $(JAM_TARGETS[1]) in update-image update-vmware-image + update-install { + SetUpdateHaikuImageOnly 1 ; + HAIKU_INCLUDE_IN_IMAGE on $(JAM_TARGETS[2-]) = 1 ; + + if $(JAM_TARGETS[1]) = update-image { + JAM_TARGETS = haiku-image ; + } else if $(JAM_TARGETS[1]) = update-vmware-image { + JAM_TARGETS = haiku-vmware-image ; + } else { + JAM_TARGETS = install-haiku ; + } + } } } } diff --git a/build/jam/HaikuImage b/build/jam/HaikuImage index 9f99894044..2b393023b3 100644 --- a/build/jam/HaikuImage +++ b/build/jam/HaikuImage @@ -495,14 +495,14 @@ AddGroupToHaikuImage users : 100 : ; # Set image name and directory defaults and locate the image. -HAIKU_IMAGE_NAME ?= haiku.image ; -HAIKU_IMAGE_DIR ?= $(HAIKU_OUTPUT_DIR) ; -HAIKU_IMAGE ?= $(HAIKU_IMAGE_NAME) ; -HAIKU_IMAGE_SIZE ?= 100 ; # 100 MB +HAIKU_IMAGE_NAME ?= $(HAIKU_DEFAULT_IMAGE_NAME) ; +HAIKU_IMAGE_DIR ?= $(HAIKU_DEFAULT_IMAGE_DIR) ; +HAIKU_IMAGE = $(HAIKU_IMAGE_NAME) ; +HAIKU_IMAGE_SIZE ?= $(HAIKU_DEFAULT_IMAGE_SIZE) ; # 100 MB MakeLocate $(HAIKU_IMAGE) : $(HAIKU_IMAGE_DIR) ; # Set the default installation directory. -HAIKU_INSTALL_DIR ?= /Haiku ; +HAIKU_INSTALL_DIR ?= $(HAIKU_DEFAULT_INSTALL_DIR) ; # the pseudo target all image contents is attached to NotFile $(HAIKU_IMAGE_CONTAINER_NAME) ; @@ -590,8 +590,8 @@ _BuildHaikuImage install-haiku : 0 ; # build the VMware image -HAIKU_VMWARE_IMAGE_NAME ?= haiku.vmdk ; -HAIKU_VMWARE_IMAGE ?= $(HAIKU_VMWARE_IMAGE_NAME) ; +HAIKU_VMWARE_IMAGE_NAME ?= $(HAIKU_DEFAULT_VMWARE_IMAGE_NAME) ; +HAIKU_VMWARE_IMAGE = $(HAIKU_VMWARE_IMAGE_NAME) ; MakeLocate $(HAIKU_VMWARE_IMAGE) : $(HAIKU_IMAGE_DIR) ; _BuildHaikuImage $(HAIKU_VMWARE_IMAGE) : true : true ; diff --git a/build/jam/MiscRules b/build/jam/MiscRules index 5c1645b64c..1d9219ab3a 100644 --- a/build/jam/MiscRules +++ b/build/jam/MiscRules @@ -227,3 +227,121 @@ actions RunCommandLine1 { $(COMMAND_LINE) } + +#pragma mark - DefineBuildProfile + + +rule DefineBuildProfile name : type : path { + # DefineBuildProfile : [ : ] + # + # Makes a build profile known. Build profiles can be used to define + # different sets of settings for Haiku images/installations. For each + # profile the default actions "build", "update", and "mount" (the latter + # only for disks or image types) will be available (i.e. can be specified + # as second parameter on the jam command line). They will build an image + # or installation, update only given targets, respectively just mount the + # image or disk using the bfs_shell. + # + # - The name of the build profile. + # - The type of the build profile. Must be one of "image" (plain + # disk image), "vmware-image" (VMware disk image), "disk" + # (actual partition or hard disk device), "install" (installation + # in a directory), or "custom" (user-defined). + # - The path associated with the profile. Depending on the profile + # type, this is the path to the disk image/VMware image, hard + # disk/partition device, or the installation directory. If the + # parameter is omitted, the value of the HAIKU[_VMWARE]_IMAGE_NAME, + # HAIKU_IMAGE_DIR, respectively HAIKU_INSTALL_DIR or their default + # values will be used instead. + + if ! $(HAIKU_BUILD_PROFILE) || $(HAIKU_BUILD_PROFILE) != $(name) { + return ; + } + + HAIKU_BUILD_PROFILE_DEFINED = 1 ; + + # split path into directory path and name + local targetDir = $(path:D) ; + local targetName = $(path:BS) ; + + # Jam's path splitting produces an empty string, if a component doesn't + # exist. That's a little unhandy for checks. + if $(targetDir) = "" { + targetDir = ; + } + if $(targetName) = "" { + targetName = ; + } + + targetDir ?= $(HAIKU_IMAGE_DIR) ; + targetDir ?= $(HAIKU_DEFAULT_IMAGE_DIR) ; + + # "disk" is "image" with HAIKU_DONT_CLEAR_IMAGE + if $(type) = "disk" { + type = "image" ; + HAIKU_DONT_CLEAR_IMAGE = 1 ; + } + + local buildTarget ; + local startOffset ; + + switch $(type) { + case "image" : { + targetName ?= $(HAIKU_IMAGE_NAME) ; + targetName ?= $(HAIKU_DEFAULT_IMAGE_NAME) ; + HAIKU_IMAGE_DIR = $(targetDir) ; + HAIKU_IMAGE_NAME = $(targetName) ; + buildTarget = haiku-image ; + } + + case "vmware-image" : { + targetName ?= $(HAIKU_VMWARE_IMAGE_NAME) ; + targetName ?= $(HAIKU_DEFAULT_VMWARE_IMAGE_NAME) ; + HAIKU_IMAGE_DIR = $(targetDir) ; + HAIKU_VMWARE_IMAGE_NAME = $(targetName) ; + buildTarget = haiku-vmware-image ; + startOffset = --start-offset 65536 ; + } + + case "install" : { + path ?= $(HAIKU_INSTALL_DIR) ; + path ?= $(HAIKU_DEFAULT_INSTALL_DIR) ; + HAIKU_INSTALL_DIR = $(path) ; + buildTarget = install-haiku ; + } + + case "custom" : { + # user-defined -- don't do anything + return 1 ; + } + + case * : { + Exit "Unsupported build profile type: " $(type) ; + } + } + + switch $(HAIKU_BUILD_PROFILE_ACTION) { + case "build" : { + JAM_TARGETS = $(buildTarget) ; + } + + case "update" : { + JAM_TARGETS = $(buildTarget) ; + SetUpdateHaikuImageOnly 1 ; + HAIKU_INCLUDE_IN_IMAGE on $(HAIKU_BUILD_PROFILE_PARAMETERS) = 1 ; + } + + case "mount" : { + if $(type) = "install" { + Exit "Build action \"mount\" not supported for profile type" + "\"install\"." ; + } + + local commandLine = :bfs_shell $(startOffset) + \"$(targetName:D=$(targetDir))\" ; + JAM_TARGETS = [ RunCommandLine $(commandLine) ] ; + } + } + + return 1 ; +} diff --git a/build/jam/UserBuildConfig.ReadMe b/build/jam/UserBuildConfig.ReadMe index d422bcae73..fd3bc02c46 100644 --- a/build/jam/UserBuildConfig.ReadMe +++ b/build/jam/UserBuildConfig.ReadMe @@ -147,6 +147,78 @@ AddUserToHaikuImage walter : 1000 : 100 : /boot/home : /bin/bash AddGroupToHaikuImage party : 101 : baron walter ; +# Build Profiles + +# A build profile is a named set of settings for building a Haiku image or +# installation. The following lines define five different build profiles: +# disk - Installation on device /dev/sda57. All optional packages will be +# included. Profile type "disk" implies "HAIKU_DONT_CLEAR_IMAGE = 1". +# qemu - A plain 200 MB disk image (type "image") named "haiku-qemu.image". +# Since only the image name is given, the default location will be +# chosen for the image, unless HAIKU_IMAGE_DIR has been set +# beforehand. +# vmware - A 400 MB VMware image (type "vmware-image"). It will not be zeroed, +# if not necessary. The optional packages Development and Pe will be +# installed. No image name or path is given, so the defaults +# ("haiku.vmdk" in the generated directory) will be used, unless the +# respective variables are set. +# crash - Similar to the vmware profile, but created at a specific location +# and 1 GB size. Furthermore a "crash-tests" directory will be copied +# to the image. +# install - Installation in directory "/Haiku2" (type "install"). + +DefineBuildProfile disk : disk : "/dev/sda57" ; +DefineBuildProfile qemu : image : "haiku-qemu.image" ; +DefineBuildProfile vmware : vmware-image ; +DefineBuildProfile crash : vmware-image + : "/home/foobar/vmware/Virtual Machines/CrashOMatic/CrashOMatic.vmdk" ; +DefineBuildProfile install : install : /Haiku2 ; + +switch $(HAIKU_BUILD_PROFILE) { + case "disk" : { + HAIKU_ADD_ALL_OPTIONAL_PACKAGES = 1 ; + } + + case "qemu" : { + HAIKU_IMAGE_SIZE = 200 ; + } + + case "vmware" : { + HAIKU_IMAGE_SIZE = 400 ; + HAIKU_DONT_CLEAR_IMAGE = 1 ; + AddOptionalHaikuImagePackages Development Pe ; + } + + case "crash" : { + HAIKU_IMAGE_SIZE = 1024 ; + HAIKU_DONT_CLEAR_IMAGE = 1 ; + AddOptionalHaikuImagePackages Development Pe ; + CopyDirectoryToHaikuImage home Desktop : $(HAIKU_TOP)/../crash-tests ; + } +} + +# By specifying the build profile name as first (non-option) parameter on the +# jam command line prefixed by an "@" character, the profile will be selected. +# The second parameter specifies the action to be performed, further optional +# parameters may follow. Jam command line examples: +# +# jam -q @disk build +# -> Equivalent to running "jam -q haiku-image" with the settings for the +# "disk" profile. "build" is the default action, so it could even be +# omitted. +# jam -q @vmware update kernel +# -> Equivalent to running "jam -q update-vmware-image kernel" with the +# settings for the "vmware" profile. +# jam -q @crash mount +# -> Enters the bfs_shell mounting the image specified by the "crash" profile. +# +# Note, that the build system will automatically define the build profiles +# "image", "vmware-image", and "install", unless they are already defined in +# the UserBuildConfig. They correspond to the respective build profile types +# and use the values of the variables HAIKU[_VMWARE]_IMAGE_NAME, +# HAIKU_IMAGE_DIR, HAIKU_INSTALL_DIR, respectively their default values. +# "jam -q @image" will therefore be equivalent to "jam -q haiku-image". + # Creating Sourceable Shell Scripts