# *********************************************************************
#
#  $Id: GNUmakefile 62287 2024-08-27 07:55:18Z seb $
#
#  GNU Makefile for linux and Mac OS X
#
#  - - - - - - - - - License information: - - - - - - - - -
#
#  Copyright (C) 2011 and beyond by Yoctopuce Sarl, Switzerland.
#
#  1) If you have obtained this file from www.yoctopuce.com using
#     a valid customer account established in your proper name,
#     Yoctopuce Sarl (hereafter Licensor) licenses to you (hereafter
#     Licensee) the right to use, modify, copy, and integrate this
#     source file into your own solution for the sole purpose of
#     interfacing a Yoctopuce product integrated into Licensee's
#     solution.
#
#     You should refer to the license agreement accompanying this
#     Software for additional information regarding your rights
#     and obligations.
#
#     THE SOFTWARE AND DOCUMENTATION ARE PROVIDED "AS IS" WITHOUT
#     WARRANTY OF ANY KIND, EITHER EXPRESS OR IMPLIED, INCLUDING
#     WITHOUT LIMITATION, ANY WARRANTY OF MERCHANTABILITY, FITNESS
#     FOR A PARTICULAR PURPOSE, TITLE AND NON-INFRINGEMENT. IN NO
#     EVENT SHALL LICENSOR BE LIABLE FOR ANY INCIDENTAL, SPECIAL,
#     INDIRECT OR CONSEQUENTIAL DAMAGES, LOST PROFITS OR LOST DATA,
#     COST OF PROCUREMENT OF SUBSTITUTE GOODS, TECHNOLOGY OR
#     SERVICES, ANY CLAIMS BY THIRD PARTIES (INCLUDING BUT NOT
#     LIMITED TO ANY DEFENSE THEREOF), ANY CLAIMS FOR INDEMNITY OR
#     CONTRIBUTION, OR OTHER SIMILAR COSTS, WHETHER ASSERTED ON THE
#     BASIS OF CONTRACT, TORT (INCLUDING NEGLIGENCE), BREACH OF
#     WARRANTY, OR OTHERWISE.
#
#  2) If you have obtained this file from any other source, you
#     are not entitled to use it, read it or create any derived
#     material. You should delete this file immediately.
#
# ********************************************************************

ifeq ($(OS),Windows_NT)
UNAME := Windows
ARCH  := "windows"
CCS_INSTALL_DIR ?= c:/ti/ccs930
XDCTOOLS ?= $(CCS_INSTALL_DIR)/xdctools_3_60_02_34_core/bin/
RM = $(XDCTOOLS)rm
MKDIR = $(XDCTOOLS)mkdir
else
UNAME := $(shell uname)
ARCH  := $(shell uname -m| sed -e s/i.86/i386/ -e s/arm.*/arm/)
RM = rm
MKDIR = mkdir
endif

MIPS_TARGET_ROOT = $(TARGET_MIPS)
MIPSEL_TARGET_ROOT = $(TARGET_MIPSEL)


.SECONDARY:

#ALL directory definitions
DIR_WIN32   = windows/
DIR_WIN64   = windows/amd64/
DIR_WINARM  = windows/arm64/
DIR_I386 	= linux/32bits/
DIR_X64 	= linux/64bits/
DIR_ARMEL 	= linux/armel/
DIR_ARMHF 	= linux/armhf/
DIR_AARCH64	= linux/aarch64/
DIR_MIPS 	= linux/mips/
DIR_MIPSEL 	= linux/mipsel/
DIR_OSX 	= osx/

OBJDIR_WIN32 	= $(DIR_WIN32)obj/
OBJDIR_WIN64    = $(DIR_WIN64)obj/
OBJDIR_WINARM   = $(DIR_WINARM)obj/
OBJDIR_I386 	= $(DIR_I386)obj/
OBJDIR_X64 		= $(DIR_X64)obj/
OBJDIR_ARMEL 	= $(DIR_ARMEL)obj/
OBJDIR_ARMHF 	= $(DIR_ARMHF)obj/
OBJDIR_AARCH64	= $(DIR_AARCH64)obj/
OBJDIR_MIPS 	= $(DIR_MIPS)obj/
OBJDIR_MIPSEL 	= $(DIR_MIPSEL)obj/
OBJDIR_OSX 		= $(DIR_OSX)obj/

#DEF_SSL_GCC  = -DNO_YSSL
#DEF_SSL_WIN  = /DNO_YSSL
DEF_SSL_GCC  =
DEF_SSL_WIN  =

#CC compiler for each arch
CC_WIN32 = cl
CC_WIN64 = cl
CC_WINARM = cl
CC_I386 = gcc -std=gnu99
CC_X64 = gcc -std=gnu99
ifdef TOOLCHAIN_QARM
CC_ARMEL = $(TOOLCHAIN_QARM)/bin/arm-none-linux-gnueabi-gcc
else
CC_ARMEL = gcc
endif
ifdef TOOLCHAIN_ARMHF
CC_ARMHF = $(TOOLCHAIN_ARMHF)/bin/arm-linux-gnueabihf-gcc -std=gnu99
else
CC_ARMHF = gcc -std=gnu99
endif
ifdef TOOLCHAIN_AARCH64
CC_AARCH64 = $(TOOLCHAIN_AARCH64)/bin/arm-linux-gnueabihf-gcc -std=gnu99
else
CC_AARCH64 = gcc -std=gnu99
endif
CC_MIPS = mips-openwrt-linux-gcc -std=gnu99
CC_MIPSEL = mipsel-openwrt-linux-gcc -std=gnu99
CC_OSX = gcc


#CPP compiler for each arch
CPP_WIN32 = cl
CPP_WIN64 = cl
CPP_WINARM = cl
CPP_I386 = g++
CPP_X64 = g++
ifdef TOOLCHAIN_QARM
CPP_ARMEL = $(TOOLCHAIN_QARM)/bin/arm-none-linux-gnueabi-g++
else
CPP_ARMEL = g++
endif
ifdef TOOLCHAIN_ARMHF
CPP_ARMHF = $(TOOLCHAIN_ARMHF)/bin/arm-linux-gnueabihf-g++
else
CPP_ARMHF = g++
endif
ifdef TOOLCHAIN_AARCH64
CPP_AARCH64 = $(TOOLCHAIN_AARCH64)/bin/arm-linux-gnueabihf-g++
else
CPP_AARCH64 = g++
endif
CPP_MIPS = mips-openwrt-linux-g++
CPP_MIPSEL = mipsel-openwrt-linux-g++
CPP_OSX = g++


#CPP compiler for each arch
STRIP_WIN32 = strip
STRIP_WIN64 = strip
STRIP_WINARM = strip
STRIP_I386 = strip
STRIP_X64 = strip
ifdef TOOLCHAIN_QARM
STRIP_ARMEL = $(TOOLCHAIN_QARM)/bin/arm-none-linux-gnueabi-strip
else
STRIP_ARMEL = strip
endif
ifdef TOOLCHAIN_ARMHF
STRIP_ARMHF = $(TOOLCHAIN_ARMHF)/bin/arm-linux-gnueabihf-strip
else
STRIP_ARMHF = strip
endif
ifdef TOOLCHAIN_AARCH64
STRIP_AARCH64 = $(TOOLCHAIN_AARCH64)/bin/arm-linux-gnueabihf-strip
else
STRIP_AARCH64 = strip
endif
STRIP_MIPS = mips-openwrt-linux-strip
STRIP_MIPSEL = mipsel-openwrt-linux-strip
STRIP_OSX = strip


GLOBAL_OPT = -Wall $(DEF_SSL_GCC)
GLOBAL_OPT_WIN = /nologo /permissive- /GS /W3 /WX- /O2 /Oi /Oy- /GL /Gm- /sdl /EHsc /MT /GS /Gy /Zc:inline /fp:precise /Zc:wchar_t /Zc:forScope /analyze- /guard:cf /Gd $(DEF_SSL_WIN)

