# This file defines what ends up on the Haiku image (respectively in the Haiku
# installation directory) and it executes the rules building the image
# (respectively installing the files in the installation directory).

# create directories that will remain empty
AddDirectoryToHaikuImage common bin ;
AddDirectoryToHaikuImage common include ;
AddDirectoryToHaikuImage common lib ;
AddDirectoryToHaikuImage home Desktop ;
AddDirectoryToHaikuImage home config bin ;
AddDirectoryToHaikuImage home config lib ;
AddDirectoryToHaikuImage home mail ;
AddDirectoryToHaikuImage var empty ;
AddDirectoryToHaikuImage var log ;
AddDirectoryToHaikuImage var tmp ;

local X86_ONLY = ;
local PPC_ONLY = ;
local M68K_ONLY = ;
if $(TARGET_ARCH) = x86 {
	X86_ONLY = "" ;
} else if $(TARGET_ARCH) = ppc {
	PPC_ONLY = "" ;
} else if $(TARGET_ARCH) = m68k {
	M68K_ONLY = "" ;
}

local GPL_ONLY = ;
if $(INCLUDE_GPL_ADDONS) = 1 {
	GPL_ONLY = "" ;
}

BEOS_BIN = "[" addattr alert arp base64 basename bc beep bootman bzip2
	cal cat catattr checkfs chgrp chmod chop chown chroot cksum clear
	clockconfig cmp comm compress copyattr $(X86_ONLY)CortexAddOnHost cp
	csplit ctags cut date dc dd desklink df diff diff3 dircolors dirname
	draggers driveinfo dstcheck du echo eject env error expand expr
	factor false fdinfo ffm find finddir fmt fold fortune frcode ftp ftpd
	funzip fwcontrol
	gawk $(X86_ONLY)gdb grep groups gzip gzexe hd head hey hostname
	id ident ideinfo idestatus ifconfig <bin>install installsound iroster
	isvolume
	join
	keymap kill less lessecho lesskey link listarea listattr listimage listdev
	listport listres listsem ln locate logger login logname ls lsindex
	make makebootable md5sum merge mimeset mkdos mkdir mkfifo mkfs mkindex
	modifiers mount mount_nfs mountvolume mv
	nc netstat nl nohup od open passwd paste
	patch pathchk pc ping play playfile playsound playwav pr prio printenv
	printf profile ps ptx pwd query quit rc readlink release renice rescan rlog
	rm rmattr rmindex rmdir roster route
	safemode screen_blanker screenmode sed setdecor settype setversion setvolume
	seq sh sha1sum shar shred shuf shutdown sleep sort split stat strace stty su
	sum sync sysinfo
	tac tail tar tcpdump tcptester tee telnet telnetd test top touch tput tr
	traceroute translate true tsort tty
	uname unchop unexpand unmount uniq unrar unshar unzip unzipsfx <bin>updatedb
	uptime urlwrapper usb_dev_info useradd uudecode uuencode
	vdir version vim vmstat waitfor wc wget whoami xargs xres yes
	zdiff zforce zgrep zip zipcloak <bin>zipgrep zipnote zipsplit zmore znew
;

BEOS_APPS = AboutSystem ActivityMonitor CodyCam DeskCalc DiskProbe DiskUsage
	DriveSetup CDPlayer Expander Icon-O-Matic Installer LaunchBox Magnify Mail
	MediaPlayer MidiPlayer NetworkStatus PackageInstaller People PowerStatus
	ProcessController Screenshot ShowImage SoundRecorder StyledEdit Terminal
	TextSearch TV Workspaces
;
BEOS_PREFERENCES = Appearance Backgrounds DataTranslations E-mail
	FileTypes Fonts Keyboard Keymap Media Menu Mouse Network Printers Screen
	ScreenSaver Sounds Time Touchpad VirtualMemory
;
BEOS_DEMOS = BSnow Chart Clock $(X86_ONLY)Cortex FontDemo
	$(X86_ONLY)GLDirectMode $(X86_ONLY)GLTeapot Mandelbrot Pairs
	Playground Pulse Sudoku Gradients
;
BEOS_SYSTEM_LIBS = libbe.so $(HAIKU_LIBSTDC++) libmedia.so libtracker.so
	libtranslation.so libbnetapi.so libnetwork.so libdebug.so libbsd.so
	libmail.so libtextencoding.so libz.so libfreetype.so libpng.so libmidi.so
	libmidi2.so libdevice.so libgame.so libscreensaver.so <revisioned>libroot.so
	$(X86_ONLY)libGL.so libfluidsynth.so liblpsolve55.so liblinprog.so libalm.so
	libilmimf.so libiconv.so
;
BEOS_SYSTEM_SERVERS = registrar debug_server syslog_daemon media_server
	net_server media_addon_server input_server app_server fake_app_server
	midi_server print_server mail_daemon
;

