SubDir HAIKU_TOP src apps haikudepot ;

# disable -Werror for this directory only
SubDirC++Flags -Wno-error ;

include [ FDirName $(SUBDIR) build jam HdsSchemaGenRules ] ;

UsePrivateHeaders interface kernel net netservices package shared storage ;
UsePrivateHeaders support locale ;

HAIKUDEPOT_GENERATED_SOURCES_DIRECTORY = $(TARGET_COMMON_DEBUG_LOCATE_TARGET) ;

# During the build process, some sources are generated into directories.  These
# are the directories.

local dumpExportRepositoryBulkListerTargetDirectory =
	[ FDirName $(HAIKUDEPOT_GENERATED_SOURCES_DIRECTORY)
		dumpexportrepositorybulklistener ] ;
local dumpExportPkgBulkListenerTargetDirectory =
	[ FDirName $(HAIKUDEPOT_GENERATED_SOURCES_DIRECTORY)
		dumpexportpkgbulklistener ] ;
local dumpExportReferenceListenerTargetDirectory =
	[ FDirName $(HAIKUDEPOT_GENERATED_SOURCES_DIRECTORY)
		dumpexportreferencelistener ] ;

local dumpExportPkgModelTargetDirectory =
	[ FDirName $(HAIKUDEPOT_GENERATED_SOURCES_DIRECTORY)
		dumpexportpkgmodel ] ;
local dumpExportRepositoryModelTargetDirectory =
	[ FDirName $(HAIKUDEPOT_GENERATED_SOURCES_DIRECTORY)
		dumpexportrepositorymodel ] ;
local dumpExportReferenceModelTargetDirectory =
	[ FDirName $(HAIKUDEPOT_GENERATED_SOURCES_DIRECTORY)
		dumpexportreferencemodel ] ;

# During the build process, some sources are generated into a directory.  In
# order to maintain a timestamp on that generation process, a dummy file is
# used to signify the target of the generation.  The leafname of this dummy file
# is defined here.

local dummyFile = "dummy.dat" ;

local dumpExportRepositoryBulkListerTargetFile =
	[ FDirName $(dumpExportRepositoryBulkListerTargetDirectory) $(dummyFile) ] ;
local dumpExportPkgBulkListenerTargetFile =
	[ FDirName $(dumpExportPkgBulkListenerTargetDirectory) $(dummyFile) ] ;
local dumpExportReferenceListenerTargetFile =
	[ FDirName $(dumpExportReferenceListenerTargetDirectory) $(dummyFile) ] ;

local dumpExportPkgModelTargetFile =
	[ FDirName $(dumpExportPkgModelTargetDirectory) $(dummyFile) ] ;
local dumpExportRepositoryModelTargetFile =
	[ FDirName $(dumpExportRepositoryModelTargetDirectory) $(dummyFile) ] ;
local dumpExportReferenceModelTargetFile =
	[ FDirName $(dumpExportReferenceModelTargetDirectory) $(dummyFile) ] ;

# source directories
local sourceDirs =
	edits_generic
	model
	packagemanagement
	process
	textview
	ui
	ui_generic
	server
	tar
	util
;

local sourceDir ;
for sourceDir in $(sourceDirs) {
	SEARCH_SOURCE += [ FDirName $(SUBDIR) $(sourceDir) ] ;
}

SEARCH_SOURCE += [ FDirName $(HAIKU_TOP) src servers package ] ;

SEARCH_SOURCE += $(dumpExportRepositoryBulkListerTargetDirectory) ;
SEARCH_SOURCE += $(dumpExportPkgBulkListenerTargetDirectory) ;
SEARCH_SOURCE += $(dumpExportReferenceListenerTargetDirectory) ;

SEARCH_SOURCE += $(dumpExportPkgModelTargetDirectory) ;
SEARCH_SOURCE += $(dumpExportRepositoryModelTargetDirectory) ;
SEARCH_SOURCE += $(dumpExportReferenceModelTargetDirectory) ;

local textDocumentSources =
	# edits_generic
	CompoundEdit.cpp
	EditContext.cpp
	EditManager.cpp
	UndoableEdit.cpp

	# textview
	Bullet.cpp
	BulletData.cpp
	CharacterStyle.cpp
	CharacterStyleData.cpp
	MarkupParser.cpp
	Paragraph.cpp
	ParagraphLayout.cpp
	ParagraphStyle.cpp
	ParagraphStyleData.cpp
	TextDocument.cpp
	TextDocumentLayout.cpp
	TextDocumentView.cpp
	TextEditor.cpp
	TextListener.cpp
	TextSelection.cpp
	TextSpan.cpp
	TextView.cpp
	UndoableEditListener.cpp
