# SPDX-License-Identifier: LicenseRef-SierraWireless-Proprietary
# SPDX-FileCopyrightText: 2026 Sierra Wireless, Inc.
#-------------------------------------------------------------------------------
# Makefile for building the ramdump application
#-------------------------------------------------------------------------------

TARGET    = ram-dump
LIBTARGET = libram-dump
# Define default source
CFLAGS += -D_DEFAULT_SOURCE -fPIC

# default to i386, set others as required
#
CC      := gcc -g
CPU     ?= host$(shell uname -m)
SYMBOLS := ON
APPIDIR := inc/
SRCDIR  := src/
BINDIR  := bin/

#raspberry pi (https://github.com/raspberrypi/tools.git)
# Add include paths
INCLUDE := -I$(APPIDIR) -I$(SRCDIR)

# raspberry pi (https://github.com/raspberrypi/tools.git)
ifeq ($(CPU),rpi)
  # Extract the OS ID and remove quotes
  OS := $(strip $(shell if [ -f /etc/os-release ]; then grep '^ID=' /etc/os-release | cut -d '=' -f 2 | tr -d '"'; else echo "unknown"; fi))
  ifeq ($(OS),centos)
    CC      := $(HOME)/toolchain/arm-gnu-toolchain-14.2.rel1-x86_64-arm-none-linux-gnueabihf/bin/arm-none-linux-gnueabihf-gcc
    ARMIDIR := -I$(HOME)/toolchain/arm-gnu-toolchain-14.2.rel1-x86_64-arm-none-linux-gnueabihf/arm-none-linux-gnueabihf/libc/usr/include
    LDFLAGS := -L$(HOME)/toolchain/arm-gnu-toolchain-14.2.rel1-x86_64-arm-none-linux-gnueabihf/lib/gcc/arm-none-linux-gnueabihf/14.2.1/
    CFLAGS  := -c -D ARM
  else
    CC      := $(HOME)/toolchain/arm-bcm2708/gcc-linaro-arm-linux-gnueabihf-raspbian/bin/arm-linux-gnueabihf-gcc
    ARMIDIR := -I$(HOME)/toolchain/arm-bcm2708/gcc-linaro-arm-linux-gnueabihf-raspbian/arm-linux-gnueabihf/libc/usr/include
    LDFLAGS := -L$(HOME)/toolchain/arm-bcm2708/gcc-linaro-arm-linux-gnueabihf-raspbian/lib/gcc/arm-linux-gnueabihf/4.8.3/
    CFLAGS  += -c -D ARM
  endif
endif

# linaro gcc-linaro-7.4.1-2019.02-x86_64_aarch64-linux-gnu.tar.xz
# from (http://releases.linaro.org/components/toolchain/binaries/7.4-2019.02/aarch64-linux-gnu/) 
ifeq ($(CPU),arm64linaro)
  CC      := $(HOME)/toolchain/gcc-linaro-7.4.1-2019.02-x86_64_aarch64-linux-gnu/bin/aarch64-linux-gnu-gcc
  ARMIDIR := -I$(HOME)/toolchain/gcc-linaro-7.4.1-2019.02-x86_64_aarch64-linux-gnu/aarch64-linux-gnu/libc/usr/include
  LDFLAGS := -L$(HOME)/toolchain/gcc-linaro-7.4.1-2019.02-x86_64_aarch64-linux-gnu/lib/gcc/aarch64-linux-gnu/7.4.1/
  CFLAGS  += -c -D ARM64
endif

ifeq ($(CPU),arm9)
  CC      := $(HOME)/toolchain/arm/bin/arm-none-linux-gnueabi-gcc
  ARMIDIR := -I$(HOME)/toolchain/arm/arm-none-linux-gnueabi/libc/usr/include
  LDFLAGS := -L$(HOME)/toolchain/arm/lib/gcc/arm-none-linux-gnueabi/4.2.0/
  CFLAGS  += -c -D ARM
endif

# arm 32-bit compiler does not support eventfd.
ifeq ($(CPU),arm)
  #CFLAGS += -D_GNU_SOURCE -D_XOPEN_SOURCE=500 -D__USE_UNIX98
  CFLAGS += -D EVENT_FD_UNSUPPORTED -D_GNU_SOURCE -Wno-missing-field-initializers
  CC := $(HOME)/toolchain/gcc-linaro-7.5.0-2019.12-x86_64_arm-linux-gnueabi/bin/arm-linux-gnueabi-gcc
  INCLUDE       += -I$(HOME)/toolchain/gcc-linaro-7.5.0-2019.12-x86_64_arm-linux-gnueabi/arm-linux-gnueabi/libc/usr/include
  LDFLAGS       += -L$(HOME)/toolchain/gcc-linaro-7.5.0-2019.12-x86_64_arm-linux-gnueabi/lib/gcc/arm-linux-gnueabi/7.5.0/
  CFLAGS        += -march=armv5te