OPTS_WIN32 =  $(GLOBAL_OPT_WIN)
OPTS_WIN64 = $(GLOBAL_OPT_WIN)
OPTS_WINARM = $(GLOBAL_OPT_WIN)
OPTS_I386 = -O2 -m32 -march=i586 -mpclmul -msse2 -maes -D_GNU_SOURCE -Wno-stringop-overflow
OPTS_X64 = -O2 -m64 -D_GNU_SOURCE -Wno-stringop-overflow
OPTS_ARMEL = -I$(STAGING_QARM)/usr/include/ -O2 -mfloat-abi=soft -march=armv5 -marm -DBUILD_ARMEL -D_XOPEN_SOURCE=500 -D_BSD_SOURCE
OPTS_ARMHF = -I$(STAGING_ARMHF)/usr/include/ -O2 -mfloat-abi=hard -march=armv6 -marm -DBUILD_ARMHF
ifdef TOOLCHAIN_AARCH64
OPTS_AARCH64 = -I$(STAGING_AARCH64)/usr/include/ $(OPTS_DBG) -march=native -DBUILD_AARCH64
else
OPTS_AARCH64 = -march=native -DBUILD_AARCH64
endif
OPTS_MIPS = -DCPU_BIG_ENDIAN -O2 -I$(MIPS_TARGET_ROOT)/usr/include/
OPTS_MIPSEL = -O2 -I$(MIPSEL_TARGET_ROOT)/usr/include/
OPTS_OSX = -O1 -m64

RC =  "rc.exe"
LINKER_WIN32 = link
LINKER_WIN64 = link
LINKER_WINARM = link

#link optionsfor each arch
LINK_WITH_WIN64 = /MACHINE:X64 /LIBPATH:"$(WINDOWS_SDK_64)Lib\\$(WIN_SDK_VERS)\ucrt\\x64" /LIBPATH:"$(WINDOWS_SDK_64)Lib\\$(WIN_SDK_VERS)\um\\x64"
LINK_WITH_WINARM = /MACHINE:ARM64 /LIBPATH:"$(WINDOWS_SDK_64)Lib\\$(WIN_SDK_VERS)\ucrt\\arm64" /LIBPATH:"$(WINDOWS_SDK_64)Lib\\$(WIN_SDK_VERS)\um\\arm64"
LINK_WIN32 =  /NOLOGO /INCREMENTAL:NO "kernel32.lib" "user32.lib" "gdi32.lib" "winspool.lib" "comdlg32.lib" "Advapi32.lib" "shell32.lib" "ole32.lib" "oleaut32.lib" "uuid.lib" "odbc32.lib" "odbccp32.lib" "bcrypt.lib" /MANIFEST /MACHINE:X86 /ManifestFile:"$(OBJDIR_WIN32)VirtualHub.exe.intermediate.manifest"  /ALLOWISOLATION /MANIFESTUAC:"level='asInvoker' uiAccess='false'"  /SUBSYSTEM:CONSOLE",5.01" /OPT:REF /OPT:ICF /LTCG /TLBID:1 /DYNAMICBASE /NXCOMPAT
LINK_WIN64 =  $(LINK_WITH_WIN64)  /NOLOGO /INCREMENTAL:NO  "kernel32.lib" "user32.lib" "gdi32.lib" "winspool.lib" "comdlg32.lib" "advapi32.lib" "shell32.lib" "ole32.lib" "oleaut32.lib" "uuid.lib" "odbc32.lib" "odbccp32.lib" "bcrypt.lib" /ALLOWISOLATION /MANIFESTUAC:"level='asInvoker' uiAccess='false'" /SUBSYSTEM:CONSOLE /OPT:REF /OPT:ICF /LTCG /TLBID:1 /DYNAMICBASE /NXCOMPAT
LINK_WINARM =  $(LINK_WITH_WINARM)  /NOLOGO /INCREMENTAL:NO  "kernel32.lib" "user32.lib" "gdi32.lib" "winspool.lib" "comdlg32.lib" "advapi32.lib" "shell32.lib" "ole32.lib" "oleaut32.lib" "uuid.lib" "odbc32.lib" "odbccp32.lib" "bcrypt.lib" /ALLOWISOLATION /MANIFESTUAC:"level='asInvoker' uiAccess='false'" /SUBSYSTEM:CONSOLE /OPT:REF /OPT:ICF /LTCG /TLBID:1 /DYNAMICBASE /NXCOMPAT
LINK_I386 = -lm -lpthread -lusb-1.0
LINK_X64 = -lm -lpthread -lusb-1.0
LINK_ARMEL = -L$(STAGING_QARM)/usr/lib/ -lm -lpthread -lusb-1.0 -lrt
LINK_ARMHF = -L$(STAGING_ARMHF)/usr/lib/ -lm -lpthread -lusb-1.0 -lrt
ifdef TOOLCHAIN_AARCH64
LINK_AARCH64 = -L$(STAGING_AARCH64)/usr/lib/ -lm -lpthread -lusb-1.0 -lrt
else
LINK_AARCH64 = -lm -lpthread -lusb-1.0
endif
LINK_MIPS = -L$(MIPS_TARGET_ROOT)/usr/lib/ -lm -lpthread -lusb-1.0
LINK_MIPSEL = -L$(MIPSEL_TARGET_ROOT)/usr/lib/ -lm -lpthread -lusb-1.0
LINK_OSX = -framework IOKit -framework CoreFoundation


CMD_SRC = ../Sources/
YOCTO_SRC = ../Sources/cpplib/
YAPI_SRC    = $(YOCTO_SRC)yapi/

YAPI_OBJS = yapi.o ystream.o yprog.o ypkt_lin.o ypkt_win.o ypkt_osx.o yfifo.o ykey.o yhash.o yjson.o ytcp.o ymemory.o ythread.o yssl.o

YOCTO_OBJS = yocto_api.o\
	yocto_accelerometer.o \
	yocto_altitude.o \
	yocto_anbutton.o \
	yocto_arithmeticsensor.o \
	yocto_audioin.o \
	yocto_audioout.o \
	yocto_bluetoothlink.o \
	yocto_buzzer.o \
	yocto_carbondioxide.o \
	yocto_cellular.o \
	yocto_colorled.o \
	yocto_colorledcluster.o \
	yocto_colorsensor.o \
	yocto_compass.o \
	yocto_current.o \
	yocto_currentloopoutput.o \
	yocto_daisychain.o \
	yocto_digitalio.o \
	yocto_display.o \
	yocto_dualpower.o \
	yocto_files.o \
	yocto_genericsensor.o \
	yocto_gps.o \
	yocto_groundspeed.o \
	yocto_gyro.o \
	yocto_hubport.o \
	yocto_humidity.o \
	yocto_i2cport.o \
	yocto_inputcapture.o \
	yocto_inputchain.o \
	yocto_latitude.o \
	yocto_led.o \
	yocto_lightsensor.o \
	yocto_longitude.o \
	yocto_magnetometer.o \
	yocto_messagebox.o \
	yocto_micropython.o \
	yocto_motor.o \
	yocto_multiaxiscontroller.o \
	yocto_multicellweighscale.o \
	yocto_multisenscontroller.o \
	yocto_network.o \
	yocto_power.o \
	yocto_poweroutput.o \
	yocto_powersupply.o \
	yocto_pressure.o \
	yocto_proximity.o \
	yocto_pwminput.o \
	yocto_pwmoutput.o \
	yocto_pwmpowersource.o \
	yocto_quadraturedecoder.o \
	yocto_rangefinder.o \
	yocto_realtimeclock.o \
	yocto_refframe.o \
	yocto_relay.o \
	yocto_rfidreader.o \
	yocto_sdi12port.o \
	yocto_segmenteddisplay.o \
	yocto_serialport.o \
	yocto_servo.o \
	yocto_spectralchannel.o \
	yocto_spiport.o \
	yocto_steppermotor.o \
	yocto_temperature.o \
	yocto_threshold.o \
	yocto_tilt.o \
	yocto_tvoc.o \
	yocto_voc.o \
	yocto_voltage.o \
	yocto_voltageoutput.o \
	yocto_wakeupmonitor.o \
	yocto_wakeupschedule.o \
	yocto_watchdog.o \
	yocto_weighscale.o \
	yocto_wireless.o \