BEOS_NETWORK_DEVICES = ethernet loopback ;
BEOS_NETWORK_DATALINK_PROTOCOLS = ethernet_frame <module>arp loopback_frame
	ipv4_datagram ;
#BEOS_NETWORK_PPP = ipcp modem pap pppoe ;
BEOS_NETWORK_PROTOCOLS = ipv4 tcp udp icmp unix ;

BEOS_ADD_ONS_ACCELERANTS = $(X86_ONLY)radeon.accelerant $(X86_ONLY)nvidia.accelerant
	$(X86_ONLY)matrox.accelerant $(X86_ONLY)neomagic.accelerant
	$(X86_ONLY)intel_extreme.accelerant $(X86_ONLY)s3.accelerant $(X86_ONLY)vesa.accelerant
	#$(X86_ONLY)via.accelerant
	#$(X86_ONLY)vmware.accelerant
;
BEOS_ADD_ONS_TRANSLATORS = BMPTranslator EXRTranslator GIFTranslator JPEGTranslator
	JPEG2000Translator PCXTranslator PNGTranslator PPMTranslator RAWTranslator
	RTF-Translator SGITranslator STXTTranslator TGATranslator
	TIFFTranslator WonderBrushTranslator
;
BEOS_ADD_ONS_MEDIA = cortex_audioadapter.media_addon cortex_flanger.media_addon
	dvb.media_addon
	hmulti_audio.media_addon
	mixer.media_addon
	opensound.media_addon
	tone_producer_demo.media_addon
	usb_webcam.media_addon
	video_producer_demo.media_addon
	video_window_demo.media_addon
	firewire_dv.media_addon
	#legacy.media_addon
;
BEOS_ADD_ONS_MEDIA_PLUGINS = $(GPL_ONLY)ac3_decoder
	aiff_reader au_reader $(X86_ONLY)avcodec avi_reader
	matroska mov_reader
	mp3_decoder mp3_reader
	mp4_reader musepack
	ogg raw_decoder speex
	# theora
	vorbis wav_reader
;
BEOS_ADD_ONS_PRINT = Canon\ LIPS3\ Compatible Canon\ LIPS4\ Compatible
	PCL5\ Compatible PCL6\ Compatible PDF\ Writer PS\ Compatible Preview
;
BEOS_ADD_ONS_PRINT_TRANSPORT = HP\ JetDirect IPP LPR Parallel\ Port
	Print\ To\ File Serial\ Port USB\ Port
;
BEOS_ADD_ONS_SCREENSAVERS = Haiku IFS Spider Message ;
BEOS_ADD_ONS_DRIVERS_AUDIO = auich auvia echo3g emuxki ; #hda
BEOS_ADD_ONS_DRIVERS_AUDIO_OLD = ; #cmedia sis7018 usb_audio ;
BEOS_ADD_ONS_DRIVERS_GRAPHICS = $(X86_ONLY)radeon $(X86_ONLY)nvidia
	$(X86_ONLY)neomagic $(X86_ONLY)matrox $(X86_ONLY)intel_extreme
	$(X86_ONLY)s3 $(X86_ONLY)vesa #$(X86_ONLY)via #$(X86_ONLY)vmware
;
BEOS_ADD_ONS_DRIVERS_MIDI = emuxki ;
BEOS_ADD_ONS_DRIVERS_NET = $(X86_ONLY)3com $(X86_ONLY)broadcom440x
	$(X86_ONLY)broadcom570x etherpci $(X86_ONLY)ipro1000
	pegasus $(X86_ONLY)rtl8139 rtl8169 $(X86_ONLY)rtl81xx sis900
	$(X86_ONLY)via_rhine wb840 $(X86_ONLY)ipro100 $(X86_ONLY)nforce
	#vlance
	$(X86_ONLY)marvell_yukon $(X86_ONLY)syskonnect
	$(X86_ONLY)attansic_l2 $(X86_ONLY)ar81xx usb_ecm
;
#BEOS_ADD_ONS_DRIVERS_ACPI = $(X86_ONLY)acpi_button ;
BEOS_ADD_ONS_BUS_MANAGERS = pci $(X86_ONLY)ps2 $(X86_ONLY)isa ide scsi
	config_manager agp_gart usb firewire $(X86_ONLY)acpi
;
BEOS_ADD_ONS_FILE_SYSTEMS = bfs cdda ext2 fat iso9660 nfs $(GPL_ONLY)reiserfs ;
#googlefs $(GPL_ONLY)ntfs ;


# modules
AddFilesToHaikuImage beos system add-ons kernel bus_managers
	: $(BEOS_ADD_ONS_BUS_MANAGERS) ;
AddFilesToHaikuImage beos system add-ons kernel busses agp_gart
	: $(X86_ONLY)<agp_gart>intel ;
