# -*- Mode: makefile-gmake; tab-width: 4; indent-tabs-mode: t -*-

.PHONY : all bootstrap build check clean clean-build clean-host dev-install distclean distro-pack-install docs fetch findunusedcode id install install-strip subsequentcheck tags

ifeq ($(MAKECMDGOALS),)
MAKECMDGOALS:=all
endif

all: build

SHELL=/usr/bin/env bash
SRCDIR:=$(patsubst %/,%,$(dir $(realpath $(firstword $(MAKEFILE_LIST)))))

ifeq ($(gb_Side),)
gb_Side:=host
endif

include $(SRCDIR)/config_$(gb_Side).mk

ifeq ($(GMAKE_OPTIONS),)
ifeq ($(VERBOSE),)
export GMAKE_OPTIONS:=-rs
else
export GMAKE_OPTIONS:=-r
endif
endif

gbuild_modules:= \
MathMLDTD\
Mesa\
UnoControls\
accessibility\
animations\
apple_remote\
avmedia\
basctl\
basebmp\
basegfx\
basic\
bean\
binaryurp\
canvas\
chart2\
clucene\
codemaker\
comphelper\
configmgr\
connectivity\
cppcanvas\
cppu\
cppuhelper\
cpputools\
cui\
dbaccess\
desktop\
drawinglayer\
dtrans\
editeng\
embeddedobj\
embedserv\
eventattacher\
extensions\
fileaccess\
filter\
forms\
formula\
fpicker\
framework\
hwpfilter\
i18npool\
i18nutil\
idl\
idlc\
io\
javaunohelper\
jurt\
jvmaccess\
jvmfwk\
l10ntools\
lingucomponent\
linguistic\
lotuswordpro\
nlpsolver\
np_sdk\
o3tl\
offapi\
officecfg\
oovbaapi\
oox\
package\
packimages\
padmin\
psprint_config\
pyuno\
qadevOOo\
regexp\
registry\
remotebridges\
reportbuilder\
reportdesign\
rdbmaker\
ridljar\
rsc\
sal\
salhelper\
sane\
sax\
sc\
scaddins\
sccomp\
scp2\
scripting\
sd\
sdext\
sfx2\
shell\
slideshow\
smoketest\
solenv\
sot\
starmath\
stoc\
store\
svl\
svtools\
svx\
sw\
swext\
tail_build\
test\
testtools\
toolkit\
tools\
touch\
translations\
twain\
ucb\
ucbhelper\
udkapi\
unixODBC\
unodevtools\
unoil\
unotest\
unotools\
unoxml\
ure\
uui\
vbahelper\
vcl\
wizards\
writerfilter\
writerperfect\
x11_extensions\
xmerge\
xml2cmp\
xmlhelp\
xmloff\
xmlreader\
xmlscript\
xmlsecurity\

dmake_modules:=\
afms\
apache-commons\
autodoc\
beanshell\
berkeleydb\
binfilter \
boost\
bridges\
cairo\
cli_ure\
cosv\
cppunit\
crashrep\
ct2n\
curl\
dictionaries \
epm\
expat\
external\
extras\
fontconfig\
freetype\
gdk-pixbuf\
gettext\
glib\
graphite\
helpcontent2 \
hsqldb\
hunspell\
hyphen\
icu\
instsetoo_native\
jfreereport\
jpeg\
languagetool\
libcdr\
libcmis\
libcroco\
libexttextcat\
libgsf\
liblangtag\
libmspub\
libpng\
librsvg\
libvisio\
libwpd\
libwpg\
libwps\
libxml2\
libxmlsec\
libxslt\
lcms2\
lpsolve\
mdds\
migrationanalysis\
more_fonts\
moz\
mysqlc\
mysqlcppconn\
mythes\
neon\
nss\
odk\
openssl\
pango\
postgresql\
postprocess\
python\
readlicense_oo\
redland\
rhino\
saxon\
setup_native\
soltools\
stax\
stlport\
sysui\
tomcat\
udm\
vigra\
xpdf\
xsltml\
zlib\

gb_TAILBUILDMODULES := $(shell $(GNUMAKE) -r -f $(SRCDIR)/tail_build/Makefile showmodules)
export gb_TAILBUILDTARGET=all slowcheck

define gbuild_module_rules
.PHONY: $(1) $(1).all $(1).clean $(1).deliver

$(1): bootstrap fetch
	cd $(1) && $(GNUMAKE) -j $(GMAKE_PARALLELISM) $(GMAKE_OPTIONS) gb_PARTIALBUILD=T

ifeq ($(filter $(1),$(gb_TAILBUILDMODULES)),)
$(1).all: bootstrap fetch
	cd $(1) && unset MAKEFLAGS && \
        $(SOLARENV)/bin/build.pl -P$(BUILD_NCPUS) --all -- -P$(GMAKE_PARALLELISM)
else
$(1).all: bootstrap fetch
	cd tail_build && unset MAKEFLAGS && \
	export gb_TAILBUILDTARGET="$(WORKDIR)/Module/$(1) $(WORKDIR)/Module/check/$(1) $(WORKDIR)/Module/slowcheck/$(1)" && \
        $(SOLARENV)/bin/build.pl -P$(BUILD_NCPUS) --all -- -P$(GMAKE_PARALLELISM)