CMD_OBJS = \
	YModule.o \
	YSensor.o \
	YAccelerometer.o \
	YAltitude.o \
	YAnButton.o \
	YArithmeticSensor.o \
	YAudioIn.o \
	YAudioOut.o \
	YBluetoothLink.o \
	YBuzzer.o \
	YCarbonDioxide.o \
	YCellular.o \
	YColorLed.o \
	YColorLedCluster.o \
	YColorSensor.o \
	YCompass.o \
	YCurrent.o \
	YCurrentLoopOutput.o \
	YDaisyChain.o \
	YDataLogger.o \
	YDigitalIO.o \
	YDisplay.o \
	YDualPower.o \
	YFiles.o \
	YGenericSensor.o \
	YGps.o \
	YGroundSpeed.o \
	YGyro.o \
	YHubPort.o \
	YHumidity.o \
	YI2cPort.o \
	YInputCapture.o \
	YInputChain.o \
	YLatitude.o \
	YLed.o \
	YLightSensor.o \
	YLongitude.o \
	YMagnetometer.o \
	YMessageBox.o \
	YMicroPython.o \
	YMotor.o \
	YMultiAxisController.o \
	YMultiCellWeighScale.o \
	YMultiSensController.o \
	YNetwork.o \
	YPower.o \
	YPowerOutput.o \
	YPowerSupply.o \
	YPressure.o \
	YProximity.o \
	YPwmInput.o \
	YPwmOutput.o \
	YPwmPowerSource.o \
	YQuadratureDecoder.o \
	YRangeFinder.o \
	YRealTimeClock.o \
	YRefFrame.o \
	YRelay.o \
	YRfidReader.o \
	YSdi12Port.o \
	YSegmentedDisplay.o \
	YSerialPort.o \
	YServo.o \
	YSpectralChannel.o \
	YSpiPort.o \
	YStepperMotor.o \
	YTemperature.o \
	YThreshold.o \
	YTilt.o \
	YTvoc.o \
	YVoc.o \
	YVoltage.o \
	YVoltageOutput.o \
	YWakeUpMonitor.o \
	YWakeUpSchedule.o \
	YWatchdog.o \
	YWeighScale.o \
	YWireless.o \




MBEDTLS_OBJS_STAT = \
	aes.o \
	aesce.o \
	aesni.o \
	aria.o \
	asn1parse.o \
	asn1write.o \
	base64.o \
	bignum.o \
	bignum_core.o \
	camellia.o \
	ccm.o \
	chacha20.o \
	chachapoly.o \
	cipher.o \
	cipher_wrap.o \
	cmac.o \
	constant_time.o \
	ctr_drbg.o \
	debug.o \
	des.o \
	dhm.o \
	ecdh.o \
	ecdsa.o \
	ecjpake.o \
	ecp.o \
	ecp_curves.o \
	entropy.o \
	entropy_poll.o \
	error.o \
	gcm.o \
	hkdf.o \
	hmac_drbg.o \
	lmots.o \
	lms.o \
	md.o \
	md5.o \
	net_sockets.o \
	nist_kw.o \
	oid.o \
	padlock.o \
	pem.o \
	pk.o \
	pk_ecc.o \
	pkcs12.o \
	pkcs5.o \
	pkcs7.o \
	pkparse.o \
	pkwrite.o \
	pk_wrap.o \
	platform.o \
	platform_util.o \
	poly1305.o \
	psa_crypto.o \
	psa_crypto_aead.o \
	psa_crypto_cipher.o \
	psa_crypto_client.o \
	psa_crypto_driver_wrappers_no_static.o \
	psa_crypto_ecp.o \
	psa_crypto_ffdh.o \
	psa_crypto_hash.o \
	psa_crypto_mac.o \
	psa_crypto_pake.o \
	psa_crypto_rsa.o \
	psa_crypto_slot_management.o \
	psa_crypto_storage.o \
	psa_its_file.o \
	psa_util.o \
	ripemd160.o \
	rsa.o \
	rsa_alt_helpers.o \
	sha1.o \
	sha256.o \
	sha3.o \
	sha512.o \
	ssl_cache.o \
	ssl_ciphersuites.o \
	ssl_client.o \
	ssl_cookie.o \
	ssl_debug_helpers_generated.o \
	ssl_msg.o \
	ssl_ticket.o \
	ssl_tls.o \
	ssl_tls12_client.o \
	ssl_tls12_server.o \
	ssl_tls13_client.o \
	ssl_tls13_generic.o \
	ssl_tls13_keys.o \
	ssl_tls13_server.o \
	threading.o \
	timing.o \
	version.o \
	version_features.o \
	x509.o \
	x509write.o \
	x509write_crt.o \
	x509write_csr.o \
	x509_create.o \
	x509_crl.o \
	x509_crt.o \

MBEDTLS_DIR           = $(YAPI_SRC)mbedtls/
MBEDTLS_INCLUDE_DIR   = $(MBEDTLS_DIR)include/
MBEDTLS_SOURCES_DIR  = $(MBEDTLS_DIR)library/

VPATH 		= $(YAPI_SRC) $(CMD_SRC) $(YOCTO_SRC) $(MBEDTLS_SOURCES_DIR)
INCLUDES    = $(YAPI_SRC) $(YOCTO_SRC) $(MBEDTLS_INCLUDE_DIR)

INC_PATH    = $(patsubst %,-I%,$(subst :, ,$(INCLUDES)))
INC_PATH_WIN = $(patsubst %,/I %,$(subst :, ,$(INCLUDES)))

ALL_H		= $(wildcard $(patsubst %,%*.h,$(subst :, ,$(YAPI_SRC) $(YOCTO_SRC) $(CMD_SRC))))

COMMON_OBJS		= $(YAPI_OBJS) $(MBEDTLS_OBJS_STAT) $(YOCTO_OBJS)

#create a new definitions for each platform using macro
COMMON_OBJS_WIN32   = $(patsubst %.o, $(OBJDIR_WIN32)%.obj, $(COMMON_OBJS))
COMMON_OBJS_WIN64   = $(patsubst %.o, $(OBJDIR_WIN64)%.obj, $(COMMON_OBJS))
COMMON_OBJS_WINARM  = $(patsubst %.o, $(OBJDIR_WINARM)%.obj, $(COMMON_OBJS))
COMMON_OBJS_I386    = $(patsubst %.o, $(OBJDIR_I386)%.o, $(COMMON_OBJS))
COMMON_OBJS_X64     = $(patsubst %.o, $(OBJDIR_X64)%.o, $(COMMON_OBJS))
COMMON_OBJS_ARMEL   = $(patsubst %.o, $(OBJDIR_ARMEL)%.o, $(COMMON_OBJS))
COMMON_OBJS_ARMHF   = $(patsubst %.o, $(OBJDIR_ARMHF)%.o, $(COMMON_OBJS))
COMMON_OBJS_AARCH64 = $(patsubst %.o, $(OBJDIR_AARCH64)%.o, $(COMMON_OBJS))
COMMON_OBJS_MIPS    = $(patsubst %.o, $(OBJDIR_MIPS)%.o, $(COMMON_OBJS))
COMMON_OBJS_MIPSEL  = $(patsubst %.o, $(OBJDIR_MIPSEL)%.o, $(COMMON_OBJS))
COMMON_OBJS_OSX     = $(patsubst %.o, $(OBJDIR_OSX)%.o, $(COMMON_OBJS))