endif

ifeq ($(CPU),arm64)
# CC := /$(HOME)/toolchain/arm64bit/be/aarch64ebv8-marvell-linux-gnu-5.2.1_x86_64_20151117/bin/aarch64_be-marvell-linux-gnu-gcc
CC := /$(HOME)/toolchain/aarch64be--glibc--stable-2025.08-1/bin/aarch64_be-buildroot-linux-gnu-gcc
endif

ifeq ($(CPU),mipseb)
  CC := $(HOME)/toolchain/mips-img-linux-gnu/2021.09-01/bin/mips-img-linux-gnu-gcc
  INCLUDE += -I$(HOME)/toolchain/mips-img-linux-gnu/2021.09-01/sysroot/mips-r6-soft/usr/include
#  LDFLAGS       += -L$(HOME)/toolchain/mips/mips-linux-gnu/libc/uclibc/lib -muclibc -EB
  CFLAGS        += -EB
  #default mips toolchain from Sourcery does not support sscanf
  CFLAGS        += -D OS_NO_SSCANF
  #define mips toochain from Sourcery does not support backtrace
  CFLAGS        += -D NO_BACKTRACE
endif

#
# If LTIB (Linux Target Image Build) is installed from
# the Freescale installation DVD, use:
# /opt/freescale/usr/local/gcc-4.3.74-eglibc-2.8.74-dp-2/powerpc-none-linux-gnuspe/
# or a similar path, otherwise the toolchain should be copied to:
#  $(HOME)/toolchain/ppc/...
#
ifeq ($(CPU),ppc)
  CC      := $(HOME)/toolchain/ppc/powerpc-none-linux-gnuspe/bin/powerpc-none-linux-gnuspe-gcc
  PPCIDIR := $(QMI_INCLUDE) -I$(HOME)/toolchain/ppc/powerpc-none-linux-gnuspe/powerpc-none-linux-gnuspe/libc/usr/include
  LDFLAGS := -L$(HOME)/toolchain/ppc/powerpc-none-linux-gnuspe/powerpc-none-linux-gnuspe/libc/usr/lib
  CFLAGS  += -c -D PPC
endif


# 64bit host handling
ifeq ($(CPU),hostx86_64)
  CFLAGS += -m64
  LDFLAGS += -m64
endif

# 32bit host handling
ifeq ($(CPU),hosti686)
  CFLAGS += -m32 
  LDFLAGS += -m32
endif

CFLAGS  := -Wall $(CFLAGS) $(ARMIDIR) $(PPCIDIR)
ifdef NOPIE
LIBS    =  $(WLIBS) -static -L $(LDIR) -lpthread -lrt -lram-dump${CPU}
else
CFLAGS += -fpie
LIBS    =  $(WLIBS) -L $(LDIR) -lpthread -lrt -lram-dump${CPU} -fPIE -pie
endif
LDIR    := ./bin $(LDFLAGS)
ODIR    := obj/$(CPU)/

_OBJ := ramdump.o
OBJ  := $(patsubst %, $(ODIR)%, $(_OBJ))

$(ODIR)%.o:	$(SRCDIR)%.c
	@if [ -e $(ODIR) ] ;\
        then echo "$(ODIR) exists - good." ;\
        else mkdir -p $(ODIR);\
        fi;
	@echo Compiling $<

	$(CC) -c -o $@ $< $(CFLAGS) -I $(APPIDIR)

# Rule to create the ramdump executable
$(BINDIR)ramdump_$(CPU): $(OBJ) obj/$(CPU)/ramdump.o
	@if [ -e $(BINDIR) ] ;\
	then echo "$(BINDIR) exists - good." ;\
	else mkdir -p $(BINDIR) ;\
	fi
	$(CC) -o $@ $^ $(LDFLAGS) $(LIBS)

# Add the target to build the ramdump executable
ramdump: $(BINDIR)ramdump_$(CPU)

.PHONY: clean
clean:
	rm -f $(ODIR)*.o *~ $(BINDIR)$(TARGET)$(CPU) $(BINDIR)ramdump$(CPU)
  