AddFilesToHaikuImage beos system add-ons kernel busses ide
	: generic_ide_pci it8211 legacy_sata silicon_image_3112 $(X86_ONLY)ide_isa ;
AddFilesToHaikuImage beos system add-ons kernel busses scsi
	: ahci ;
AddFilesToHaikuImage beos system add-ons kernel busses usb
	: <usb>uhci <usb>ohci <usb>ehci ;
AddFilesToHaikuImage beos system add-ons kernel console : vga_text ;
AddFilesToHaikuImage beos system add-ons kernel debugger
	: $(X86_ONLY)<kdebug>disasm <kdebug>hangman <kdebug>invalidate_on_exit ;
AddFilesToHaikuImage beos system add-ons kernel file_systems
	: $(BEOS_ADD_ONS_FILE_SYSTEMS) ;
AddFilesToHaikuImage beos system add-ons kernel generic
	: dpc ide_adapter locked_pool mpu401 scsi_periph ;
AddFilesToHaikuImage beos system add-ons kernel partitioning_systems
	: intel session ;
AddFilesToHaikuImage beos system add-ons kernel interrupt_controllers
	: $(PPC_ONLY)openpic ;

if $(TARGET_ARCH) = x86 {
	AddFilesToHaikuImage beos system add-ons kernel cpu : generic_x86 ;

	if $(HAIKU_GCC_VERSION[1]) = 2 {
		AddFilesToHaikuImage beos system add-ons kernel debugger demangle :
			<kdebug>gcc2 ;
	}
}

# drivers
AddNewDriversToHaikuImage disk scsi	: scsi_cd scsi_disk ;

# legacy drivers
AddDriversToHaikuImage				: console dprintf $(X86_ONLY)keyboard null
									  random <driver>tty zero ;
AddDriversToHaikuImage audio hmulti	: $(BEOS_ADD_ONS_DRIVERS_AUDIO) ;
AddDriversToHaikuImage audio old	: $(BEOS_ADD_ONS_DRIVERS_AUDIO_OLD) ;
AddDriversToHaikuImage midi			: $(BEOS_ADD_ONS_DRIVERS_MIDI) ;
AddDriversToHaikuImage bus			: usb_raw fw_raw ;
AddDriversToHaikuImage disk floppy	: $(X86_ONLY)pc_floppy ;
AddDriversToHaikuImage disk usb		: usb_disk ;
AddDriversToHaikuImage disk virtual	: nbd ;
AddDriversToHaikuImage dvb			: cx23882 ;
AddDriversToHaikuImage graphics		: $(BEOS_ADD_ONS_DRIVERS_GRAPHICS) ;
AddDriversToHaikuImage input		: ps2_hid usb_hid wacom ;
AddDriversToHaikuImage misc			: <driver>poke <driver>test ;
AddDriversToHaikuImage net			: $(BEOS_ADD_ONS_DRIVERS_NET) ;
#AddDriversToHaikuImage power		: $(BEOS_ADD_ONS_DRIVERS_ACPI) ;

# kernel
AddFilesToHaikuImage beos system : <revisioned>kernel_$(TARGET_ARCH) ;

# libs
AddFilesToHaikuImage beos system lib : $(BEOS_SYSTEM_LIBS) ;

# libnetwork.so replaces quite a few libraries
BEOS_SYSTEM_LIBS_LIBNETWORK_ALIASES
	= libsocket.so libbind.so libnet.so ;

local lib ;
for lib in $(BEOS_SYSTEM_LIBS_LIBNETWORK_ALIASES) {
	AddSymlinkToHaikuImage beos system lib : libnetwork.so : $(lib) ;
}

AddSymlinkToHaikuImage beos system lib : libbnetapi.so : libnetapi.so ;

# libGL.so has GLU (like BeOS) *and* GLUT API built-in
BEOS_SYSTEM_LIBS_LIBGL_ALIASES
	= libGLU.so libglut.so ;

if $(TARGET_ARCH) = x86 {
local lib ;
for lib in $(BEOS_SYSTEM_LIBS_LIBGL_ALIASES) {
	AddSymlinkToHaikuImage beos system lib : libGL.so : $(lib) ;
}
}

# servers
AddFilesToHaikuImage beos system servers : $(BEOS_SYSTEM_SERVERS) ;

# apps
AddFilesToHaikuImage beos system		: runtime_loader Deskbar Tracker ;
AddFilesToHaikuImage beos bin			: $(BEOS_BIN) consoled ;
AddFilesToHaikuImage beos apps			: $(BEOS_APPS) ;
AddFilesToHaikuImage beos preferences	: $(BEOS_PREFERENCES) ;
AddFilesToHaikuImage beos demos			: $(BEOS_DEMOS) ;

SEARCH on which = [ FDirName $(HAIKU_TOP) data bin ] ;
AddFilesToHaikuImage beos bin			: which ;

AddSymlinkToHaikuImage beos bin : sh : bash ;