#create a new definitions for each platform using macro
CMD_OBJS_WIN32   = $(patsubst %.o, $(OBJDIR_WIN32)%.obj, $(CMD_OBJS))
CMD_OBJS_WIN64   = $(patsubst %.o, $(OBJDIR_WIN64)%.obj, $(CMD_OBJS))
CMD_OBJS_WINARM  = $(patsubst %.o, $(OBJDIR_WINARM)%.obj, $(CMD_OBJS))
CMD_OBJS_I386    = $(patsubst %.o, $(OBJDIR_I386)%.o, $(CMD_OBJS))
CMD_OBJS_X64     = $(patsubst %.o, $(OBJDIR_X64)%.o, $(CMD_OBJS))
CMD_OBJS_ARMEL   = $(patsubst %.o, $(OBJDIR_ARMEL)%.o, $(CMD_OBJS))
CMD_OBJS_ARMHF   = $(patsubst %.o, $(OBJDIR_ARMHF)%.o, $(CMD_OBJS))
CMD_OBJS_AARCH64 = $(patsubst %.o, $(OBJDIR_AARCH64)%.o, $(CMD_OBJS))
CMD_OBJS_MIPS    = $(patsubst %.o, $(OBJDIR_MIPS)%.o, $(CMD_OBJS))
CMD_OBJS_MIPSEL  = $(patsubst %.o, $(OBJDIR_MIPSEL)%.o, $(CMD_OBJS))
CMD_OBJS_OSX     = $(patsubst %.o, $(OBJDIR_OSX)%.o, $(CMD_OBJS))

#define all tragets
TARGETS_WIN32 = $(patsubst %.o, $(DIR_WIN32)%.exe, $(CMD_OBJS)) $(DIR_WIN32)ysh.exe
TARGETS_WIN64 = $(patsubst %.o, $(DIR_WIN64)%.exe, $(CMD_OBJS)) $(DIR_WIN64)ysh.exe
TARGETS_WINARM = $(patsubst %.o, $(DIR_WINARM)%.exe, $(CMD_OBJS)) $(DIR_WINARM)ysh.exe
TARGETS_I386  = $(patsubst %.o, $(DIR_I386)%, $(CMD_OBJS)) $(DIR_I386)ysh
TARGETS_X64   = $(patsubst %.o, $(DIR_X64)%, $(CMD_OBJS)) $(DIR_X64)ysh
TARGETS_ARMEL = $(patsubst %.o, $(DIR_ARMEL)%, $(CMD_OBJS)) $(DIR_ARMEL)ysh
TARGETS_ARMHF = $(patsubst %.o, $(DIR_ARMHF)%, $(CMD_OBJS)) $(DIR_ARMHF)ysh
TARGETS_AARCH64 = $(patsubst %.o, $(DIR_AARCH64)%, $(CMD_OBJS)) $(DIR_AARCH64)ysh
TARGETS_MIPS  = $(patsubst %.o, $(DIR_MIPS)%, $(CMD_OBJS)) $(DIR_MIPS)ysh
TARGETS_MIPSEL= $(patsubst %.o, $(DIR_MIPSEL)%, $(CMD_OBJS)) $(DIR_MIPSEL)ysh
TARGETS_OSX   = $(patsubst %.o, $(DIR_OSX)%, $(CMD_OBJS)) $(DIR_OSX)ysh

#define all tragets
DBG_TARGETS_WIN32 = $(DIR_WIN32)ysh.exe
DBG_TARGETS_WIN64 = $(DIR_WIN64)ysh.exe
DBG_TARGETS_WINARM = $(DIR_WINARM)ysh.exe
DBG_TARGETS_I386  = $(DIR_I386)ysh
DBG_TARGETS_X64   = $(DIR_X64)ysh
DBG_TARGETS_ARMEL = $(DIR_ARMEL)ysh
DBG_TARGETS_ARMHF = $(DIR_ARMHF)ysh
DBG_TARGETS_AARCH64 = $(DIR_AARCH64)ysh
DBG_TARGETS_MIPS  = $(DIR_MIPS)ysh
DBG_TARGETS_MIPSEL= $(DIR_MIPSEL)ysh
DBG_TARGETS_OSX   = $(DIR_OSX)ysh

fwd: default
#generic compilation rules for win32

$(OBJDIR_WIN32)cmdline_linker_%.obj: cmdline_linker.cpp $(ALL_H) $(CMD_SRC)cmdline_common.h | $(OBJDIR_WIN32)
	@echo compiling $@ $*
	@$(CPP_WIN32) $(OPTS_WIN32) /DCMD_Y$* $(INC_PATH_WIN) /EHsc /Fo$@ /c $<

$(OBJDIR_WIN32)%.obj: %.c $(ALL_H) | $(OBJDIR_WIN32)
	@echo compiling $@
	@$(CC_WIN32) $(OPTS_WIN32) $(INC_PATH_WIN) /Fo$@ /c $<

$(OBJDIR_WIN32)%.obj: %.cpp $(ALL_H) | $(OBJDIR_WIN32)
	@echo compiling $@
	@$(CPP_WIN32) $(OPTS_WIN32) $(INC_PATH_WIN) /EHsc /Fo$@ /c $<

$(OBJDIR_WIN32)cmdline_common_std.obj: cmdline_common.cpp $(ALL_H) $(CMD_SRC)cmdline_common.h
	@echo compiling $@
	@$(CPP_WIN32) $(OPTS_WIN32) $(INC_PATH_WIN) /EHsc /Fo$@ /c $<

$(OBJDIR_WIN32)cmdline_common_ysh.obj: cmdline_common.cpp $(ALL_H) $(CMD_SRC)cmdline_common.h
	@echo compiling $@
	@$(CPP_WIN32) /DCMD_YSH $(OPTS_WIN32) $(INC_PATH_WIN) /EHsc /Fo$@ /c $<

$(OBJDIR_WIN32)Y%_linker.obj: $(OBJDIR_WIN32)Y%.obj $(CMD_SRC)cmdline_linker.cpp
	@echo compiling cmdline_linker to $@
	@$(CPP_WIN32) $(OPTS_WIN32) /DCMD_Y$(*F) $(INC_PATH_WIN) /EHsc /Fo$@ /c $(CMD_SRC)cmdline_linker.cpp

$(DIR_WIN32)Y%.exe: $(OBJDIR_WIN32)Y%_linker.obj $(COMMON_OBJS_WIN32) $(OBJDIR_WIN32)Y%.obj $(OBJDIR_WIN32)cmdline_common_std.obj
	@echo linking cmdline $@
	@$(LINKER_WIN32) $(LINK_WIN32) /OUT:"$@" $^

$(DIR_WIN32)ysh.exe: $(CMD_SRC)cmdline_linker.cpp $(COMMON_OBJS_WIN32) $(CMD_OBJS_WIN32) $(OBJDIR_WIN32)cmdline_common_ysh.obj
	@echo compiling cmdline $@
	@$(CPP_WIN32) $(OPTS_WIN32) /DCMD_YSH $(INC_PATH_WIN) /EHsc /Fe$@ /Fo$(OBJDIR_WIN32) $^ /link $(LINK_WIN32)

#generic compilation rules for win64
$(OBJDIR_WIN64)%.obj: %.c $(ALL_H) | $(OBJDIR_WIN64)
	@echo compiling $@
	@$(CC_WIN64) $(OPTS_WIN64)$(INC_PATH_WIN) /Fo$@ /c $<

$(OBJDIR_WIN64)%.obj: %.cpp $(ALL_H) | $(OBJDIR_WIN64)
	@echo compiling $@
	@$(CPP_WIN64) $(OPTS_WIN64) $(INC_PATH_WIN) /EHsc /Fo$@ /c $<

$(OBJDIR_WIN64)cmdline_common_std.obj: cmdline_common.cpp $(ALL_H) $(CMD_SRC)cmdline_common.h
	@echo compiling $@
	@$(CPP_WIN64) $(OPTS_WIN64) $(INC_PATH_WIN) /EHsc /Fo$@ /c $<

$(OBJDIR_WIN64)cmdline_common_ysh.obj: cmdline_common.cpp $(ALL_H) $(CMD_SRC)cmdline_common.h
	@echo compiling $@
	@$(CPP_WIN64) /DCMD_YSH $(OPTS_WIN64) $(INC_PATH_WIN) /EHsc /Fo$@ /c $<

$(OBJDIR_WIN64)Y%_linker.obj: $(OBJDIR_WIN64)Y%.obj $(CMD_SRC)cmdline_linker.cpp
	@echo compiling cmdline_linker to $@
	@$(CPP_WIN64) $(OPTS_WIN64) /DCMD_Y$(*F) $(INC_PATH_WIN) /EHsc /Fo$@ /c $(CMD_SRC)cmdline_linker.cpp

$(DIR_WIN64)Y%.exe: $(OBJDIR_WIN64)Y%_linker.obj $(COMMON_OBJS_WIN64) $(OBJDIR_WIN64)Y%.obj $(OBJDIR_WIN64)cmdline_common_std.obj
	@echo linking cmdline $@
	@$(LINKER_WIN64) $(LINK_WIN64) /OUT:"$@" $^

$(DIR_WIN64)ysh.exe: $(CMD_SRC)cmdline_linker.cpp $(COMMON_OBJS_WIN64) $(CMD_OBJS_WIN64) $(OBJDIR_WIN64)cmdline_common_ysh.obj
	@echo compiling cmdline $@
	@$(CPP_WIN64)  $(OPTS_WIN64) /DCMD_YSH $(INC_PATH_WIN) /EHsc /Fe$@ /Fo$(OBJDIR_WIN64)  $^  /link $(LINK_WIN64)

#generic compilation rules for winARM
$(OBJDIR_WINARM)%.obj: %.c $(ALL_H) | $(OBJDIR_WINARM)
	@echo compiling $@
	@$(CC_WINARM) $(OPTS_WINARM) $(INC_PATH_WIN) /Fo$@ /c $<

$(OBJDIR_WINARM)%.obj: %.cpp $(ALL_H) | $(OBJDIR_WINARM)
	@echo compiling $@
	@$(CPP_WINARM) $(OPTS_WINARM) $(INC_PATH_WIN) /EHsc /Fo$@ /c $<

$(OBJDIR_WINARM)cmdline_common_std.obj: cmdline_common.cpp $(ALL_H) $(CMD_SRC)cmdline_common.h
	@echo compiling $@
	@$(CPP_WINARM) $(OPTS_WINARM)  $(INC_PATH_WIN) /EHsc /Fo$@ /c $<

$(OBJDIR_WINARM)cmdline_common_ysh.obj: cmdline_common.cpp $(ALL_H) $(CMD_SRC)cmdline_common.h
	@echo compiling $@
	@$(CPP_WINARM) /DCMD_YSH $(OPTS_WINARM) $(GLOBAL_OPT_WIN) $(INC_PATH_WIN) /EHsc /Fo$@ /c $<

$(OBJDIR_WINARM)Y%_linker.obj: $(OBJDIR_WINARM)Y%.obj $(CMD_SRC)cmdline_linker.cpp
	@echo compiling cmdline_linker to $@
	@$(CPP_WINARM) $(OPTS_WINARM) /DCMD_Y$(*F) $(INC_PATH_WIN) /EHsc /Fo$@ /c $(CMD_SRC)cmdline_linker.cpp

$(DIR_WINARM)Y%.exe: $(OBJDIR_WINARM)Y%_linker.obj $(COMMON_OBJS_WINARM) $(OBJDIR_WINARM)Y%.obj $(OBJDIR_WINARM)cmdline_common_std.obj
	@echo linking cmdline $@
	@$(LINKER_WINARM) $(LINK_WINARM) /OUT:"$@" $^

$(DIR_WINARM)ysh.exe: $(CMD_SRC)cmdline_linker.cpp $(COMMON_OBJS_WINARM) $(CMD_OBJS_WINARM) $(OBJDIR_WINARM)cmdline_common_ysh.obj
	@echo compiling cmdline $@
	@$(CPP_WINARM) $(OPTS_WINARM) /DCMD_YSH $(INC_PATH_WIN) /EHsc /Fe$@ /Fo$(OBJDIR_WINARM)  $^  /link $(LINK_WINARM)

#generic compilation rules for X64

$(OBJDIR_X64)cmdline_linker_%.o: cmdline_linker.cpp $(ALL_H) $(CMD_SRC)cmdline_common.h | $(OBJDIR_X64)
	@echo compiling $@ $*
	@$(CPP_X64) $(OPTS_X64) $(GLOBAL_OPT) -DCMD_Y$* $(INC_PATH) -c $< -o $@

$(OBJDIR_X64)%.o: %.c $(ALL_H) | $(OBJDIR_X64)
	@echo compiling $@
	@$(CC_X64) $(OPTS_X64) $(GLOBAL_OPT) $(INC_PATH) -c $< -o $@

$(OBJDIR_X64)%.o: %.cpp $(ALL_H) | $(OBJDIR_X64)
	@echo compiling $@
	@$(CPP_X64) $(OPTS_X64) $(GLOBAL_OPT) $(INC_PATH) -c $< -o $@

$(OBJDIR_X64)cmdline_common_std.o: cmdline_common.cpp $(ALL_H) $(CMD_SRC)cmdline_common.h
	@echo compiling $@
	@$(CPP_X64) $(OPTS_X64) $(GLOBAL_OPT) $(INC_PATH) -c $< -o $@

$(OBJDIR_X64)cmdline_common_ysh.o: cmdline_common.cpp $(ALL_H) $(CMD_SRC)cmdline_common.h
	@echo compiling $@
	@$(CPP_X64) -DCMD_YSH $(OPTS_X64) $(GLOBAL_OPT) $(INC_PATH) -c $< -o $@

$(DIR_X64)Y%: $(COMMON_OBJS_X64) $(OBJDIR_X64)Y%.o $(OBJDIR_X64)cmdline_common_std.o $(OBJDIR_X64)cmdline_linker_%.o
	@echo compiling cmdline $@
	@$(CPP_X64) $(OPTS_X64) $(GLOBAL_OPT) -DCMD_Y$(*F) $(INC_PATH) $^ -o $@ $(LINK_X64)

$(DIR_X64)ysh: $(COMMON_OBJS_X64) $(CMD_OBJS_X64) $(OBJDIR_X64)cmdline_common_ysh.o $(OBJDIR_X64)cmdline_linker_SH.o
	@echo compiling cmdline $@
	@$(CPP_X64) $(OPTS_X64) $(GLOBAL_OPT) -DCMD_YSH $(INC_PATH) $^ -o $@ $(LINK_X64)

#generic compilation rules for I386
$(OBJDIR_I386)cmdline_linker_%.o: cmdline_linker.cpp $(ALL_H) $(CMD_SRC)cmdline_common.h | $(OBJDIR_I386)
	@echo compiling $@ $*
	@$(CPP_I386) $(OPTS_I386) $(GLOBAL_OPT) -DCMD_Y$* $(INC_PATH) -c $< -o $@

$(OBJDIR_I386)%.o: %.c $(ALL_H) | $(OBJDIR_I386)
	@echo compiling $@
	@$(CC_I386) $(OPTS_I386) $(GLOBAL_OPT) $(INC_PATH) -c $< -o $@

$(OBJDIR_I386)%.o: %.cpp $(ALL_H) | $(OBJDIR_I386)
	@echo compiling $@
	@$(CPP_I386) $(OPTS_I386) $(GLOBAL_OPT) $(INC_PATH) -c $< -o $@

$(OBJDIR_I386)cmdline_common_std.o: cmdline_common.cpp $(ALL_H) $(CMD_SRC)cmdline_common.h
	@echo compiling $@
	@$(CPP_I386) $(OPTS_I386) $(GLOBAL_OPT) $(INC_PATH) -c $< -o $@

$(OBJDIR_I386)cmdline_common_ysh.o: cmdline_common.cpp $(ALL_H) $(CMD_SRC)cmdline_common.h
	@echo compiling $@
	@$(CPP_I386) -DCMD_YSH $(OPTS_I386) $(GLOBAL_OPT) $(INC_PATH) -c $< -o $@

