##
## Copyright 2010, Texas Instruments.   All rights reserved.
##
## Redistribution and use in source and binary forms, with or without
## modification, are permitted provided that the following conditions
## are met:
##  * Redistributions of source code must retain the above copyright
##    notice, this list of conditions and the following disclaimer.
##  * Redistributions in binary form must reproduce the above copyright
##    notice, this list of conditions and the following disclaimer in the
##    documentation and/or other materials provided with the distribution.
##
## THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS ``AS IS'' AND ANY
## EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
## IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
## PURPOSE ARE DISCLAIMED.  IN NO EVENT SHALL THE COPYRIGHT OWNER OR
## CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
## EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
## PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
## PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY
## OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
## (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
## OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
##

ifeq ($(TARGET_BOARD_PLATFORM),omap4)

LOCAL_PATH := $(call my-dir)

define local-transform-link-to-target
@echo "$(if $(PRIVATE_IS_HOST_MODULE),host,target) Prebuilt: $(PRIVATE_MODULE) ($@)"
$(hide) rm -f $@
$(hide) ln -s `basename $<` $@
endef

# find the library version number
library_version := $(shell \
    echo "$(wildcard $(LOCAL_PATH)/vendor/lib/libIMGegl.so.*)" | \
    sed "s%.*libIMGegl[.]so[.]\(.*\)%\1%" \
    )

include $(CLEAR_VARS)
LOCAL_MODULE := pvr-bin
LOCAL_MODULE_TAGS := eng
LOCAL_PREBUILT_EXECUTABLES := \
    bin/pvrsrvinit
include $(BUILD_MULTI_PREBUILT)


include $(CLEAR_VARS)
LOCAL_MODULE := vendor_libs
LOCAL_MODULE_TAGS := eng
LOCAL_MODULE_CLASS := SHARED_LIBRARIES
LOCAL_MODULE_PATH := $(TARGET_OUT)/vendor/lib
copy_lib_files_from := \
    $(wildcard $(LOCAL_PATH)/vendor/lib/*.so.*) \
    $(wildcard $(LOCAL_PATH)/vendor/lib/egl/*.so.*) \
    $(wildcard $(LOCAL_PATH)/vendor/lib/hw/*.so.*)
copy_lib_files_to := $(copy_lib_files_from:$(LOCAL_PATH)/%=$(TARGET_OUT)/%)
$(copy_lib_files_to): $(TARGET_OUT)/% : $(LOCAL_PATH)/% | $(ACP)
	$(transform-prebuilt-to-target)
libs_to_link := $(copy_lib_files_from:$(LOCAL_PATH)/%.$(library_version)=$(TARGET_OUT)/%)
$(libs_to_link): % : %.$(library_version) | $(ACP)
	$(local-transform-link-to-target)
ALL_PREBUILT += $(copy_lib_files_to)
ALL_PREBUILT += $(libs_to_link)
include $(BUILD_MULTI_PREBUILT)

PRODUCT_COPY_FILES += \
        device/ti/proprietary-open/graphics/omap4/license.txt:root/license.txt

endif