AddSymlinkToHaikuImage home Desktop : /boot/home : Home ;

# Deskbar Application links
AddDirectoryToHaikuImage home config be Applications ;
DESKBAR_APPLICATIONS = ActivityMonitor CodyCam CDPlayer DeskCalc DiskProbe
	DriveSetup DiskUsage Icon-O-Matic Magnify Mail MediaPlayer MidiPlayer
	People Screenshot SoundRecorder StyledEdit Terminal TV
;
local app ;
for app in $(DESKBAR_APPLICATIONS) {
	AddSymlinkToHaikuImage home config be Applications
		: /boot/beos/apps/$(app) : $(app) ;
}

# Deskbar Desktop Applets links
AddDirectoryToHaikuImage home config be Desktop\ Applets ;
DESKBAR_DESKTOP_APPLETS = LaunchBox NetworkStatus PowerStatus ProcessController
	Workspaces
;
for app in $(DESKBAR_DESKTOP_APPLETS) {
	AddSymlinkToHaikuImage home config be Desktop\ Applets
		: /boot/beos/apps/$(app) : $(app) ;
}

# Deskbar Preferences and Demos links
AddSymlinkToHaikuImage home config be : /boot/beos/preferences : Preferences ;
AddSymlinkToHaikuImage home config be : /boot/beos/demos : Demos ;

AddSymlinkToHaikuImage beos bin : bzip2 : bunzip2 ;
AddSymlinkToHaikuImage beos bin : less : more ;
AddSymlinkToHaikuImage beos bin : gzip : gunzip ;
AddSymlinkToHaikuImage beos bin : gzip : zcat ;
AddSymlinkToHaikuImage beos bin : zdiff : zcmp ;
AddSymlinkToHaikuImage beos bin : unzip : zipinfo ;
AddSymlinkToHaikuImage beos bin : gawk : awk ;
AddSymlinkToHaikuImage beos bin : grep : egrep ;
AddSymlinkToHaikuImage beos bin : grep : fgrep ;
AddSymlinkToHaikuImage beos bin : vim : vi ;
AddSymlinkToHaikuImage beos bin : vim : view ;


# scripts and data files
local bootScripts = Bootscript Bootscript.cd SetupEnvironment Netscript InstallerInitScript
	InstallerFinishScript ;
SEARCH on $(bootScripts) = [ FDirName $(HAIKU_TOP) data system boot ] ;
AddFilesToHaikuImage beos system boot : $(bootScripts) ;

local logoArtwork = "HAIKU logo - white on blue - big.png"
	"HAIKU logo - white on blue - normal.png" ;
SEARCH on $(logoArtwork) = [ FDirName $(HAIKU_TOP) data artwork ] ;
AddFilesToHaikuImage beos etc artwork : $(logoArtwork) ;

AddDirectoryToHaikuImage beos etc sounds ;

# Mail spell check dictionaries
local spellFiles = words geekspeak ;
spellFiles = $(spellFiles:G=spell) ;
SEARCH on $(spellFiles)
	= [ FDirName $(HAIKU_TOP) src apps mail ] ;
AddFilesToHaikuImage beos etc word_dictionary : $(spellFiles) ;

local etcFiles = inputrc profile teapot.data ;
etcFiles = $(etcFiles:G=etc) ;
SEARCH on $(etcFiles) = [ FDirName $(HAIKU_TOP) data etc ] ;
etcFiles += <etc>termcap <etc>sysless <etc>sysless.in ;
AddFilesToHaikuImage beos etc : $(etcFiles) ;

SEARCH on <etc>vimrc = [ FDirName $(HAIKU_TOP) data etc vim ] ;
AddFilesToHaikuImage beos etc vim : <etc>vimrc ;

local fortuneFiles =  Art Computers Education Food Fortunes Goedel Haiku
	Humorists Kids Law "Linux cookies" Love Magic Medicine Miscellaneous
	News "One Liners" "OS Fortunes" Pets Platitudes Riddles "Songs & Poems"
	Sports "Tech Support Excuses" ;
fortuneFiles = $(fortuneFiles:G=etc!fortunes) ;
SEARCH on $(fortuneFiles) = [ FDirName $(HAIKU_TOP) data etc fortunes ] ;
AddFilesToHaikuImage beos etc fortunes : $(fortuneFiles) ;

local fontDir = [ FDirName $(HAIKU_TOP) data etc fonts ] ;
local psFonts = [ Glob $(fontDir)/psfonts : *.afm *.pfb ] ;
local ttFonts = [ Glob $(fontDir)/ttfonts : *.ttf ] ;
AddFilesToHaikuImage beos etc fonts psfonts : $(psFonts) ;
AddFilesToHaikuImage beos etc fonts ttfonts : $(ttFonts) ;