$(DIR_I386)Y%: $(COMMON_OBJS_I386) $(OBJDIR_I386)Y%.o $(OBJDIR_I386)cmdline_common_std.o $(OBJDIR_I386)cmdline_linker_%.o
	@echo compiling cmdline $@
	@$(CPP_I386) $(OPTS_I386) $(GLOBAL_OPT) -DCMD_Y$(*F) $(INC_PATH) $^ -o $@ $(LINK_I386)

$(DIR_I386)ysh: $(COMMON_OBJS_I386) $(CMD_OBJS_I386) $(OBJDIR_I386)cmdline_common_ysh.o $(OBJDIR_I386)cmdline_linker_SH.o
	@echo compiling cmdline $@
	@$(CPP_I386) $(OPTS_I386) $(GLOBAL_OPT) -DCMD_YSH $(INC_PATH) $^ -o $@ $(LINK_I386)

#generic compilation rules for ARMEL
$(OBJDIR_ARMEL)cmdline_linker_%.o: cmdline_linker.cpp $(ALL_H) $(CMD_SRC)cmdline_common.h | $(OBJDIR_ARMEL)
	@echo compiling $@ $*
	@$(CPP_ARMEL) $(OPTS_ARMEL) $(GLOBAL_OPT) -DCMD_Y$* $(INC_PATH) -c $< -o $@

$(OBJDIR_ARMEL)%.o: %.c $(ALL_H) | $(OBJDIR_ARMEL)
	@echo compiling $@
	@$(CC_ARMEL) $(OPTS_ARMEL) $(GLOBAL_OPT) $(INC_PATH) -c $< -o $@

$(OBJDIR_ARMEL)%.o: %.cpp $(ALL_H) | $(OBJDIR_ARMEL)
	@echo compiling $@
	@$(CPP_ARMEL) $(OPTS_ARMEL) $(GLOBAL_OPT) $(INC_PATH) -c $< -o $@

$(OBJDIR_ARMEL)cmdline_common_std.o: cmdline_common.cpp $(ALL_H) $(CMD_SRC)cmdline_common.h
	@echo compiling $@
	@$(CPP_ARMEL) $(OPTS_ARMEL) $(GLOBAL_OPT) $(INC_PATH) -c $< -o $@

$(OBJDIR_ARMEL)cmdline_common_ysh.o: cmdline_common.cpp $(ALL_H) $(CMD_SRC)cmdline_common.h
	@echo compiling $@
	@$(CPP_ARMEL) -DCMD_YSH $(OPTS_ARMEL) $(GLOBAL_OPT) $(INC_PATH) -c $< -o $@

$(DIR_ARMEL)Y%: $(COMMON_OBJS_ARMEL) $(OBJDIR_ARMEL)Y%.o $(OBJDIR_ARMEL)cmdline_common_std.o $(OBJDIR_ARMEL)cmdline_linker_%.o
	@echo compiling cmdline $@
	@$(CPP_ARMEL) $(OPTS_ARMEL) $(GLOBAL_OPT) -DCMD_Y$(*F) $(INC_PATH) $^ -o $@ $(LINK_ARMEL)

$(DIR_ARMEL)ysh: $(COMMON_OBJS_ARMEL) $(CMD_OBJS_ARMEL) $(OBJDIR_ARMEL)cmdline_common_ysh.o $(OBJDIR_ARMEL)cmdline_linker_SH.o
	@echo compiling cmdline $@
	@$(CPP_ARMEL) $(OPTS_ARMEL) $(GLOBAL_OPT) -DCMD_YSH $(INC_PATH) $^ -o $@ $(LINK_ARMEL)

#generic compilation rules for ARMHF
$(OBJDIR_ARMHF)cmdline_linker_%.o: cmdline_linker.cpp $(ALL_H) $(CMD_SRC)cmdline_common.h | $(OBJDIR_ARMHF)
	@echo compiling $@ $*
	@$(CPP_ARMHF) $(OPTS_ARMHF) $(GLOBAL_OPT) -DCMD_Y$* $(INC_PATH) -c $< -o $@

$(OBJDIR_ARMHF)%.o: %.c $(ALL_H) | $(OBJDIR_ARMHF)
	@echo compiling $@
	@$(CC_ARMHF) $(OPTS_ARMHF) $(GLOBAL_OPT) $(INC_PATH) -c $< -o $@

$(OBJDIR_ARMHF)%.o: %.cpp $(ALL_H) | $(OBJDIR_ARMHF)
	@echo compiling $@
	@$(CPP_ARMHF) $(OPTS_ARMHF) $(GLOBAL_OPT) $(INC_PATH) -c $< -o $@

$(OBJDIR_ARMHF)cmdline_common_std.o: cmdline_common.cpp $(ALL_H) $(CMD_SRC)cmdline_common.h
	@echo compiling $@
	@$(CPP_ARMHF) $(OPTS_ARMHF) $(GLOBAL_OPT) $(INC_PATH) -c $< -o $@

$(OBJDIR_ARMHF)cmdline_common_ysh.o: cmdline_common.cpp $(ALL_H) $(CMD_SRC)cmdline_common.h
	@echo compiling $@
	@$(CPP_ARMHF) -DCMD_YSH $(OPTS_ARMHF) $(GLOBAL_OPT) $(INC_PATH) -c $< -o $@

$(DIR_ARMHF)Y%: $(COMMON_OBJS_ARMHF) $(OBJDIR_ARMHF)Y%.o $(OBJDIR_ARMHF)cmdline_common_std.o $(OBJDIR_ARMHF)cmdline_linker_%.o
	@echo compiling cmdline $@
	@$(CPP_ARMHF) $(OPTS_ARMHF) $(GLOBAL_OPT) -DCMD_Y$(*F) $(INC_PATH) $^ -o $@ $(LINK_ARMHF)

$(DIR_ARMHF)ysh: $(COMMON_OBJS_ARMHF) $(CMD_OBJS_ARMHF) $(OBJDIR_ARMHF)cmdline_common_ysh.o $(OBJDIR_ARMHF)cmdline_linker_SH.o
	@echo compiling cmdline $@
	@$(CPP_ARMHF) $(OPTS_ARMHF) $(GLOBAL_OPT) -DCMD_YSH $(INC_PATH) $^ -o $@ $(LINK_ARMHF)

#generic compilation rules for AARCH64
$(OBJDIR_AARCH64)cmdline_linker_%.o: cmdline_linker.cpp $(ALL_H) $(CMD_SRC)cmdline_common.h | $(OBJDIR_AARCH64)
	@echo compiling $@ $*
	@$(CPP_AARCH64) $(OPTS_AARCH64) $(GLOBAL_OPT) -DCMD_Y$* $(INC_PATH) -c $< -o $@

$(OBJDIR_AARCH64)%.o: %.c $(ALL_H) | $(OBJDIR_AARCH64)
	@echo compiling $@
	@$(CC_AARCH64) $(OPTS_AARCH64) $(GLOBAL_OPT) $(INC_PATH) -c $< -o $@

$(OBJDIR_AARCH64)%.o: %.cpp $(ALL_H) | $(OBJDIR_AARCH64)
	@echo compiling $@
	@$(CPP_AARCH64) $(OPTS_AARCH64) $(GLOBAL_OPT) $(INC_PATH) -c $< -o $@

$(OBJDIR_AARCH64)cmdline_common_std.o: cmdline_common.cpp $(ALL_H) $(CMD_SRC)cmdline_common.h
	@echo compiling $@
	@$(CPP_AARCH64) $(OPTS_AARCH64) $(GLOBAL_OPT) $(INC_PATH) -c $< -o $@

$(OBJDIR_AARCH64)cmdline_common_ysh.o: cmdline_common.cpp $(ALL_H) $(CMD_SRC)cmdline_common.h
	@echo compiling $@
	@$(CPP_AARCH64) -DCMD_YSH $(OPTS_AARCH64) $(GLOBAL_OPT) $(INC_PATH) -c $< -o $@