;

local applicationSources =
	App.cpp
	BitmapView.cpp
	Captcha.cpp
	CreateUserDetail.cpp
	DecisionProvider.cpp
	DeskbarLink.cpp
	FeaturedPackagesView.cpp
	FilterView.cpp
	GeneralContentScrollView.cpp
	IconTarPtr.cpp
	IncrementViewCounterProcess.cpp
	JobStateListener.cpp
	LanguageModel.cpp
	LinkView.cpp
	LinkedBitmapView.cpp
	Logger.cpp
	main.cpp
	MainWindow.cpp
	MarkupTextView.cpp
	MessagePackageListener.cpp
	Model.cpp
	PackageContentsView.cpp
	PackageIconTarRepository.cpp
	PackageInfo.cpp
	PackageInfoListener.cpp
	PackageInfoView.cpp
	PackageListView.cpp
	PasswordRequirements.cpp
	RatePackageWindow.cpp
	RatingView.cpp
	RatingStability.cpp
	RatingUtils.cpp
	support.cpp
	ScreenshotWindow.cpp
	ScrollableGroupView.cpp
	SettingsWindow.cpp
	SharedBitmap.cpp
	ShuttingDownWindow.cpp
	ToLatestUserUsageConditionsWindow.cpp
	UserCredentials.cpp
	UserDetail.cpp
	UserLoginWindow.cpp
	UserUsageConditions.cpp
	UserUsageConditionsWindow.cpp
	ValidationFailure.cpp
	ValidationUtils.cpp
	WorkStatusView.cpp

	# packagemanagement
	AbstractPackageProcess.cpp
	InstallPackageProcess.cpp
	OpenPackageProcess.cpp
	PackageAction.cpp
	PackageManager.cpp
	UninstallPackageProcess.cpp

	# network + server / local processes
	AbstractProcess.cpp
	AbstractProcessNode.cpp
	AbstractServerProcess.cpp
	AbstractSingleFileServerProcess.cpp
	LocalPkgDataLoadProcess.cpp
	LocalRepositoryUpdateProcess.cpp
	ProcessCoordinator.cpp
	ProcessCoordinatorFactory.cpp
	ServerHelper.cpp
	ServerSettings.cpp
	ServerPkgDataUpdateProcess.cpp
	ServerReferenceDataUpdateProcess.cpp
	ServerRepositoryDataUpdateProcess.cpp
	ServerIconExportUpdateProcess.cpp
	StandardMetaDataJsonEventListener.cpp
	StandardMetaData.cpp
	ThreadedProcessNode.cpp
	UserDetailVerifierProcess.cpp
	WebAppInterface.cpp

	# tar
	TarArchiveHeader.cpp
	TarArchiveService.cpp

	# util
	AppUtils.cpp
	DataIOUtils.cpp
	LanguageMenuUtils.cpp
	LocaleUtils.cpp
	PackageUtils.cpp
	RepositoryUrlUtils.cpp
	StorageUtils.cpp
	LoggingUrlProtocolListener.cpp

	# package_daemon
	ProblemWindow.cpp
	ResultWindow.cpp
;

local generatedPkgModelSourceFiles =
	DumpExportPkg.cpp
	DumpExportPkgCategory.cpp
	DumpExportPkgScreenshot.cpp
	DumpExportPkgVersion.cpp
;

local generatedRepositoryModelSourceFiles =
	DumpExportRepository.cpp
	DumpExportRepositorySource.cpp
	DumpExportRepositorySourceMirror.cpp
;

local generatedReferenceModelSourceFiles =
	DumpExportReference.cpp
	DumpExportReferenceNaturalLanguage.cpp
	DumpExportReferencePkgCategory.cpp
	DumpExportReferenceUserRatingStability.cpp
	DumpExportReferenceCountry.cpp
;

local generatedPkgParserSourceFiles =
	DumpExportPkgJsonListener.cpp
;

local generatedRepositoryParserSourceFiles =
	DumpExportRepositoryJsonListener.cpp
;

local generatedReferenceParserSourceFiles =
	DumpExportReferenceJsonListener.cpp
;

Application HaikuDepot
	:
	$(applicationSources)
	$(textDocumentSources)
	$(generatedPkgModelSourceFiles)
	$(generatedRepositoryModelSourceFiles)
	$(generatedReferenceModelSourceFiles)
	$(generatedPkgParserSourceFiles)
	$(generatedRepositoryParserSourceFiles)
	$(generatedReferenceParserSourceFiles)
	:
	be package bnetapi translation libnetservices.a libcolumnlistview.a shared
	[ TargetLibstdc++ ] [ TargetLibsupc++ ] localestub
	:
	HaikuDepot.rdef