local kanbeDir = [ FDirName $(HAIKU_TOP) data etc KanBe ] ;
local kanbeDefault = [ Glob $(kanbeDir)/default : *.canna *.gz ] ;
local kanbeDic = [ Glob $(kanbeDir)/dic : *.cbp ] ;
local kanbeDicCanna = [ Glob $(kanbeDir)/dic/canna
	: *.cld *.ctd *.cbd *.dir ] ;
AddFilesToHaikuImage beos etc KanBe default : $(kanbeDefault) ;
AddFilesToHaikuImage beos etc KanBe dic : $(kanbeDic) ;
AddFilesToHaikuImage beos etc KanBe dic canna : $(kanbeDicCanna) ;
AddDirectoryToHaikuImage beos etc KanBe dic group ;
AddDirectoryToHaikuImage beos etc KanBe dic user ;

local keymapFiles = [ GLOB [ FDirName $(HAIKU_TOP) src data etc keymaps ]
	: *.keymap ] ;
keymapFiles = $(keymapFiles:BG=keymap) ;
AddFilesToHaikuImage beos etc Keymap : $(keymapFiles) ;
AddSymlinkToHaikuImage beos etc Keymap : Swedish : Finnish ;
AddSymlinkToHaikuImage beos etc Keymap : Slovene : Croatian ;
AddSymlinkToHaikuImage beos etc Keymap : US-International : Brazilian ;

local timezones = [ FTimeZoneBinaries $(HAIKU_TIME_ZONE_SOURCES) : : true ] ;
for timezone in $(timezones) {
	local dir = [ on $(timezone) return $(RELATIVE_TIMEZONE_DIR) ] ;
	AddFilesToHaikuImage beos etc timezones $(dir) : $(timezone) ;
}

local driverSettingsFiles = <driver-settings>kernel ;
SEARCH on $(driverSettingsFiles)
	= [ FDirName $(HAIKU_TOP) data settings kernel drivers ] ;
AddFilesToHaikuImage home config settings kernel drivers
	: $(driverSettingsFiles) ;

local networkSettingsFiles = <network-settings>services ;
SEARCH on $(networkSettingsFiles)
	= [ FDirName $(HAIKU_TOP) data settings network ] ;
AddFilesToHaikuImage common settings network : $(networkSettingsFiles) ;

# post install scripts and fresh install indicator file
local postInstallFiles = mime_update.sh ;
postInstallFiles = $(postInstallFiles:G=post-install) ;
SEARCH on $(postInstallFiles)
	= [ FDirName $(HAIKU_TOP) data common boot post_install ] ;
SEARCH on <post-install>fresh_install
	= [ FDirName $(HAIKU_TOP) data common settings ] ;
AddFilesToHaikuImage common boot post_install : $(postInstallFiles) ;
AddFilesToHaikuImage common settings : <post-install>fresh_install ;

# boot loader
AddFilesToHaikuImage beos system : zbeos ;

# boot module links
AddBootModuleSymlinksToHaikuImage
	$(X86_ONLY)acpi pci $(X86_ONLY)isa config_manager ide scsi usb
	$(PPC_ONLY)openpic
	ide_adapter locked_pool scsi_periph
	ahci generic_ide_pci it8211 legacy_sata silicon_image_3112 $(X86_ONLY)ide_isa
	<usb>uhci <usb>ohci <usb>ehci
	scsi_cd scsi_disk usb_disk
	intel
	bfs
;

# add-ons
AddFilesToHaikuImage beos system add-ons accelerants
	: $(BEOS_ADD_ONS_ACCELERANTS) ;
AddFilesToHaikuImage beos system add-ons opengl
	: $(X86_ONLY)Mesa\ Software\ Renderer ;
AddFilesToHaikuImage beos system add-ons Translators
	: $(BEOS_ADD_ONS_TRANSLATORS) ;
AddFilesToHaikuImage beos system add-ons mail_daemon inbound_protocols : POP3 IMAP ;
AddFilesToHaikuImage beos system add-ons mail_daemon outbound_protocols : SMTP ;
AddFilesToHaikuImage beos system add-ons mail_daemon inbound_filters : Match\ Header Spam\ Filter R5\ Daemon\ Filter ;
AddFilesToHaikuImage beos system add-ons mail_daemon outbound_filters : Fortune ;
AddFilesToHaikuImage beos system add-ons mail_daemon system_filters : Inbox New\ Mail\ Notification Outbox Message\ Parser ;
AddFilesToHaikuImage beos system add-ons media : $(BEOS_ADD_ONS_MEDIA) ;
AddFilesToHaikuImage beos system add-ons media plugins
	: $(BEOS_ADD_ONS_MEDIA_PLUGINS) ;
AddFilesToHaikuImage beos system add-ons Tracker
	: FileType-F ZipOMatic-Z Open\ Target\ Folder-T ;
AddSymlinkToHaikuImage beos system add-ons Tracker
	: /boot/beos/preferences/Backgrounds : Background-B ;
