# This file defines what ends up in the network boot archive and it executes the
# rules building the archive.

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

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

#HACK: remove when old ide code is removed!
local ATA_ONLY = ;
local IDE_ONLY = ;
if $(HAIKU_ATA_STACK) = 1 {
	ATA_ONLY = "" ;
} else {
	IDE_ONLY = "" ;
}

SYSTEM_NETWORK_DEVICES = ethernet loopback ;
SYSTEM_NETWORK_DATALINK_PROTOCOLS = ethernet_frame <module>arp loopback_frame
	ipv4_datagram ;
SYSTEM_NETWORK_PROTOCOLS = ipv4 tcp udp icmp unix ;

SYSTEM_ADD_ONS_DRIVERS_NET = $(X86_ONLY)3com $(X86_ONLY)atheros813x
	$(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
;
SYSTEM_ADD_ONS_BUS_MANAGERS = pci $(X86_ONLY)isa $(IDE_ONLY)ide $(ATA_ONLY)ata
	scsi config_manager agp_gart
;
SYSTEM_ADD_ONS_FILE_SYSTEMS = bfs fat iso9660 ;


# modules
AddFilesToNetBootArchive system add-ons kernel bus_managers
	: $(SYSTEM_ADD_ONS_BUS_MANAGERS) ;
AddFilesToNetBootArchive system add-ons kernel busses agp_gart
	: $(X86_ONLY)<agp_gart>intel ;
AddFilesToNetBootArchive system add-ons kernel busses ide
	: generic_ide_pci $(X86_ONLY)ide_isa silicon_image_3112 ;
AddFilesToNetBootArchive system add-ons kernel busses scsi
	: ahci ;
AddFilesToNetBootArchive system add-ons kernel console : vga_text ;
AddFilesToNetBootArchive system add-ons kernel file_systems
	: $(SYSTEM_ADD_ONS_FILE_SYSTEMS) ;
AddFilesToNetBootArchive system add-ons kernel generic
	: $(IDE_ONLY)ide_adapter $(ATA_ONLY)ata_adapter locked_pool scsi_periph ;
AddFilesToNetBootArchive system add-ons kernel partitioning_systems
	: intel session ;
AddFilesToNetBootArchive system add-ons kernel interrupt_controllers
	: $(PPC_ONLY)openpic ;

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

# drivers
AddNewDriversToNetBootArchive disk scsi	: scsi_cd scsi_disk ;
#AddDriversToNetBootArchive disk virtual : nbd ;
AddDriversToNetBootArchive disk virtual	: remote_disk ;
AddDriversToNetBootArchive net : $(SYSTEM_ADD_ONS_DRIVERS_NET) ;

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

# scripts and data files

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

# add-ons
AddFilesToNetBootArchive system add-ons kernel network
	: <net>notifications stack ;
AddFilesToNetBootArchive system add-ons kernel network devices
	: $(SYSTEM_NETWORK_DEVICES) ;
AddFilesToNetBootArchive system add-ons kernel network datalink_protocols
	: $(SYSTEM_NETWORK_DATALINK_PROTOCOLS) ;
AddFilesToNetBootArchive system add-ons kernel network ppp
	: $(SYSTEM_NETWORK_PPP) ;
AddFilesToNetBootArchive system add-ons kernel network protocols
	: $(SYSTEM_NETWORK_PROTOCOLS) ;

# boot module links
AddBootModuleSymlinksToNetBootArchive
	$(SYSTEM_ADD_ONS_BUS_MANAGERS)
	ahci generic_ide_pci $(X86_ONLY)ide_isa silicon_image_3112
	$(SYSTEM_ADD_ONS_FILE_SYSTEMS)
	$(IDE_ONLY)ide_adapter $(ATA_ONLY)ata_adapter locked_pool scsi_periph
	intel session
	$(PPC_ONLY)openpic
	$(X86_ONLY)generic_x86
#	nbd
	remote_disk
	$(SYSTEM_ADD_ONS_DRIVERS_NET)
	stack
	$(SYSTEM_NETWORK_DEVICES)
	$(SYSTEM_NETWORK_DATALINK_PROTOCOLS)
	$(SYSTEM_NETWORK_PPP)
	$(SYSTEM_NETWORK_PROTOCOLS)
;


#pragma mark - Build The Archive

# archive target
HAIKU_NET_BOOT_ARCHIVE = haiku-netboot.tgz ;
MakeLocate $(HAIKU_NET_BOOT_ARCHIVE) : $(HAIKU_OUTPUT_DIR) ;

# the pseudo target all archive contents is attached to
NotFile $(HAIKU_NET_BOOT_ARCHIVE_CONTAINER_NAME) ;

# prepare the script that initializes the shell variables
local initVarsScript = <NetBootArchive>haiku-netboot-init-vars ;
local script = $(initVarsScript) ;
MakeLocate $(script) : $(HAIKU_OUTPUT_DIR) ;
Always $(script) ;

AddVariableToScript $(script) : tmpDir : $(HAIKU_TMP_DIR) ;
AddVariableToScript $(script) : addBuildCompatibilityLibDir
	: $(HOST_ADD_BUILD_COMPATIBILITY_LIB_DIR) ;
AddTargetVariableToScript $(script) : <build>copyattr ;

# create the other scripts
local makeDirsScript = <NetBootArchive>haiku-netboot-make-dirs ;
local copyFilesScript = <NetBootArchive>haiku-netboot-copy-files ;
MakeLocate $(makeDirsScript) $(copyFilesScript) : $(HAIKU_OUTPUT_DIR) ;

CreateNetBootArchiveMakeDirectoriesScript $(makeDirsScript) ;
CreateNetBootArchiveCopyFilesScript $(copyFilesScript) ;

# build the archive

BuildNetBootArchive $(HAIKU_NET_BOOT_ARCHIVE) :
	$(initVarsScript)
	$(makeDirsScript)
	$(copyFilesScript)
;

# remove the scripts we have generated
RmTemps $(HAIKU_NET_BOOT_ARCHIVE) :
	$(initVarsScript)
	$(makeDirsScript)
	$(copyFilesScript)
;

NotFile haiku-netboot-archive ;
Depends haiku-netboot-archive : $(HAIKU_NET_BOOT_ARCHIVE) ;