;

DoCatalogs HaikuDepot :
	x-vnd.Haiku-HaikuDepot
	:
	$(applicationSources)
;

# The following use of rules configures the generation of .cpp and .h files from
# JSON schemas that are defined in the HaikuDepotServer system.  See the
# included Jam rules and actions for the definitions.

HdsSchemaGenModel $(dumpExportPkgModelTargetFile)
	: dumpexportpkg.json : jsonschema2cppmodel.py ;

HdsSchemaGenModel $(dumpExportRepositoryModelTargetFile)
	: dumpexportrepository.json : jsonschema2cppmodel.py ;

HdsSchemaGenModel $(dumpExportReferenceModelTargetFile)
	: dumpexportreference.json : jsonschema2cppmodel.py ;

HdsSchemaGenBulkParser $(dumpExportRepositoryBulkListerTargetFile)
	: dumpexportrepository.json : jsonschema2cppparser.py ;

HdsSchemaGenBulkParser $(dumpExportPkgBulkListenerTargetFile)
	: dumpexportpkg.json : jsonschema2cppparser.py ;

HdsSchemaGenParser $(dumpExportReferenceListenerTargetFile)
	: dumpexportreference.json : jsonschema2cppparser.py ;

HdsSchemaGenAppSrcDependsOnGeneration
	[ FGristFiles $(generatedPkgParserSourceFiles) ]
	[ FGristFiles $(generatedPkgParserSourceFiles:S=.h) ]
	: $(dumpExportPkgBulkListenerTargetDirectory)
	: $(dumpExportPkgBulkListenerTargetFile) ;

HdsSchemaGenAppSrcDependsOnGeneration
	[ FGristFiles $(generatedRepositoryParserSourceFiles) ]
	[ FGristFiles $(generatedRepositoryParserSourceFiles:S=.h) ]
	: $(dumpExportRepositoryBulkListerTargetDirectory)
	: $(dumpExportRepositoryBulkListerTargetFile) ;

HdsSchemaGenAppSrcDependsOnGeneration
	[ FGristFiles $(generatedReferenceParserSourceFiles) ]
	[ FGristFiles $(generatedReferenceParserSourceFiles:S=.h) ]
	: $(dumpExportReferenceListenerTargetDirectory)
	: $(dumpExportReferenceListenerTargetFile) ;

HdsSchemaGenAppSrcDependsOnGeneration
	[ FGristFiles $(generatedRepositoryModelSourceFiles) ]
	[ FGristFiles $(generatedRepositoryModelSourceFiles:S=.h) ]
	: $(dumpExportRepositoryModelTargetDirectory)
	: $(dumpExportRepositoryModelTargetFile) ;

HdsSchemaGenAppSrcDependsOnGeneration
	[ FGristFiles $(generatedPkgModelSourceFiles) ]
	[ FGristFiles $(generatedPkgModelSourceFiles:S=.h) ]
	: $(dumpExportPkgModelTargetDirectory)
	: $(dumpExportPkgModelTargetFile) ;

HdsSchemaGenAppSrcDependsOnGeneration
	[ FGristFiles $(generatedReferenceModelSourceFiles) ]
	[ FGristFiles $(generatedReferenceModelSourceFiles:S=.h) ]
	: $(dumpExportReferenceModelTargetDirectory)
	: $(dumpExportReferenceModelTargetFile) ;

# This will ensure that if any of the generated files' header files change, then
# the application should be re-built.

Includes [ FGristFiles $(applicationSources) ]
	:
	$(dumpExportRepositoryBulkListerTargetDirectory)
	$(dumpExportPkgBulkListenerTargetDirectory)
	$(dumpExportReferenceListenerTargetDirectory)
	$(dumpExportPkgModelTargetDirectory)
	$(dumpExportRepositoryModelTargetDirectory)
	$(dumpExportReferenceModelTargetDirectory)
;

Depends [ FGristFiles $(applicationSources:S=.o) ]
	:
	[ FGristFiles $(generatedPkgParserSourceFiles:S=.h) ]
	[ FGristFiles $(generatedPkgModelSourceFiles:S=.h) ]
	[ FGristFiles $(generatedRepositoryParserSourceFiles:S=.h) ]
	[ FGristFiles $(generatedRepositoryModelSourceFiles:S=.h) ]
	[ FGristFiles $(generatedReferenceParserSourceFiles:S=.h) ]
	[ FGristFiles $(generatedReferenceModelSourceFiles:S=.h) ]
;