AddSymlinkToHaikuImage beos system add-ons Tracker
	: /boot/beos/apps/TextSearch : TextSearch-G ;
AddSymlinkToHaikuImage beos system add-ons Tracker
	: /boot/beos/apps/DiskUsage : DiskUsage-I ;
AddFilesToHaikuImage beos system add-ons input_server devices
	: <input>keyboard <input>mouse <input>wacom ;
AddFilesToHaikuImage beos system add-ons input_server filters : screen_saver ;
AddFilesToHaikuImage beos system add-ons kernel network
	: <net>notifications stack ;
AddFilesToHaikuImage beos system add-ons kernel network devices
	: $(BEOS_NETWORK_DEVICES) ;
AddFilesToHaikuImage beos system add-ons kernel network datalink_protocols
	: $(BEOS_NETWORK_DATALINK_PROTOCOLS) ;
AddFilesToHaikuImage beos system add-ons kernel network ppp
	: $(BEOS_NETWORK_PPP) ;
AddFilesToHaikuImage beos system add-ons kernel network protocols
	: $(BEOS_NETWORK_PROTOCOLS) ;
AddFilesToHaikuImage beos system add-ons Print : $(BEOS_ADD_ONS_PRINT) ;
AddFilesToHaikuImage beos system add-ons Print transport
	: $(BEOS_ADD_ONS_PRINT_TRANSPORT) ;
AddFilesToHaikuImage beos system add-ons Screen\ Savers
	: $(BEOS_ADD_ONS_SCREENSAVERS) ;

AddFilesToHaikuImage beos system add-ons disk_systems
	: <disk_system>intel <disk_system>bfs ;

AddDirectoryToHaikuImage home config add-ons kernel drivers bin ;
AddDirectoryToHaikuImage home config add-ons kernel drivers dev ;
AddDirectoryToHaikuImage home config add-ons input_server devices ;
AddDirectoryToHaikuImage home config add-ons input_server filters ;
AddDirectoryToHaikuImage home config add-ons input_server methods ;
AddDirectoryToHaikuImage home config add-ons Tracker ;
AddDirectoryToHaikuImage home config add-ons Screen\ Savers ;
AddDirectoryToHaikuImage home config add-ons Translators ;
AddDirectoryToHaikuImage beos etc synth ;
AddDirectoryToHaikuImage beos system add-ons input_server methods ;

# optional
AddFilesToHaikuImage optional beos system add-ons input_server methods : canna ;

# printers
AddDirectoryToHaikuImage home config settings printers Preview
      : home-config-settings-printers-preview.rdef ;
AddDirectoryToHaikuImage home config settings printers "Save as PDF"
      : home-config-settings-printers-save-as-pdf.rdef ;

# licenses
CopyDirectoryToHaikuImage beos etc
	: [ FDirName $(HAIKU_TOP) data etc licenses ]
	: licenses : -x .svn ;


#pragma mark - Alternative GCC Libraries


# build a zip file with the system libs
# (used by another jam that wants to build a Haiku with alternative GCC
# libraries included)

rule ZipTargets zipFile : targets
{
	Depends $(zipFile) : <build>zip $(targets) ;
	ZipTargets1 $(zipFile) : <build>zip $(targets) ;
}

actions ZipTargets1
{
	$(HOST_ADD_BUILD_COMPATIBILITY_LIB_DIR)
	$(RM) "$(1)"
	$(2[1]) -jy "$(1)" $(2[2-])
}

local alternativeSystemLibsZip = <image>alternative_system_libs.zip ;
MakeLocate $(alternativeSystemLibsZip) : $(HAIKU_OUTPUT_DIR) ;

# collect the targets we would install in the lib directory
local alternativeSystemLibs ;
local libTargets = [ FFilesInHaikuImageDirectory beos system lib ] ;
local libTarget ;
for libTarget in $(libTargets) {
	alternativeSystemLibs += [ on $(libTarget) return $(TARGET) ] ;
}

# collect the symlinks we would install in the lib directory
libTargets = [ FSymlinksInHaikuImageDirectory beos system lib ] ;
local tmpAlternativeLibDir
	= [ FDirName $(HAIKU_OUTPUT_DIR) tmp alternativeLibs ] ;
for libTarget in $(libTargets) {
	# We need to create actual symlinks, we can zip later.
	local symlinkTarget = <alternative-system-lib>$(libTarget:BS) ;
	MakeLocate $(symlinkTarget) : $(tmpAlternativeLibDir) ;
	SymLink $(symlinkTarget) : [ on $(libTarget) return $(SYMLINK_TARGET) ] ;
	alternativeSystemLibs += $(symlinkTarget) ;
}

ZipTargets $(alternativeSystemLibsZip) : $(alternativeSystemLibs) ;