endif

$(1).clean:
	cd $(1) && $(GNUMAKE) -j $(GMAKE_PARALLELISM) $(GMAKE_OPTIONS) clean gb_PARTIALBUILD=T

$(1).subsequentcheck:
	cd $(1) && $(GNUMAKE) -j $(GMAKE_PARALLELISM) $(GMAKE_OPTIONS) subsequentcheck gb_PARTIALBUILD=T

$(1).deliver:
	@true

endef

define gbuild_modules_rules
$(foreach m,$(1),$(call gbuild_module_rules,$(m)))
endef

define dmake_module_rules
.PHONY: $(1) $(1).all $(1).deliver $(1).clean

$(1): bootstrap fetch
	cd $(1) && unset MAKEFLAGS && \
        $(SOLARENV)/bin/build.pl -P$(BUILD_NCPUS) -- -P$(GMAKE_PARALLELISM)

$(1).all: bootstrap fetch
	cd $(1) && unset MAKEFLAGS && \
        $(SOLARENV)/bin/build.pl -P$(BUILD_NCPUS) --all -- -P$(GMAKE_PARALLELISM)

$(1).deliver: $(1)
	cd $(1) && $(SOLARENV)/bin/deliver.pl

$(1).clean:
	cd $(1) && $(SOLARENV)/bin/deliver.pl -delete
	rm -fr $(1)/$(INPATH)

endef

define dmake_modules_rules
$(foreach m,$(1),$(call dmake_module_rules,$(m)))
endef

#
# Partial Build
#
$(eval $(call gbuild_modules_rules,$(gbuild_modules)))

$(eval $(call dmake_modules_rules,$(dmake_modules)))

#
# Clean
#
clean: clean-host clean-build

clean-host:
	rm -fr $(DEVINSTALLDIR)
	rm -fr $(SOLARVER)/$(INPATH) # not necessarily below SRCDIR
	rm -fr $(SRCDIR)/*/$(INPATH)
	rm -fr install

clean-build:
ifeq ($(CROSS_COMPILING),YES)
	rm -rf $(SOLARVER)/$(INPATH_FOR_BUILD) # not necessarily below SRCDIR
	rm -rf $(SRCDIR)/*/$(INPATH_FOR_BUILD)
endif

