#
# \brief  Download and setup OSS sources
# \author Sebastian Sumpf
# \date   2012-08-30

CONTRIB_DIR  = contrib
DOWNLOAD_DIR = download
VERBOSE     ?= @
ECHO         = @echo
CC          ?= gcc
PATCHES      := $(shell find patches -name \*.patch)

OSS      = oss-v4.2-build2006-src-bsd
OSS_TBZ2 = $(OSS).tar.bz2
OSS_URL  = http://www.4front-tech.com/developer/sources/stable/bsd/$(OSS_TBZ2)


# needed for preparation
CONTENT_SETUP = $(addprefix setup/,srcconf.c srcconf_freebsd.inc srcconf_vxworks.inc gen_driver_freebsd.inc)
CONTENT += $(CONTENT_SETUP)

# oss framework
CONTENT_FRAMEWORK = $(addprefix kernel/framework/include/,oss_config.h oss_memblk.h \
                                oss_version.h audio_core.h mixer_core.h oss_calls.h \
                                internal.h oss_pci.h spdif.h midi_core.h grc3.h ac97.h \
                                ossddk/oss_exports.h ossddk/oss_limits.PHh ossddk/ossddk.h)
CONTENT += $(CONTENT_FRAMEWORK)

# oss core
CONTENT_CORE = $(addprefix kernel/framework/osscore/,oss_memblk.c oss_core_options.c \
                                                     oss_core_services.c)
CONTENT += $(CONTENT_CORE)
CONTENT += include/soundcard.h kernel/drv/.config

# audio core
CONTENT_AUDIO = $(addprefix kernel/framework/audio/,oss_audio_core.c oss_spdif.c oss_audiofmt.c \
                                                    ulaw.h audiocnv.inc oss_grc3.c fltdata2_h.inc \
                                                    grc3code.inc grc3inc.inc)
CONTENT += $(CONTENT_AUDIO)

# mixer core
CONTENT_MIXER = $(addprefix kernel/framework/mixer/,oss_mixer_core.c mixerdefs.h)
CONTENT += $(CONTENT_MIXER)

# vmixer core
CONTENT_VMIX = $(addprefix kernel/framework/vmix_core/,vmix_core.c vmix_input.c vmix.h db_scale.h \
                                                       vmix_import.inc  vmix_import_int.inc \
                                                       rec_export.inc rec_export_int.inc \
                                                       vmix_output.c outexport.inc outexport_int.inc \
                                                       playmix.inc playmix_int.inc playmix_src.inc)
CONTENT += $(CONTENT_VMIX)

# midi core
CONTENT_MIDI = $(addprefix kernel/framework/midi/,oss_midi_core.c oss_midi_timers.c oss_midi_mapper.c \
                                                  oss_midi_queue.c)
CONTENT += $(CONTENT_MIDI)

# AC97 core
CONTENT += kernel/framework/ac97

# drivers
CONTENT_DRV += oss_ich oss_hdaudio oss_audiopci
CONTENT += $(addprefix kernel/drv/,$(CONTENT_DRV))


#
# Utility to check if a tool is installed
#
check_tool = $(if $(shell which $(1)),,$(error Need to have '$(1)' installed.))

$(call check_tool,wget)
$(call check_tool,patch)

#
# Print help information by default
#
help:
	$(ECHO)
	$(ECHO) "Download integrate OSS sources with Genode"
	$(ECHO)
	$(ECHO) "--- available commands ---"
	$(ECHO) "prepare  - download and integrate OSS source code"
	$(ECHO) "clean    - remove contib sources except downloaded archives"
	$(ECHO) "cleanall - remove contib sources and downloaded archives"
	$(ECHO)

#
# Build and execute 'srcconf' utility, build 'devices.list'
#
setup:
	$(VERBOSE)ln -sf srcconf_freebsd.inc $(CONTRIB_DIR)/setup/srcconf_linux.inc
	$(VERBOSE)ln -sf gen_driver_freebsd.inc $(CONTRIB_DIR)/setup/gen_driver_linux.inc
	$(VERBOSE)mkdir -p $(CONTRIB_DIR)/kernel/framework/include
	$(VERBOSE)mkdir -p $(CONTRIB_DIR)/kernel/OS/Linux
	$(VERBOSE)$(CC) -g -I$(CONTRIB_DIR)/setup -o srcconf $(CONTRIB_DIR)/setup/srcconf.c
	$(VERBOSE)cat `find $(CONTRIB_DIR)/kernel/drv -name .devices`| grep -v '^#' > $(CONTRIB_DIR)/devices.list
	$(VERBOSE)cd $(CONTRIB_DIR) && ../srcconf
	$(VERBOSE)cd $(CONTRIB_DIR)/target/build ; for f in *.c; do mv $$f pci_$$f; done
	$(VERBOSE)rm srcconf

prepare: $(CONTRIB_DIR)/.prepared setup

$(CONTRIB_DIR)/.prepared: Makefile
$(CONTRIB_DIR)/.prepared: $(DOWNLOAD_DIR)/$(OSS_TBZ2)
	$(ECHO) "extracting source code to '$(CONTRIB_DIR)'"
	$(VERBOSE)tar xfj $< --transform "s/$(OSS)/$(CONTRIB_DIR)/" $(addprefix $(OSS)/,$(CONTENT))
	$(VERBOSE)touch $@
	$(ECHO) "applying patches to '$(CONTRIB_DIR)/'"
	$(VERBOSE)for i in $(PATCHES); do patch -d $(CONTRIB_DIR) -p1 < $$i; done


$(DOWNLOAD_DIR):
	$(VERBOSE)mkdir -p $@

$(DOWNLOAD_DIR)/$(OSS_TBZ2): $(DOWNLOAD_DIR)
	$(ECHO) "downloading source code to '$@'"
	$(VERBOSE)cd $(DOWNLOAD_DIR); wget -c $(OSS_URL)
	$(VERBOSE)touch $@

clean:
	$(VERBOSE)rm -rf $(CONTRIB_DIR)

cleanall: clean
	$(VERBOSE)rm -rf $(DOWNLOAD_DIR)