if $(HAIKU_ADD_ALTERNATIVE_GCC_LIBS) && $(HAIKU_ALTERNATIVE_GCC_OUTPUT_DIR) {
	# let another jam build a zip with the system libraries
	rule InvokeSubJam target : directory : jamLine
	{
		DIRECTORY on $(target) = $(directory) ;
		COMMAND_LINE on $(target) = $(jamLine) ;
		Always $(target) ;
		InvokeSubJam1 $(target) ;
	}

	actions InvokeSubJam1
	{
		cd $(DIRECTORY)
		$(JAM:E=jam) -q $(COMMAND_LINE) ;
	}

	local otherAlternativeSystemLibsZip
		= <other-image>alternative_system_libs.zip ;
	MakeLocate $(otherAlternativeSystemLibsZip)
		: $(HAIKU_ALTERNATIVE_GCC_OUTPUT_DIR) ;

	InvokeSubJam $(otherAlternativeSystemLibsZip)
		: $(HAIKU_ALTERNATIVE_GCC_OUTPUT_DIR)
		: "'<image>alternative_system_libs.zip'" ;

	local libSubDir ;

	if $(HAIKU_GCC_VERSION[1]) = 2 {
		libSubDir = gcc4 ;
	} else {
		libSubDir = gcc2 ;
	}

	# install the alternative libs in the right directory
	UnzipArchiveToHaikuImage beos system lib $(libSubDir)
		: $(otherAlternativeSystemLibsZip) ;
}


#pragma mark - Optional Packages


HAIKU_IMAGE_OPTIONAL_PACKAGE_DESCRIPTIONS = ;

include [ FDirName $(HAIKU_BUILD_RULES_DIR) OptionalPackages ] ;
include [ FDirName $(HAIKU_BUILD_RULES_DIR) OptionalTestPackages ] ;

local optionalPackageDescriptions ;
if $(HAIKU_IMAGE_OPTIONAL_PACKAGE_DESCRIPTIONS) {
	optionalPackageDescriptions = <haiku-image>optional_package_descriptions ;
	MakeLocate $(optionalPackageDescriptions)
		: $(HAIKU_COMMON_PLATFORM_OBJECT_DIR) ;

	Depends $(optionalPackageDescriptions)
		: $(HAIKU_IMAGE_OPTIONAL_PACKAGE_DESCRIPTIONS) ;

	actions together BuildOptionalPackageDescriptions
	{
		cat $(2) > $(1)
	}

	BuildOptionalPackageDescriptions $(optionalPackageDescriptions)
		: $(HAIKU_IMAGE_OPTIONAL_PACKAGE_DESCRIPTIONS) ;
}


#pragma mark - User/Group Setup


# add the root user and the root and users groups
AddUserToHaikuImage $(HAIKU_ROOT_USER_NAME:E=baron) : 0 : 0 : /boot/home
	: /bin/bash : $(HAIKU_ROOT_USER_REAL_NAME:E="Root User") ;
AddGroupToHaikuImage root : 0 : ;
AddGroupToHaikuImage users : 100 : ;


#pragma mark - Host Name


if $(HAIKU_IMAGE_HOST_NAME) {
	actions BuildHaikuImageHostnameFile
	{
		echo "$(HAIKU_IMAGE_HOST_NAME)" > $(1)
	}

	local file = <haiku-image>hostname ;
	Always $(file) ;
	MakeLocate $(file) : $(HAIKU_COMMON_PLATFORM_OBJECT_DIR) ;
	BuildHaikuImageHostnameFile $(file) ;
	AddFilesToHaikuImage common settings network : $(file) ;
}


#pragma mark - Build The Image


# Execute pre-image user config rules.
UserBuildConfigRulePreImage	;

# Set image name and directory defaults and locate the image.
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
HAIKU_IMAGE_LABEL ?= $(HAIKU_DEFAULT_IMAGE_LABEL) ;
MakeLocate $(HAIKU_IMAGE) : $(HAIKU_IMAGE_DIR) ;

# Set the default installation directory.
HAIKU_INSTALL_DIR ?= $(HAIKU_DEFAULT_INSTALL_DIR) ;

# the pseudo target all image contents is attached to
NotFile $(HAIKU_IMAGE_CONTAINER_NAME) ;

# prepare the script that initializes the shell variables
HAIKU_IMAGE_INIT_VARIABLES_SCRIPT = <HaikuImage>haiku.image-init-vars ;
local script = $(HAIKU_IMAGE_INIT_VARIABLES_SCRIPT) ;
MakeLocate $(script) : $(HAIKU_OUTPUT_DIR) ;
Always $(script) ;