#
# Distclean
#
distclean : clean
ifeq ($(BUILD_DMAKE),YES)
	(if [ -f dmake/Makefile ] ; then $(GNUMAKE) -j $(GMAKE_PARALLELISM) -C dmake distclean; fi) && \
	rm -f solenv/*/bin/dmake*
endif
	rm -fr config_host.mk config_build.mk aclocal.m4 autom4te.cache \
    bin/repo-list config.log config.status configure \
	ooo.lst post_download post_download.log \
	config_host.mk.last set_soenv.stamp src.downloaded warn
	find $(SOLARENV)/gdb -name "*.pyc" -exec rm {} \;

#
# custom command
#
ifneq ( $(MAKECMDGOALS),cmd)
cmd:
	echo "custom cmd" && ( $(cmd) )

endif

ifneq ($(filter-out clean distclean,$(MAKECMDGOALS)),)
#
# Fetch
#
fetch: src.downloaded

src.downloaded : Makefile.top download ooo.lst bin/repo-list
ifeq ($(DO_FETCH_TARBALLS),YES)
	@./download $(SRCDIR)/ooo.lst && touch $@
else
	@echo "Automatic fetching of external tarballs is disabled."
endif

#
# Bootstap
#
bootstrap: $(WORKDIR)/bootstrap

$(WORKDIR)/bootstrap:
	@cd $(SRCDIR) && ./bootstrap
	@mkdir -p $(dir $@) && touch $@

#
# Build
#
build-packimages: bootstrap fetch $(if $(filter $(INPATH),$(INPATH_FOR_BUILD)),,cross-toolset)
ifeq ($(DISABLE_SCRIPTING),TRUE)
# We must get the headers from vbahelper "delivered" because
# as we don't link to any libs from there they won't otherwise be, or
# something. And we still do include those headers always even if the
# libs aren't built in the --disable-scripting case. (Ifdefs for
# DISABLE_SCRIPTING will be added to the code later as necessary.)
	$(GNUMAKE) vbahelper
endif
ifeq ($(DISABLE_DBCONNECTIVITY),TRUE)
# Ditto for dbconnectivity in the --disable-database-connectivity case
	cd connectivity && sed -e 's/^\(export [A-Z0-9_]*=\)\(.*\)$$/\1"\2"/' <../config_host.mk >conftmp.sh && . conftmp.sh && rm conftmp.sh && $(SOLARENV)/bin/deliver.pl
endif
	cd packimages && unset MAKEFLAGS && \
		$(SOLARENV)/bin/build.pl -P$(BUILD_NCPUS) --all -- -P$(GMAKE_PARALLELISM) && \
		$(GNUMAKE) -j $(GMAKE_PARALLELISM) $(GMAKE_OPTIONS)

build: build-packimages
ifeq ($(OS_FOR_BUILD),WNT)
	cd instsetoo_native && unset MAKEFLAGS && $(SOLARENV)/bin/build.pl
else
	cd instsetoo_native && unset MAKEFLAGS && \
        $(SOLARENV)/bin/build.pl -P$(BUILD_NCPUS) -- -P$(GMAKE_PARALLELISM)
endif

cross-toolset: bootstrap fetch
	cd cross_toolset && $(GNUMAKE) -j $(GMAKE_PARALLELISM) $(GMAKE_OPTIONS)


#
# Install
#

install:
	echo "Installing in $(INSTALLDIR)..." && \
	ooinstall "$(INSTALLDIR)" && \
	echo "" && \
	echo "Installation finished, you can now execute:" && \
	echo "$(INSTALLDIR)/program/soffice"

install-strip:
	echo "Installing and stripping binaries in $(INSTALLDIR)..." && \
	ooinstall --strip "$(INSTALLDIR)" && \
	echo "" && \
	echo "Installation finished, you can now execute:" && \
	echo "$(INSTALLDIR)/program/soffice"

dev-install: build
	@rm -rf $(DEVINSTALLDIR)
	@mkdir $(DEVINSTALLDIR)
ifeq ($(DISABLE_LINKOO),TRUE)
	@ooinstall $(DEVINSTALLDIR)/opt
	@install-gdb-printers -L
else
	@ooinstall -l $(DEVINSTALLDIR)/opt
endif
	@rm -f $(SRCDIR)/install && ln -s $(DEVINSTALLDIR)/opt/ $(SRCDIR)/install

distro-pack-install: install
	$(SRCDIR)/bin/distro-install-clean-up
	$(SRCDIR)/bin/distro-install-desktop-integration
	$(SRCDIR)/bin/distro-install-sdk
	$(SRCDIR)/bin/distro-install-file-lists

id:
	@create-ids

tags:
	@create-tags

docs:
	@mkdocs.sh $(SRCDIR)/docs $(SOLARENV)/inc/doxygen.cfg

findunusedcode:
	@which callcatcher > /dev/null 2>&1 || \
	    (echo "callcatcher not installed" && false)
	@sed -e s,$$INPATH,callcatcher,g $(SRCDIR)/config_host.mk | sed -e s,"export OOO_JUNIT_JAR=.*","export OOO_JUNIT_JAR=",g > $(SRCDIR)/config_host_callcatcher.mk
	@echo unexport ARCH_FLAGS >> $(SRCDIR)/config_host_callcatcher.mk
	@echo unexport CFLAGS >> $(SRCDIR)/config_host_callcatcher.mk
	@echo unexport CXXFLAGS >> $(SRCDIR)/config_host_callcatcher.mk
	@mkdir -p $(SRCDIR)/solenv/callcatcher/bin && \
	    ln -sf $(SRCDIR)/solenv/$(INPATH)/bin/dmake \
		$(SRCDIR)/solenv/callcatcher/bin/dmake
	@$(GNUMAKE) -f $(SOLARENV)/bin/callcatcher.Makefile findunusedcode
	@grep ::.*\( unusedcode.all \
              | grep -v ^Atom \
              | grep -v ^atom:: \
              | grep -v ^boost:: \
              | grep -v ^CIcc \
              | grep -v ^CLuceneError:: \
              | grep -v ^cppu:: \
              | grep -v ^Dde \
              | grep -v ^graphite2:: \
              | grep -v ^jvmaccess:: \
              | grep -v ^libcdr:: \
              | grep -v ^libcmis:: \
              | grep -v ^libmspub:: \
              | grep -v ^libvisio:: \
              | grep -v ^libwpg:: \
              | grep -v ^libwps_tools_win:: \
              | grep -v ^lucene:: \
              | grep -v ^Matrix3d:: \
              | grep -v ^salhelper:: \
              | grep -v ^VSDInternalStream:: \
              | grep -v ^WP1 \
              | grep -v ^WP3 \
              | grep -v ^WP42 \
              | grep -v ^WP6 \
              | grep -v ^WPG \
              | grep -v ^WPS \
              | grep -v WPX \
              > unusedcode.easy

check: dev-install subsequentcheck

subsequentcheck :| $(if $(filter-out subsequentcheck,$(MAKECMDGOALS)),dev-install)
	$(GNUMAKE) -j $(GMAKE_PARALLELISM) $(GMAKE_OPTIONS) -f Makefile.post $@

unitcheck:
	$(GNUMAKE) -j $(GMAKE_PARALLELISM) $(GMAKE_OPTIONS) -f Makefile.post $@

slowcheck:
	$(GNUMAKE) -j $(GMAKE_PARALLELISM) $(GMAKE_OPTIONS) -f Makefile.post $@

debugrun:
	$(GNUMAKE) -j $(GMAKE_PARALLELISM) $(GMAKE_OPTIONS) -f Makefile.post $@

endif # not clean or distclean


#########################
# help
#
.PHONY: help
help:
	@cat $(SRCDIR)/solenv/gbuild/gbuild.help.txt
	@true


# vim: set noet sw=4 ts=4: