
###########################################################################################
#
# Makefile called externally to build the SDK, alone or to be used in an application.
# ----------------------------------------------------------------------------------
# Author : aurelien.morelle@parrot.com
# Date   : 2007/05/16
#
# Builds libraries and examples.
#
# Needs some variables to be passed for it to know what to do.
# Variables definitions tests are done in varcontrol.makefile
#
###########################################################################################


                               ##############################                              
###########################################################################################
# Variables definitions management
###########################################################################################
include varcontrol.makefile
###########################################################################################
                               ##############################                              


#
# At that point, following global variables are defined :
# a : always / c : conditional

#	(a) NO_COM
#	(a) USE_BLUEZ
#	(a) USE_SDK
#	(a) RELEASE_BUILD

#	(c) SDK_VERSION
#	(c) PROJECT
#	(c) FF_ARCH


                               ##############################                              
###########################################################################################
# System variable definitions
###########################################################################################
include sysvar.makefile
###########################################################################################
                               ##############################                              


#
# At that point, following global variables are defined :
# a : always / c : conditional

#	(a) OS_TARGET_DIR
#	(a) VLIB_TARGET_DIR
#	(c) COM_TARGET_DIR
#	(c) CODEC_TARGET_DIR
#	(c) JPEG_TARGET_DIR
#	(c) SDK_TARGET_DIR


                               ##############################                              
###########################################################################################
# Main rules
###########################################################################################

TARGETS=vlib parrotOS_core parrotOS_utils parrotOS_drivers parrotOS_devs parrotOS_codec libplf sdk lib app

define ADD_RULE_TEMPLATE
  ifeq ($$(USE_$(shell echo $(1) | tr "a-z" "A-Z")),yes)
    TO_BUILD+=build_$(1)
  endif
endef

# Add rule for each target
$(foreach target,$(TARGETS),$(eval $(call ADD_RULE_TEMPLATE,$(target))))

.PHONY: $(foreach target,$(TARGETS),build_$(target) clean_$(target))

all $(MAKECMDGOALS): $(TO_BUILD)
	@if [ $(MAKECMDGOALS) ] && [ $(MAKECMDGOALS) = check ] ; then $(SDK_SOURCE_DIR)/Build/cvsstatus.sh $(SDK_SOURCE_DIR)/Build END ; fi

before_check:
	@if [ $(MAKECMDGOALS) ] && [ $(MAKECMDGOALS) = check ] ; then rm -rf *.log ; fi

define GENERIC_RULES_TEMPLATE
  ifneq ($(1),dll)
    build_$(1): before_check
	@$(MAKE) -f $(1).makefile $(MAKECMDGOALS)
  endif
endef

build_dll: before_check
	@$(MAKE) -f app.makefile $(MAKECMDGOALS)


# Build rules for each target
$(foreach target,$(TARGETS),$(eval $(call GENERIC_RULES_TEMPLATE,$(target))))
###########################################################################################
                               ##############################                              


                               ##############################                              
###########################################################################################
# Update generic flags
###########################################################################################
FLAGS_FILTER_OUT=-O0 -O1 -O2 -O3 -Os -fno-rtti -frtti -fvtable-gc -Winline -Woverloaded-virtual -lstdc++
ifneq ($(USE_RTMON),yes)
  FLAGS_FILTER_OUT+=-g
endif

DEFINE_FLAGS=USE_WIFI USE_CAMIF USE_BASEBAND NO_COM USE_SERIAL USE_VLIB USE_MINGW32 USE_DLL USE_LINUX USE_ELINUX USE_PARROTOS_CORE USE_PARROTOS_UTILS USE_PARROTOS_DRIVERS USE_PARROTOS_DEVS USE_PARROTOS_CODEC USE_LIBPLF USE_BROADCOM USE_IWLIB USE_ANDROID


ifeq ($(USE_ELINUX),yes)
   include elinux.makefile
else
   GENERIC_CFLAGS+= -Wall
endif

ifeq ($(USE_LIBPLF),yes)
   GENERIC_CFLAGS+= -DOS_LINUX
endif

GENERIC_CFLAGS+=-Wall 
#-Werror -Wfatal-errors -Wno-unused-variable

GENERIC_LDFLAGS+=-Wl,--warn-common

ifeq ("$(BUILD_MODE)","PROD_MODE")
  GENERIC_CFLAGS+=-O3 -DCOMPIL_MODE_PROD
  GENERIC_CFLAGS:=$(filter-out -DNDEBUG,$(GENERIC_CFLAGS)) -DNDEBUG
  GENERIC_LDFLAGS+=-O3
  ifeq ($(USE_RTMON),yes)
    GENERIC_CFLAGS+=-g
    GENERIC_LDFLAGS+=-g
  endif
endif
ifeq ("$(BUILD_MODE)","DEBUG_MODE")
  GENERIC_CFLAGS+=-g -O0 -DDEBUG_MODE -DDEBUG -D_DEBUG
  GENERIC_LDFLAGS+=-g -O0
endif

ifeq ($(USE_NDS),yes)
    GENERIC_CFLAGS+=-D__NDS__ -DUSE_NDS
    ifeq ($(NDS_CPU),ARM7)
      GENERIC_CFLAGS+=-DARM7 -DSDK_ARM7 -mcpu=arm7tdmi -mtune=arm7tdmi
      GENERIC_LDFLAGS+=-specs=ds_arm7.specs
    endif
    ifeq ($(NDS_CPU),ARM9)
      GENERIC_CFLAGS+=-DARM9 -DSDK_ARM9 -mtune=arm9tdmi -march=armv5te
      GENERIC_LDFLAGS+=-specs=ds_arm9.specs
    endif
    GENERIC_CFLAGS+=-fomit-frame-pointer -ffast-math
    GENERIC_LDFLAGS+=-mno-fpu -Wl,-Map,.map
else
    ifeq ($(USE_ELINUX),yes)    
      GENERIC_CFLAGS+=-D_ELINUX=$(USE_ELINUX) -D__elinux__ -D__ELINUX__ -DPARROT5
    else
	     ifneq ($(USE_MINGW32),yes)
		     GENERIC_CFLAGS+=-D__linux__
		
           ifeq ($(USE_IPHONE),yes)
		        GENERIC_CFLAGS+=-D__MACOSX__ -std=gnu99
		        ifeq ($(IPHONE_PLATFORM),iphoneos)
		           GENERIC_CFLAGS+=-arch armv6
		        else  
		           GENERIC_CFLAGS+=-arch i386
		        endif
		     else  
		        ifeq ($(USE_LINUX), yes)        
			       GENERIC_CFLAGS+=-D__LINUX__
              else
                 ifeq ($(USE_ANDROID),yes)
						  TARGET_arm_release_CFLAGS :=  -O2 \
								-fomit-frame-pointer \
								-fstrict-aliasing    \
								-funswitch-loops     \
								-finline-limit=300

						  TARGET_arm_debug_CFLAGS := $(TARGET_arm_release_CFLAGS) \
								-fno-omit-frame-pointer \
								-fno-strict-aliasing

						  GENERIC_CFLAGS+= $(TARGET_arm_debug_CFLAGS) \
								 -fstack-protector \
								 -fno-short-enums \
								 -D__ARM_ARCH_5__ -D__ARM_ARCH_5T__ \
								 -D__ARM_ARCH_5E__ -D__ARM_ARCH_5TE__
                 endif
		        endif
	        endif
        endif
	   endif
endif

GENERIC_CFLAGS+=-DTARGET_CPU_ARM=$(TARGET_CPU_ARM) -DTARGET_CPU_X86=$(TARGET_CPU_X86)

ifeq ("$(USE_MEMPROT)","yes")
  GENERIC_CFLAGS+=-fno-common -mlong-calls
endif

ifeq ("$(USE_PVSP)","yes")
  GENERIC_CFLAGS+=-DBLUES_SUPPORT_PVSP_BLOCK
endif

ifeq ("$(USE_BONJOUR)","yes")
  GENERIC_CFLAGS+=				\
	-DMDNS_DEBUGMSGS=0			\
	-DMDNS_LOG_ANSWER_SUPPRESSION_TIMES=0	\
	-DCOMPILER_LIKES_PRAGMA_MARK=0		\
	-DHAVE_IPV6=0				\
	-DUSES_NETLINK=0			\
	-DTARGET_OS_LINUX=1			\
	-DNOT_HAVE_DAEMON=1			\
	-Dsigset_t=cyg_uint32
endif

define ADD_DEFINE_FLAG_TEMPLATE
  ifeq ($$($(1)),yes)
    GENERIC_CFLAGS+=-D$(1)
  endif
endef

# Add define flags
$(foreach flag,$(DEFINE_FLAGS),$(eval $(call ADD_DEFINE_FLAG_TEMPLATE,$(flag))))

# All that needs to be exported
########################
export GENERIC_CFLAGS
export GENERIC_LDFLAGS
export GENERIC_ARFLAGS=rcs
###########################################################################################
                               ##############################                              