AddVariableToScript $(script) : sourceDir : $(HAIKU_TOP) ;
AddVariableToScript $(script) : outputDir : $(HAIKU_OUTPUT_DIR) ;
AddVariableToScript $(script) : tmpDir : $(HAIKU_TMP_DIR) ;
AddVariableToScript $(script) : installDir : $(HAIKU_INSTALL_DIR) ;
#AddVariableToScript $(script) : isImage : 1 ;
AddVariableToScript $(script) : imageSize : $(HAIKU_IMAGE_SIZE) ;
AddVariableToScript $(script) : imageLabel : $(HAIKU_IMAGE_LABEL) ;
AddVariableToScript $(script) : addBuildCompatibilityLibDir
	: $(HOST_ADD_BUILD_COMPATIBILITY_LIB_DIR) ;
AddVariableToScript $(script) : dontClearImage : $(HAIKU_DONT_CLEAR_IMAGE) ;
AddVariableToScript $(script) : updateOnly : [ IsUpdateHaikuImageOnly ] ;
AddTargetVariableToScript $(script) : <build>addattr ;
AddTargetVariableToScript $(script) : <build>bfs_shell : bfsShell ;
AddTargetVariableToScript $(script) : <build>fs_shell_command : fsShellCommand ;
AddTargetVariableToScript $(script) : <build>copyattr ;
AddTargetVariableToScript $(script) : <build>makebootable ;
AddTargetVariableToScript $(script) : <build>rc ;
AddTargetVariableToScript $(script) : <build>resattr ;
AddTargetVariableToScript $(script) : <build>unzip ;
AddTargetVariableToScript $(script) : <build>vmdkimage ;
if $(HOST_RM_ATTRS_TARGET) {
	AddTargetVariableToScript $(script) : $(HOST_RM_ATTRS_TARGET) : rmAttrs ;
} else {
	AddVariableToScript $(script) : rmAttrs : rm ;
}
if $(optionalPackageDescriptions) {
	AddTargetVariableToScript $(script) : $(optionalPackageDescriptions)
		: optionalPackageDescriptions ;
}


# create the other scripts
HAIKU_IMAGE_MAKE_DIRS_SCRIPT = <HaikuImage>haiku.image-make-dirs ;
HAIKU_IMAGE_COPY_FILES_SCRIPT = <HaikuImage>haiku.image-copy-files ;
HAIKU_IMAGE_UNZIP_FILES_SCRIPT = <HaikuImage>haiku.image-unzip-files ;
MakeLocate $(HAIKU_IMAGE_MAKE_DIRS_SCRIPT) $(HAIKU_IMAGE_COPY_FILES_SCRIPT)
	$(HAIKU_IMAGE_UNZIP_FILES_SCRIPT) : $(HAIKU_OUTPUT_DIR) ;

CreateHaikuImageMakeDirectoriesScript $(HAIKU_IMAGE_MAKE_DIRS_SCRIPT) ;
CreateHaikuImageCopyFilesScript $(HAIKU_IMAGE_COPY_FILES_SCRIPT) ;
CreateHaikuImageUnzipFilesScript $(HAIKU_IMAGE_UNZIP_FILES_SCRIPT) ;

# Convenience wrapper rule around BuildHaikuImage.
rule _BuildHaikuImage image : isImage : isVMwareImage
{
	# _BuildHaikuImage <image target> : <isImage> : <isVMwareImage> ;
	#

	# build the image
	# HAIKU_IMAGE_EARLY_USER_SCRIPTS, HAIKU_IMAGE_LATE_USER_SCRIPTS can be
	# specified by the user.
	BuildHaikuImage $(image) :
		$(HAIKU_IMAGE_INIT_VARIABLES_SCRIPT)
		$(HAIKU_IMAGE_EARLY_USER_SCRIPTS)
		$(HAIKU_IMAGE_MAKE_DIRS_SCRIPT)
		$(HAIKU_IMAGE_COPY_FILES_SCRIPT)
		$(HAIKU_IMAGE_UNZIP_FILES_SCRIPT)
		$(HAIKU_IMAGE_LATE_USER_SCRIPTS)
		: $(isImage)
		: $(isVMwareImage)
	;

	# remove the scripts we have generated
	RmTemps $(image) :
		$(HAIKU_IMAGE_INIT_VARIABLES_SCRIPT)
		$(HAIKU_IMAGE_MAKE_DIRS_SCRIPT)
		$(HAIKU_IMAGE_COPY_FILES_SCRIPT)
		$(HAIKU_IMAGE_UNZIP_FILES_SCRIPT)
	;
}

# build the image
_BuildHaikuImage $(HAIKU_IMAGE) : true ;
NotFile haiku-image ;
Depends haiku-image : $(HAIKU_IMAGE) ;


# install Haiku into a directory
NotFile install-haiku ;
_BuildHaikuImage install-haiku : 0 ;


# build the VMware image
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 ;
NotFile haiku-vmware-image ;
Depends haiku-vmware-image : $(HAIKU_VMWARE_IMAGE) ;

# Execute post-image user config rules.
UserBuildConfigRulePostImage ;