$(DIR_AARCH64)Y%: $(COMMON_OBJS_AARCH64) $(OBJDIR_AARCH64)Y%.o $(OBJDIR_AARCH64)cmdline_common_std.o $(OBJDIR_AARCH64)cmdline_linker_%.o
	@echo compiling cmdline $@
	@$(CPP_AARCH64) $(OPTS_AARCH64) $(GLOBAL_OPT) -DCMD_Y$(*F) $(INC_PATH) $^ -o $@ $(LINK_AARCH64)

$(DIR_AARCH64)ysh: $(COMMON_OBJS_AARCH64) $(CMD_OBJS_AARCH64) $(OBJDIR_AARCH64)cmdline_common_ysh.o $(OBJDIR_AARCH64)cmdline_linker_SH.o
	@echo compiling cmdline $@
	@$(CPP_AARCH64) $(OPTS_AARCH64) $(GLOBAL_OPT) -DCMD_YSH $(INC_PATH) $^ -o $@ $(LINK_AARCH64)

#generic compilation rules for MIPS
$(OBJDIR_MIPS)cmdline_linker_%.o: cmdline_linker.cpp $(ALL_H) $(CMD_SRC)cmdline_common.h | $(OBJDIR_MIPS)
	@echo compiling $@ $*
	@$(CPP_MIPS) $(OPTS_MIPS) $(GLOBAL_OPT) -DCMD_Y$* $(INC_PATH) -c $< -o $@

$(OBJDIR_MIPS)%.o: %.c $(ALL_H) | $(OBJDIR_MIPS)
	@echo compiling $@
	@$(CC_MIPS) $(OPTS_MIPS) $(GLOBAL_OPT) $(INC_PATH) -c $< -o $@

$(OBJDIR_MIPS)%.o: %.cpp $(ALL_H) | $(OBJDIR_MIPS)
	@echo compiling $@
	@$(CPP_MIPS) $(OPTS_MIPS) $(GLOBAL_OPT) $(INC_PATH) -c $< -o $@

$(OBJDIR_MIPS)cmdline_common_std.o: cmdline_common.cpp $(ALL_H) $(CMD_SRC)cmdline_common.h
	@echo compiling $@
	@$(CPP_MIPS) $(OPTS_MIPS) $(GLOBAL_OPT) $(INC_PATH) -c $< -o $@

$(OBJDIR_MIPS)cmdline_common_ysh.o: cmdline_common.cpp $(ALL_H) $(CMD_SRC)cmdline_common.h
	@echo compiling $@
	@$(CPP_MIPS) -DCMD_YSH $(OPTS_MIPS) $(GLOBAL_OPT) $(INC_PATH) -c $< -o $@

$(DIR_MIPS)Y%: $(COMMON_OBJS_MIPS) $(OBJDIR_MIPS)Y%.o $(OBJDIR_MIPS)cmdline_common_std.o $(OBJDIR_MIPS)cmdline_linker_%.o
	@echo compiling cmdline $@
	@$(CPP_MIPS) $(OPTS_MIPS) $(GLOBAL_OPT) -DCMD_Y$(*F) $(INC_PATH) $^ -o $@ $(LINK_MIPS)

$(DIR_MIPS)ysh: $(COMMON_OBJS_MIPS) $(CMD_OBJS_MIPS) $(OBJDIR_MIPS)cmdline_common_ysh.o $(OBJDIR_MIPS)cmdline_linker_SH.o
	@echo compiling cmdline $@
	@$(CPP_MIPS) $(OPTS_MIPS) $(GLOBAL_OPT) -DCMD_YSH $(INC_PATH) $^ -o $@ $(LINK_MIPS)

#generic compilation rules for MIPSEL
$(OBJDIR_MIPSEL)cmdline_linker_%.o: cmdline_linker.cpp $(ALL_H) $(CMD_SRC)cmdline_common.h | $(OBJDIR_MIPSEL)
	@echo compiling $@ $*
	@$(CPP_MIPSEL) $(OPTS_MIPSEL) $(GLOBAL_OPT) -DCMD_Y$* $(INC_PATH) -c $< -o $@

$(OBJDIR_MIPSEL)%.o: %.c $(ALL_H) | $(OBJDIR_MIPSEL)
	@echo compiling $@
	@$(CC_MIPSEL) $(OPTS_MIPSEL) $(GLOBAL_OPT) $(INC_PATH) -c $< -o $@

$(OBJDIR_MIPSEL)%.o: %.cpp $(ALL_H) | $(OBJDIR_MIPSEL)
	@echo compiling $@
	@$(CPP_MIPSEL) $(OPTS_MIPSEL) $(GLOBAL_OPT) $(INC_PATH) -c $< -o $@

$(OBJDIR_MIPSEL)cmdline_common_std.o: cmdline_common.cpp $(ALL_H) $(CMD_SRC)cmdline_common.h
	@echo compiling $@
	@$(CPP_MIPSEL) $(OPTS_MIPSEL) $(GLOBAL_OPT) $(INC_PATH) -c $< -o $@

$(OBJDIR_MIPSEL)cmdline_common_ysh.o: cmdline_common.cpp $(ALL_H) $(CMD_SRC)cmdline_common.h
	@echo compiling $@
	@$(CPP_MIPSEL) -DCMD_YSH $(OPTS_MIPSEL) $(GLOBAL_OPT) $(INC_PATH) -c $< -o $@

$(DIR_MIPSEL)Y%: $(COMMON_OBJS_MIPSEL) $(OBJDIR_MIPSEL)Y%.o $(OBJDIR_MIPSEL)cmdline_common_std.o $(OPTS_MIPSEL)cmdline_linker_%.o
	@echo compiling cmdline $@
	@$(CPP_MIPSEL) $(OPTS_MIPSEL) $(GLOBAL_OPT) -DCMD_Y$(*F) $(INC_PATH) $^ -o $@ $(LINK_MIPSEL)

$(DIR_MIPSEL)ysh: $(COMMON_OBJS_MIPSEL) $(CMD_OBJS_MIPSEL) $(OBJDIR_MIPSEL)cmdline_common_ysh.o $(OPTS_MIPSEL)cmdline_linker_SH.o
	@echo compiling cmdline $@
	@$(CPP_MIPSEL) $(OPTS_MIPSEL) $(GLOBAL_OPT) -DCMD_YSH $(INC_PATH) $^ -o $@ $(LINK_MIPSEL)

#generic compilation rules for OSX
$(OBJDIR_OSX)%.o: %.c $(ALL_H) | $(OBJDIR_OSX)
	@echo compiling $@
	@$(CC_OSX) $(OPTS_OSX) $(GLOBAL_OPT) $(INC_PATH) -c $< -o $@

$(OBJDIR_OSX)%.o: %.cpp $(ALL_H) | $(OBJDIR_OSX)
	@echo compiling $@
	@$(CPP_OSX) $(OPTS_OSX) $(GLOBAL_OPT) $(INC_PATH) -c $< -o $@

$(OBJDIR_OSX)cmdline_common_std.o: cmdline_common.cpp $(ALL_H) $(CMD_SRC)cmdline_common.h
	@echo compiling $@
	@$(CPP_OSX) $(OPTS_OSX) $(GLOBAL_OPT) $(INC_PATH) -c $< -o $@

$(OBJDIR_OSX)cmdline_common_ysh.o: cmdline_common.cpp $(ALL_H) $(CMD_SRC)cmdline_common.h
	@echo compiling $@
	@$(CPP_OSX) -DCMD_YSH $(OPTS_OSX) $(GLOBAL_OPT) $(INC_PATH) -c $< -o $@

$(DIR_OSX)Y%: $(CMD_SRC)cmdline_linker.cpp $(COMMON_OBJS_OSX) $(OBJDIR_OSX)Y%.o $(OBJDIR_OSX)cmdline_common_std.o
	@echo compiling cmdline $@
	@$(CPP_OSX) $(GLOBAL_OPT) -DCMD_Y$(*F) $(INC_PATH) $^ -o $@ $(LINK_OSX)

$(DIR_OSX)ysh: $(CMD_SRC)cmdline_linker.cpp $(COMMON_OBJS_OSX) $(CMD_OBJS_OSX) $(OBJDIR_OSX)cmdline_common_ysh.o
	@echo compiling cmdline $@
	@$(CPP_OSX) $(GLOBAL_OPT) -DCMD_YSH $(INC_PATH) $^ -o $@ $(LINK_OSX)

win32: $(TARGETS_WIN32)

release_win32: $(TARGETS_WIN32)
	@$(MAKE) clean_obj_win32

debug_win32: $(DBG_TARGETS_WIN32)
	@$(MAKE) clean_obj_win32

win64: $(TARGETS_WIN64)

release_win64: $(TARGETS_WIN64)
	@$(MAKE) clean_obj_win64

debug_win64: $(DBG_TARGETS_WIN64)
	@$(MAKE) clean_obj_win64

winARM: $(TARGETS_WINARM)

release_winARM: $(TARGETS_WINARM)
	@$(MAKE) clean_obj_winARM

debug_winARM: $(DBG_TARGETS_WINARM)
	@$(MAKE) clean_obj_winARM

i386: $(TARGETS_I386)

release_i386: $(TARGETS_I386)
	@$(MAKE) clean_obj_i386
	@$(STRIP_I386) $(TARGETS_I386)

debug_i386: $(DBG_TARGETS_I386)
	@$(MAKE) clean_obj_i386
	@$(STRIP_I386) $(DBG_TARGETS_I386)

x64: $(TARGETS_X64)

release_x64: $(TARGETS_X64)
	@$(MAKE) clean_obj_x64
	@$(STRIP_X64) $(TARGETS_X64)

debug_x64: $(DBG_TARGETS_X64)
	@$(MAKE) clean_obj_x64
	@$(STRIP_X64) $(DBG_TARGETS_X64)

armel: $(TARGETS_ARMEL)

release_armel: $(TARGETS_ARMEL)
	@$(MAKE) clean_obj_armel
	@$(STRIP_ARMEL) $(TARGETS_ARMEL)

debug_armel: $(DBG_TARGETS_ARMEL)
	@$(MAKE) clean_obj_armel
	@$(STRIP_ARMEL) $(DBG_TARGETS_ARMEL)

armhf: $(TARGETS_ARMHF)

release_armhf: $(TARGETS_ARMHF)
	@$(MAKE) clean_obj_armhf
	@$(STRIP_ARMHF) $(TARGETS_ARMHF)

debug_armhf: $(DBG_TARGETS_ARMHF)
	@$(MAKE) clean_obj_armhf
	@$(STRIP_ARMHF) $(DBG_TARGETS_ARMHF)

aarch64: $(TARGETS_AARCH64)

release_aarch64: $(TARGETS_AARCH64)
	@$(MAKE) clean_obj_aarch64
	@$(STRIP_AARCH64) $(TARGETS_AARCH64)

debug_aarch64: $(DBG_TARGETS_AARCH64)
	@$(MAKE) clean_obj_aarch64
	@$(STRIP_AARCH64) $(DBG_TARGETS_AARCH64)

mips : export STAGING_DIR = $(STAGING_MIPS)
mips: $(TARGETS_MIPS)
	@$(STRIP_MIPS) $(TARGETS_MIPS)

release_mips : export STAGING_DIR = $(STAGING_MIPS)
release_mips: $(TARGETS_MIPS)
	@$(MAKE) clean_obj_mips

debug_mips : export STAGING_DIR = $(STAGING_MIPS)
debug_mips: $(DBG_TARGETS_MIPS)
	@$(MAKE) clean_obj_mips

mipsel : export STAGING_DIR = $(STAGING_MIPSEL)
mipsel: $(TARGETS_MIPSEL)
	@$(STRIP_MIPSEL) $(TARGETS_MIPSEL)

release_mipsel : export STAGING_DIR = $(STAGING_MIPSEL)
release_mipsel: $(TARGETS_MIPSEL)
	@$(MAKE) clean_obj_mipsel

debug_mipsel : export STAGING_DIR = $(STAGING_MIPSEL)
debug_mipsel: $(DBG_TARGETS_MIPSEL)
	@$(MAKE) clean_obj_mipsel

osx: $(TARGETS_OSX)

release_osx: $(TARGETS_OSX)
	@$(MAKE) clean_obj_osx
	@$(STRIP_OSX) $(TARGETS_OSX)

debug_osx: $(DBG_TARGETS_OSX)
	@$(MAKE) clean_obj_osx
	@$(STRIP_OSX) $(DBG_TARGETS_OSX)

ifeq ($(OS),Windows_NT)
default: win32

release: release_win32

endif

ifeq ($(UNAME), Linux)
#linux
ifeq ($(ARCH), x86_64)
default: x64

release: release_x64 release_i386 release_mips

else
ifeq ($(ARCH),i386)
default: i386

release: release_i386

else
ifeq ($(ARCH), aarch64)
default: aarch64

release: release_aarch64

else

#$(warning $(ARM_BUILD_TYPE))
ifeq ($(ARM_BUILD_TYPE), hf)
default: armhf

release: release_armhf

else
default: armel

release: release_armel

endif
endif
endif
endif
else
#mac os
default: osx

release: release_osx

endif

$(DIR_WIN32) $(DIR_WIN64) $(DIR_WINARM) $(DIR_I386) $(DIR_X64) $(DIR_ARMEL) $(DIR_ARMHF) $(DIR_AARCH64) $(DIR_MIPS) \
$(DIR_MIPSEL) $(DIR_OSX) $(OBJDIR_WIN32) $(OBJDIR_WIN64) $(OBJDIR_WINARM) $(OBJDIR_I386) $(OBJDIR_X64) $(OBJDIR_ARMEL) $(OBJDIR_ARMHF) \
$(OBJDIR_AARCH64) $(OBJDIR_MIPS) $(OBJDIR_MIPSEL) $(OBJDIR_OSX):
	@$(MKDIR) -p $@

clean_obj_win32:
	@$(RM) -rf $(OBJDIR_WIN32)

clean_obj_win64:
	@$(RM) -rf $(OBJDIR_WIN64)

clean_obj_winARM:
	@$(RM) -rf $(OBJDIR_WINARM)

clean_obj_i386:
	@$(RM) -rf $(OBJDIR_I386)

clean_obj_x64:
	@$(RM) -rf $(OBJDIR_X64)

clean_obj_armel:
	@$(RM) -rf $(OBJDIR_ARMEL)

clean_obj_armhf:
	@$(RM) -rf $(OBJDIR_ARMHF)

clean_obj_aarch64:
	@$(RM) -rf $(OBJDIR_AARCH64)

clean_obj_mips:
	@$(RM) -rf $(OBJDIR_MIPS)

clean_obj_mipsel:
	@$(RM) -rf $(OBJDIR_MIPSEL)

clean_obj_osx:
	@$(RM) -rf $(OBJDIR_OSX)

clean_i386: clean_obj_i386
	@$(RM) -rf $(DIR_I386)

clean_x64: clean_obj_x64
	@$(RM) -rf $(DIR_X64)

clean_win32: clean_obj_win32
	@$(RM) -rf $(DIR_WIN32)

clean_win64: clean_obj_win64
	@$(RM) -rf $(DIR_WIN64)

clean_winARM: clean_obj_winARM
	@$(RM) -rf $(DIR_WINARM)

clean_armel: clean_obj_armel
	@$(RM) -rf $(DIR_ARMEL)

clean_armhf: clean_obj_armhf
	@$(RM) -rf $(DIR_ARMHF)

clean_aarch64: clean_obj_aarch64
	@$(RM) -rf $(DIR_AARCH64)

clean_mips: clean_obj_mips
	@$(RM) -rf $(DIR_MIPS)

clean_mipsel: clean_obj_mipsel
	@$(RM) -rf $(DIR_MIPSEL)

clean_osx: clean_obj_osx
	@$(RM) -rf $(DIR_OSX)

clean clean_all: clean_win32 clean_win64 clean_winARM clean_i386 clean_x64 clean_armel clean_armhf clean_aarch64 clean_mips clean_mipsel clean_osx

