update to ida 7.6, add builds
This commit is contained in:
855
idasdk76/allmake.mak
Normal file
855
idasdk76/allmake.mak
Normal file
@@ -0,0 +1,855 @@
|
||||
#
|
||||
# Common part of make files for IDA.
|
||||
#
|
||||
|
||||
# find directory of allmake.mak:
|
||||
IDA:=$(dir $(lastword $(MAKEFILE_LIST)))
|
||||
|
||||
# define the version number we are building
|
||||
IDAVER_MAJOR:=7
|
||||
IDAVER_MINOR:=6
|
||||
# 760
|
||||
IDAVERDECIMAL:=$(IDAVER_MAJOR)$(IDAVER_MINOR)0
|
||||
# 7.6
|
||||
IDAVERDOTTED:=$(IDAVER_MAJOR).$(IDAVER_MINOR)
|
||||
|
||||
# only 32-bit cygwin make is support on Windows
|
||||
ifeq ($(OS),Windows_NT)
|
||||
ifneq ($(MAKE_HOST),i686-pc-cygwin)
|
||||
$(error Only 32-bit cygwin make is supported on Windows. Make sure you are not using 64-bit cygwin, msys, msys2, or any other version of win32 make)
|
||||
endif
|
||||
endif
|
||||
|
||||
# if no targets are defined, default to host OS
|
||||
ifeq ($(or $(__ANDROID__),$(__ANDROID_X86__),$(__ARMLINUX__),$(__LINUX__),$(__MAC__),$(__NT__)),)
|
||||
ifeq ($(OS),Windows_NT)
|
||||
__NT__=1
|
||||
else
|
||||
UNAME_S := $(shell uname -s)
|
||||
ifeq ($(UNAME_S),Linux)
|
||||
__LINUX__=1
|
||||
endif
|
||||
ifeq ($(UNAME_S),Darwin)
|
||||
__MAC__=1
|
||||
endif
|
||||
endif
|
||||
endif
|
||||
|
||||
# only one build target may be defined
|
||||
ifneq ($(__ANDROID__)$(__ANDROID_X86__)$(__ARMLINUX__)$(__LINUX__)$(__MAC__)$(__NT__),1)
|
||||
$(error Only one build target may be defined (__ANDROID__, __ANDROID_X86__, __ARMLINUX__, __LINUX__, __MAC__, or __NT__))
|
||||
endif
|
||||
|
||||
# detect build configuration
|
||||
# Note: will set one of M, MM, MMH, M32, MO, MMO, MMHO, MO32, MSO, MMSO, or MSO32
|
||||
BUILD_CONFIG-1 := M
|
||||
BUILD_CONFIG-$(__EA64__) += M
|
||||
BUILD_CONFIG-$(USE_STATIC_RUNTIME) += S
|
||||
BUILD_CONFIG-$(IDAHOME) += H
|
||||
BUILD_CONFIG-$(NDEBUG) += O
|
||||
BUILD_CONFIG-$(__X86__) += 32
|
||||
empty :=
|
||||
space := $(empty) $(empty)
|
||||
comma := ,
|
||||
BUILD_CONFIG := $(subst $(space),,$(BUILD_CONFIG-1))
|
||||
$(BUILD_CONFIG) := 1
|
||||
|
||||
# definition of a single \n character (empty lines are important!)
|
||||
define newline
|
||||
|
||||
|
||||
endef
|
||||
|
||||
|
||||
# support arm64 macOS11 builds
|
||||
ifeq ($(and $(__MAC__),$(__ARM__)),1)
|
||||
ifdef __X86__
|
||||
$(error 32-bit ARM builds are not supported on mac.)
|
||||
endif
|
||||
# create a shortcut for convenience
|
||||
__APPLE_SILICON__=1
|
||||
endif
|
||||
|
||||
|
||||
ifdef __ARM__
|
||||
PROCDEF = __ARM__
|
||||
TARGET_PROCESSOR_NAME-1=arm
|
||||
TARGET_PROCESSOR_NAME-$(__MAC__)=arm64
|
||||
TARGET_PROCESSOR_NAME=$(TARGET_PROCESSOR_NAME-1)
|
||||
else ifndef __X86__
|
||||
ARCH_FLAGS = -m64
|
||||
TARGET_PROCESSOR_NAME=x64
|
||||
else
|
||||
ARCH_FLAGS = -m32
|
||||
TARGET_PROCESSOR_NAME=x86
|
||||
endif
|
||||
|
||||
# define some variables to simplify build system
|
||||
ifndef __X86__
|
||||
__X64__ = 1
|
||||
ifndef __EA64__
|
||||
__X32__ = 1
|
||||
endif
|
||||
endif
|
||||
ifndef __NT__
|
||||
__UNIX__ = 1
|
||||
endif
|
||||
|
||||
ifndef IDAHOME
|
||||
IDAADV = 1
|
||||
endif
|
||||
|
||||
# define SYSNAME
|
||||
SYSNAME-$(__LINUX__) = linux
|
||||
SYSNAME-$(__MAC__) = mac
|
||||
SYSNAME-$(__NT__) = win
|
||||
SYSNAME = $(SYSNAME-1)
|
||||
|
||||
# path functions (depending on host OS)
|
||||
ifeq ($(OS),Windows_NT)
|
||||
# define: convert unix path to dos path by replacing slashes by backslashes
|
||||
dospath=$(subst /,\\,$(1))
|
||||
else
|
||||
# define: dospath does not do anything in unix
|
||||
dospath=$(1)
|
||||
endif
|
||||
# define: return 1 if path exists, 0 otherwise
|
||||
ls=$(if $(wildcard $(1)),1,0)
|
||||
|
||||
# define: logical negation
|
||||
not = $(if $(1),,1)
|
||||
|
||||
# define: greater or equal
|
||||
gte = $(if $(filter-out $(1),$(word 2,$(sort $(1) $(2)))),,1)
|
||||
|
||||
include $(IDA)defaults.mk
|
||||
|
||||
#############################################################################
|
||||
ifdef __NT__
|
||||
COMPILER_NAME=vc
|
||||
|
||||
# Visual C++ Toolchain and Windows SDK paths
|
||||
# Note: see comments in defaults.mk for more information about these
|
||||
# variables.
|
||||
|
||||
# This function searches for a specified path, converts it to a 8.3
|
||||
# path with forward slashes as separator, and exports it as an
|
||||
# environment variable. This way, subcalls to make do not need to
|
||||
# call $(shell) again.
|
||||
define require_path
|
||||
$$(if $(strip $$($(1))),,$$(eval $(1):=$$(subst \,/,$$(shell cygpath -d $(2) 2>/dev/null))))
|
||||
$$(if $(strip $$($(1))),,$$(error Could not find $(3) in $(2)$$(newline)*** See defaults.mk and "Visual C++ Toolchain and Windows SDK paths" in allmake.mak))
|
||||
$$(eval export $(1))
|
||||
endef
|
||||
|
||||
# This function fixes variables imported from defaults.mk/vcvars.bat
|
||||
# by ensuring that they are surrounded by quotes and by removing the
|
||||
# trailing backslash.
|
||||
fix_var=$(1):='$$(patsubst %\,%,$$(patsubst '%,%,$$(patsubst %',%,$$(patsubst "%,%,$$(patsubst %",%,$$($(1)))))))'
|
||||
|
||||
# Note: these cfg files are created in makeenv_vc.mak
|
||||
ifdef __XPCOMPAT__
|
||||
-include $(IDA)vs17paths_xp.cfg
|
||||
else
|
||||
-include $(IDA)vs17paths.cfg
|
||||
endif
|
||||
|
||||
# Visual C++ 2017 Install Directory
|
||||
ifndef MSVC_ROOT
|
||||
ifneq (,$(findstring Microsoft$(space)Visual$(space)Studio$(space),$(VCINSTALLDIR)))
|
||||
ifeq (,$(findstring 2017,$(VCINSTALLDIR)))
|
||||
$(error Please check your system environment variable VCInstallDir [$(VCINSTALLDIR)].$(newline)It seems to be pointing to an old version of Visual Studio (and not version 2017).$(newline)You may override it in defaults.mk.)
|
||||
endif
|
||||
endif
|
||||
$(eval $(call fix_var,VCINSTALLDIR))
|
||||
$(eval $(call require_path,MSVC_ROOT,$(VCINSTALLDIR),Visual C++ 2017 Install Directory))
|
||||
export MSVC_ROOT
|
||||
endif
|
||||
|
||||
# Visual C++ 2017 Tools Version
|
||||
ifndef MSVC_TOOLSVER
|
||||
ifndef VCToolsVersion
|
||||
# Try to obtain version from Microsoft.VCToolsVersion.default.txt
|
||||
MSVC_TOOLSVER_PATH = $(MSVC_ROOT)/Auxiliary/Build/Microsoft.VCToolsVersion.default.txt
|
||||
VCToolsVersion := $(shell cat $(MSVC_TOOLSVER_PATH) 2> /dev/null)
|
||||
ifeq (,$(VCToolsVersion))
|
||||
# If that failed, try to detect latest version from the directory names
|
||||
VCToolsVersion := $(notdir $(lastword $(sort $(wildcard $(MSVC_ROOT)/Tools/MSVC/14.*))))
|
||||
endif
|
||||
ifeq (,$(VCToolsVersion))
|
||||
$(error Could not find Visual C++ 2017 Tools Version in $(MSVC_TOOLSVER_PATH))
|
||||
endif
|
||||
endif
|
||||
$(eval $(call fix_var,VCToolsVersion))
|
||||
MSVC_TOOLSVER := $(VCToolsVersion)
|
||||
export MSVC_TOOLSVER
|
||||
endif
|
||||
|
||||
# Final Visual C++ 2017 Tools path
|
||||
$(eval $(call require_path,MSVC_PATH,$(MSVC_ROOT)/Tools/MSVC/$(MSVC_TOOLSVER),Visual C++ 2017 Tools))
|
||||
|
||||
MSVC_BIN-X86 ?= $(MSVC_PATH)/bin/HostX86/x86
|
||||
MSVC_BIN-X64 ?= $(MSVC_PATH)/bin/HostX64/x64
|
||||
ifdef __X86__
|
||||
MSVC_BIN ?= $(MSVC_BIN-X86)
|
||||
else
|
||||
MSVC_BIN ?= $(MSVC_BIN-X64)
|
||||
endif
|
||||
MSVC_INCLUDE ?= $(MSVC_PATH)/Include
|
||||
|
||||
# Windows SDK Install Directory
|
||||
ifndef WSDK_PATH
|
||||
$(eval $(call fix_var,WindowsSdkDir))
|
||||
$(eval $(call require_path,WSDK_PATH,$(WindowsSdkDir),Windows SDK Install Directory))
|
||||
export WSDK_PATH
|
||||
endif
|
||||
|
||||
# Windows SDK Version
|
||||
ifndef WSDK_VER
|
||||
ifndef WindowsSDKVersion
|
||||
# Detect the latest version of the Windows SDK
|
||||
WSDK_VER_PATH = $(WSDK_PATH)/Include/10.*
|
||||
WindowsSDKVersion := $(notdir $(lastword $(sort $(wildcard $(WSDK_VER_PATH)))))
|
||||
ifeq (,$(WindowsSDKVersion))
|
||||
$(error Could not find Windows SDK Version in $(WSDK_VER_PATH))
|
||||
endif
|
||||
endif
|
||||
$(eval $(call fix_var,WindowsSDKVersion))
|
||||
WSDK_VER := $(WindowsSDKVersion)
|
||||
export WSDK_VER
|
||||
endif
|
||||
|
||||
# Windows SDK Include/Lib paths
|
||||
INCLUDE_UCRT_PATH ?= $(WSDK_PATH)/Include/$(WSDK_VER)/ucrt
|
||||
LIB_UCRT_PATH ?= $(WSDK_PATH)/Lib/$(WSDK_VER)/ucrt
|
||||
$(eval $(call require_path,INCLUDE_UCRT,$(INCLUDE_UCRT_PATH),Windows SDK Include/ucrt))
|
||||
$(eval $(call require_path,LIB_UCRT,$(LIB_UCRT_PATH),Windows SDK Lib/ucrt))
|
||||
|
||||
ifdef __XPCOMPAT__
|
||||
$(eval $(call require_path,INCLUDE_MSSDK71,$(MSSDK71_PATH)/Include,Microsoft SDK Include))
|
||||
$(eval $(call require_path,LIB_MSSDK71,$(MSSDK71_PATH)/Lib,Microsoft SDK Lib))
|
||||
$(eval $(call require_path,SDK_BIN,$(MSSDK71_PATH)/Bin,Microsoft SDK Bin))
|
||||
else
|
||||
INCLUDE_SHARED_PATH ?= $(WSDK_PATH)/Include/$(WSDK_VER)/shared
|
||||
INCLUDE_UM_PATH ?= $(WSDK_PATH)/Include/$(WSDK_VER)/um
|
||||
LIB_UM_PATH ?= $(WSDK_PATH)/Lib/$(WSDK_VER)/um
|
||||
SDK_BIN_PATH ?= $(WSDK_PATH)/Bin/$(WSDK_VER)/
|
||||
|
||||
$(eval $(call require_path,INCLUDE_SHARED,$(INCLUDE_SHARED_PATH),Windows SDK Include/shared))
|
||||
$(eval $(call require_path,INCLUDE_UM,$(INCLUDE_UM_PATH),Windows SDK Include/um))
|
||||
$(eval $(call require_path,LIB_UM,$(LIB_UM_PATH),Windows SDK Lib/um))
|
||||
$(eval $(call require_path,SDK_BIN,$(SDK_BIN_PATH),Windows SDK Bin))
|
||||
endif
|
||||
|
||||
# Export INCLUDE as an environment variable so it may be used by cl.
|
||||
ifndef INCLUDE
|
||||
ifdef __XPCOMPAT__
|
||||
INCLUDE = $(MSVC_INCLUDE);$(INCLUDE_UCRT);$(INCLUDE_MSSDK71)
|
||||
else
|
||||
INCLUDE = $(MSVC_INCLUDE);$(INCLUDE_UCRT);$(INCLUDE_UM);$(INCLUDE_SHARED)
|
||||
endif
|
||||
export INCLUDE
|
||||
endif
|
||||
|
||||
# Export LIB as an environment variable so it may be used by cl/link.
|
||||
ifndef LIB
|
||||
ifdef __XPCOMPAT__
|
||||
ifdef __X86__
|
||||
LIB = $(MSVC_PATH)/lib/x86;$(LIB_UCRT)/x86;$(LIB_MSSDK71)
|
||||
else
|
||||
LIB = $(MSVC_PATH)/lib/x64;$(LIB_UCRT)/x64;$(LIB_MSSDK71)/x64
|
||||
endif
|
||||
else
|
||||
ifdef __X86__
|
||||
LIB = $(MSVC_PATH)/lib/x86;$(LIB_UCRT)/x86;$(LIB_UM)/x86
|
||||
else
|
||||
LIB = $(MSVC_PATH)/lib/x64;$(LIB_UCRT)/x64;$(LIB_UM)/x64
|
||||
endif
|
||||
endif
|
||||
export LIB
|
||||
endif
|
||||
|
||||
# If a Visual Studio Command Prompt is used, make sure the target
|
||||
# architecture is correct.
|
||||
ifdef VSCMD_ARG_TGT_ARCH
|
||||
ifneq ($(VSCMD_ARG_TGT_ARCH),$(TARGET_PROCESSOR_NAME))
|
||||
ifdef __X86__
|
||||
EXPECTED_ARCH = x86
|
||||
else
|
||||
EXPECTED_ARCH = x64
|
||||
endif
|
||||
LOWERCASE_BUILD_CONFIG := $(subst M,m,$(subst S,s,$(subst O,o,$(BUILD_CONFIG))))
|
||||
$(error Please use the correct Visual Studio Command Prompt for the target architecture$(newline)*** The target architecture for '$(LOWERCASE_BUILD_CONFIG)' is $(EXPECTED_ARCH), and the architecture for the current Visual Studio Command Prompt is $(VSCMD_ARG_TGT_ARCH)))
|
||||
endif
|
||||
endif
|
||||
#############################################################################
|
||||
else ifdef __LINUX__
|
||||
COMPILER_NAME=gcc
|
||||
PTHR_SWITCH=-pthread
|
||||
STDLIBS += -lrt -lpthread -lc
|
||||
#############################################################################
|
||||
else ifdef __MAC__
|
||||
COMPILER_NAME=clang
|
||||
STDLIBS += -lpthread -liconv
|
||||
ARCH_FLAGS-$(__X64__) = -arch x86_64
|
||||
ARCH_FLAGS-$(__X86__) = -arch i386
|
||||
ARCH_FLAGS-$(__ARM__) = -arch arm64
|
||||
ARCH_FLAGS += $(ARCH_FLAGS-1)
|
||||
# The following value is defined in defaults.mk.
|
||||
ARCH_FLAGS += -mmacosx-version-min=$(MACOSX_DEPLOYMENT_TARGET)
|
||||
ifndef MACSDK
|
||||
MACSDK := $(shell /usr/bin/xcrun --sdk macosx --show-sdk-path)
|
||||
ifeq ($(MACSDK),)
|
||||
$(error Could not find MacOSX SDK)
|
||||
endif
|
||||
export MACSDK
|
||||
endif
|
||||
ARCH_FLAGS += -isysroot $(MACSDK)
|
||||
endif
|
||||
|
||||
#############################################################################
|
||||
# toolchain-specific variables
|
||||
|
||||
ifneq (,$(filter $(COMPILER_NAME),gcc clang))
|
||||
# file extensions
|
||||
A = .a
|
||||
B = $(SUFF64)
|
||||
O = .o
|
||||
II = .i
|
||||
# toolchain output switches
|
||||
OBJSW = -o # with space
|
||||
OUTAR =
|
||||
OUTII = -o # with space
|
||||
OUTSW = -o # with space
|
||||
ifdef __MAC__
|
||||
OUTMAP = -Wl,-map,
|
||||
else
|
||||
OUTMAP = -Wl,-Map,
|
||||
endif
|
||||
# misc switches
|
||||
AROPT = rc
|
||||
CPPONLY = -E
|
||||
FORCEC = -xc
|
||||
NORTTI = -fno-rtti
|
||||
ifdef __MAC__
|
||||
OUTDLL = -dynamiclib
|
||||
else
|
||||
OUTDLL = --shared
|
||||
endif
|
||||
# utilities
|
||||
CCACHE-$(USE_CCACHE) = ccache
|
||||
ifeq ($(COMPILER_NAME),clang)
|
||||
_CC = clang
|
||||
_CXX = clang++
|
||||
else
|
||||
_CC = gcc
|
||||
_CXX = g++
|
||||
ifdef USE_GOLD
|
||||
GOLD = -fuse-ld=gold
|
||||
endif
|
||||
endif
|
||||
AR = $(CROSS_PREFIX)ar$(HOST_EXE) $(AROPT)
|
||||
CC = $(CCACHE-1) $(CROSS_PREFIX)$(_CC)$(HOST_EXE) $(ARCH_FLAGS)
|
||||
CCL = $(CROSS_PREFIX)$(_CXX)$(HOST_EXE) $(ARCH_FLAGS) $(GOLD)
|
||||
CXX = $(CCACHE-1) $(CROSS_PREFIX)$(_CXX)$(HOST_EXE) $(ARCH_FLAGS)
|
||||
else ifeq ($(COMPILER_NAME),vc)
|
||||
# file extensions
|
||||
A = .lib
|
||||
B = $(SUFF64).exe
|
||||
O = .obj
|
||||
II = .i
|
||||
# toolchain output switches
|
||||
OBJSW = /Fo
|
||||
OUTAR = /OUT:
|
||||
OUTII = /Fi
|
||||
OUTSW = /OUT:
|
||||
OUTMAP = /map:
|
||||
# misc switches
|
||||
CPPONLY = /P
|
||||
FORCEC = /TC
|
||||
NOLOGO = /nologo
|
||||
NORTTI = /GR-
|
||||
OUTDLL = /DLL
|
||||
# utilities
|
||||
AR = $(MSVC_BIN)/lib.exe $(NOLOGO)
|
||||
CC = $(MSVC_BIN)/cl.exe $(NOLOGO)
|
||||
CCL = $(MSVC_BIN)/link.exe $(NOLOGO)
|
||||
CXX = $(CC)
|
||||
endif
|
||||
|
||||
##############################################################################
|
||||
# target-specific cflags/ldflags
|
||||
ifneq (,$(filter $(COMPILER_NAME),gcc clang))
|
||||
|
||||
# system cflags
|
||||
CC_DEFS += $(PROCDEF)
|
||||
ifdef __MAC__
|
||||
CC_DEFS += __MAC__
|
||||
else
|
||||
CC_DEFS += __LINUX__
|
||||
endif
|
||||
|
||||
ifdef __APPLE_SILICON__
|
||||
CC_DEFS += __APPLE_SILICON__
|
||||
endif
|
||||
|
||||
# pic-related flags
|
||||
# Note: this variable may be overridden in other parts of the build
|
||||
PIC = -fPIC
|
||||
|
||||
ifdef __MAC__
|
||||
LDPIE = $(PIC) -Wl,-pie
|
||||
else
|
||||
LDPIE = $(PIC) -pie
|
||||
endif
|
||||
|
||||
# common cflags
|
||||
CC_DEFS += $(DEF64)
|
||||
CC_DEFS += $(DEFX86)
|
||||
|
||||
CC_F += $(PIC)
|
||||
CC_F += -fdiagnostics-show-option
|
||||
CC_F += -fno-strict-aliasing
|
||||
CC_F += -fvisibility=hidden
|
||||
CC_F += -fwrapv
|
||||
ifneq ($(COMPILER_NAME),clang)
|
||||
CC_F += -fno-delete-null-pointer-checks
|
||||
endif
|
||||
|
||||
CC_INCP += $(I)
|
||||
|
||||
CC_W += -Wall
|
||||
CC_W += -Wextra
|
||||
CC_W += -Wformat=2
|
||||
CC_W += -Werror=format-security
|
||||
CC_W += -Werror=format-nonliteral
|
||||
CC_W += -Wshadow
|
||||
CC_W += -Wunused
|
||||
|
||||
CC_WNO += -Wno-format-y2k
|
||||
CC_WNO += -Wno-missing-field-initializers
|
||||
CC_WNO += -Wno-sign-compare
|
||||
|
||||
CC_X += -g
|
||||
CC_X += -pipe
|
||||
|
||||
# enable c++11
|
||||
CXXSTD = -std=c++11
|
||||
|
||||
CXX_F += -fvisibility-inlines-hidden
|
||||
CXX_WNO += -Wno-invalid-offsetof
|
||||
|
||||
# system-specific cflags
|
||||
ifeq ($(COMPILER_NAME),clang) # mac/android
|
||||
# 'cc -dumpversion' always reports 4.2.1 for clang
|
||||
# https://stackoverflow.com/questions/12893731/why-does-clang-dumpversion-report-4-2-1
|
||||
|
||||
# clang is extra picky - need to add some warning supressions
|
||||
# must eventually get rid of most of these
|
||||
CC_WNO += -Wno-char-subscripts
|
||||
CC_WNO += -Wno-dynamic-class-memaccess
|
||||
CC_WNO += -Wno-int-to-pointer-cast
|
||||
CC_WNO += -Wno-invalid-source-encoding
|
||||
CC_WNO += -Wno-logical-not-parentheses
|
||||
CC_WNO += -Wno-logical-op-parentheses
|
||||
CC_WNO += -Wno-null-conversion
|
||||
CC_WNO += -Wno-nullability-completeness
|
||||
CC_WNO += -Wno-parentheses-equality
|
||||
CC_WNO += -Wno-self-assign
|
||||
CC_WNO += -Wno-unused-const-variable
|
||||
CC_WNO += -Wno-unused-function
|
||||
CC_WNO += -Wno-unused-private-field
|
||||
CC_WNO += -Wno-unused-variable
|
||||
CC_WNO += -Wno-varargs
|
||||
|
||||
CC_F += -fno-caret-diagnostics
|
||||
else # (arm)linux
|
||||
|
||||
# get gcc version
|
||||
ifndef _GCC_VERSION
|
||||
_GCC_VERSION:=$(wordlist 1,2,$(subst ., ,$(shell $(CC) -dumpversion)))
|
||||
export _GCC_VERSION
|
||||
endif
|
||||
GCC_VERSION=$(firstword $(_GCC_VERSION)).$(lastword $(_GCC_VERSION))
|
||||
|
||||
CC_WNO += -Wno-unused-local-typedefs
|
||||
CC_F += -fno-diagnostics-show-caret
|
||||
|
||||
CC_DEFS-$(call gte,$(GCC_VERSION),5.0) += _GLIBCXX_USE_CXX11_ABI=0
|
||||
CC_W-$(call gte,$(GCC_VERSION),7.0) += -Wimplicit-fallthrough=0
|
||||
CXX_WNO-$(call gte,$(GCC_VERSION),8.0) += -Wno-class-memaccess
|
||||
|
||||
# suppress warning about ABI change in GCC 4.4
|
||||
CC_WNO-$(__ARMLINUX__) += -Wno-psabi
|
||||
endif
|
||||
|
||||
# optimization cflags
|
||||
ifdef NDEBUG
|
||||
CC_F += -fdata-sections
|
||||
CC_F += -ffunction-sections
|
||||
ifndef __ASAN__
|
||||
CC_F += -fomit-frame-pointer
|
||||
endif
|
||||
# stack protector
|
||||
ifdef __TARGET_MAC_HOST_LINUX__
|
||||
# disable stack protector for our osxcross toolchain (we check
|
||||
# against __TARGET_MAC_HOST_LINUX__ since it is hard to check
|
||||
# for version number in clang).
|
||||
else ifeq ($(call gte,$(GCC_VERSION),4.9),1)
|
||||
CC_F += -fstack-protector-strong
|
||||
else
|
||||
CC_F += -fstack-protector
|
||||
endif
|
||||
CC_DEFS += NDEBUG
|
||||
CC_DEFS += _FORTIFY_SOURCE=2
|
||||
else
|
||||
CC_DEFS += _DEBUG
|
||||
endif
|
||||
|
||||
# system-specific ldflags
|
||||
ifdef __LINUX__
|
||||
LDFLAGS += -Wl,--build-id
|
||||
LDFLAGS += -Wl,--gc-sections
|
||||
LDFLAGS += -Wl,--warn-shared-textrel
|
||||
|
||||
NO_UNDEFS = -Wl,--no-undefined
|
||||
DLL_W += $(NO_UNDEFS)
|
||||
else ifdef __MAC__
|
||||
LDFLAGS += -Wl,-dead_strip
|
||||
|
||||
ifndef __TARGET_MAC_HOST_LINUX__
|
||||
DLL_X += -compatibility_version 1.0
|
||||
DLL_X += -current_version 1.0
|
||||
DLL_X += -single_module
|
||||
endif
|
||||
endif
|
||||
|
||||
# common linker/compiler flags
|
||||
ifdef NDEBUG
|
||||
CCOPT += -O2
|
||||
ifdef __LINUX__
|
||||
LDOPT += -Wl,-O1
|
||||
endif
|
||||
endif
|
||||
|
||||
# AddressSanitizer flags
|
||||
ifdef __ASAN__
|
||||
CC_DEFS += __ASAN__
|
||||
CC_F += -fno-omit-frame-pointer
|
||||
CC_F += -fsanitize=address
|
||||
LDFLAGS += -fsanitize=address
|
||||
export LSAN_OPTIONS=suppressions=$(IDA)etc/bin/known_leaks.txt:detect_leaks=0
|
||||
endif
|
||||
|
||||
# final compiler flags
|
||||
CC_F += $(CC_F-1)
|
||||
CC_W += $(CC_W-1)
|
||||
CC_WNO += $(CC_WNO-1)
|
||||
CXX_WNO += $(CXX_WNO-1)
|
||||
CC_DEFS += $(CC_DEFS-1)
|
||||
CC_INCP += $(CC_INCP-1)
|
||||
CC_D += $(addprefix -D,$(CC_DEFS))
|
||||
CC_I += $(addprefix -I,$(CC_INCP))
|
||||
|
||||
# the -Wno-* flags must come after the -W enabling flags
|
||||
WARNS = $(sort $(CC_W)) $(sort $(CC_WNO))
|
||||
|
||||
CFLAGS += $(sort $(CC_X))
|
||||
CFLAGS += $(CCOPT)
|
||||
CFLAGS += $(sort $(CC_I))
|
||||
CFLAGS += $(sort $(CC_D))
|
||||
CFLAGS += $(sort $(CC_F))
|
||||
CFLAGS += $(WARNS)
|
||||
CFLAGS += $(PTHR_SWITCH)
|
||||
|
||||
# for warning suppression, override the WARNS variable with NOWARNS:
|
||||
# $(TARGET): WARNS = $(NOWARNS)
|
||||
NOWARNS = -w
|
||||
|
||||
# dll linker flags
|
||||
DLLFLAGS += $(DLL_W) $(DLL_X)
|
||||
|
||||
else ifeq ($(COMPILER_NAME),vc)
|
||||
# for warning suppression, override the WARNS variable with NOWARNS:
|
||||
# $(TARGET): WARNS = $(NOWARNS)
|
||||
NOWARNS = -w -wd4702 -wd4738
|
||||
|
||||
# optimization ldflags
|
||||
LDOPT += /DEBUG
|
||||
ifdef NDEBUG
|
||||
LDOPT += /INCREMENTAL:NO /OPT:ICF /OPT:REF
|
||||
endif
|
||||
|
||||
# set c runtime to use
|
||||
ifdef NDEBUG
|
||||
ifdef USE_STATIC_RUNTIME
|
||||
RUNTIME_LIBSW = /MT
|
||||
else
|
||||
RUNTIME_LIBSW = /MD
|
||||
endif
|
||||
else
|
||||
ifdef USE_STATIC_RUNTIME
|
||||
RUNTIME_LIBSW = /MTd
|
||||
else
|
||||
RUNTIME_LIBSW = /MDd
|
||||
endif
|
||||
endif
|
||||
|
||||
# PDB options
|
||||
PDBFLAGS = /PDB:$(PDBDIR)/
|
||||
ifdef NDEBUG
|
||||
PDBFLAGS += /PDBALTPATH:%_PDB%
|
||||
endif
|
||||
# Generate debug info (old style)
|
||||
PDBFORMAT = /Z7
|
||||
|
||||
# final compiler flags
|
||||
CC_DEFS += $(DEF64)
|
||||
CC_DEFS += $(DEFX86)
|
||||
CC_DEFS += $(CC_DEFS-1)
|
||||
CC_INCP += $(CC_INCP-1)
|
||||
CC_D += $(addprefix -D,$(CC_DEFS))
|
||||
CC_I += $(addprefix -I,$(CC_INCP))
|
||||
|
||||
CFGFILE = @$(IDA)$(SYSDIR).cfg
|
||||
CFLAGS += $(CFGFILE)
|
||||
CFLAGS += $(RUNTIME_LIBSW)
|
||||
CFLAGS += $(PDBFORMAT)
|
||||
CFLAGS += /Brepro
|
||||
CFLAGS += $(sort $(CC_I))
|
||||
CFLAGS += $(sort $(CC_D))
|
||||
CFLAGS += $(sort $(CC_F))
|
||||
CFLAGS += $(WARNS)
|
||||
|
||||
# final linker flags
|
||||
LDFLAGS += /Brepro
|
||||
LDFLAGS += $(PDBFLAGS)
|
||||
LDFLAGS += /ERRORREPORT:QUEUE
|
||||
ifdef __X86__
|
||||
LDFLAGS += /LARGEADDRESSAWARE
|
||||
endif
|
||||
|
||||
ifdef __XPCOMPAT__
|
||||
XPSUBSYS-$(__X64__) = /SUBSYSTEM:CONSOLE,5.02
|
||||
XPSUBSYS-$(__X86__) = /SUBSYSTEM:CONSOLE,5.01
|
||||
LDFLAGS += $(XPSUBSYS-1)
|
||||
endif
|
||||
|
||||
endif
|
||||
|
||||
# to enable obsolete functions, disable the NO_OBSOLETE_FUNCS variable:
|
||||
# $(TARGET): NO_OBSOLETE_FUNCS =
|
||||
NO_OBSOLETE_FUNCS = NO_OBSOLETE_FUNCS
|
||||
CC_DEFS += $(NO_OBSOLETE_FUNCS)
|
||||
|
||||
CXXFLAGS += $(CXXSTD)
|
||||
CXXFLAGS += $(CFLAGS)
|
||||
CXXFLAGS += $(sort $(CXX_F))
|
||||
CXXFLAGS += $(sort $(CXX_WNO))
|
||||
CXXFLAGS += $(UFLAGS)
|
||||
|
||||
LDFLAGS += $(LDOPT)
|
||||
|
||||
#############################################################################
|
||||
ifdef __X86__
|
||||
DEFX86 = __X86__
|
||||
endif
|
||||
|
||||
ifdef __EA64__
|
||||
SUFF64=64
|
||||
ADRSIZE=64
|
||||
DEF64 = __EA64__
|
||||
else
|
||||
ADRSIZE=32
|
||||
endif
|
||||
|
||||
ifdef NDEBUG
|
||||
OPTSUF=_opt
|
||||
endif
|
||||
|
||||
ifdef IDAHOME
|
||||
EXTRASUF1:=_home
|
||||
IDAHOME_PROCESSORS=pc arm ppc mips mc68k
|
||||
else ifdef DEMO_OR_FREE
|
||||
ifdef DEMO
|
||||
EXTRASUF1:=_demo
|
||||
else
|
||||
EXTRASUF1:=_free
|
||||
endif
|
||||
IDADEMO_PROCESSOR=pc
|
||||
IDADEMO_LOADERS=pe elf mach-o
|
||||
else
|
||||
ifdef USE_STATIC_RUNTIME
|
||||
EXTRASUF1:=_s
|
||||
endif
|
||||
ifdef __ASAN__
|
||||
EXTRASUF2:=_asan
|
||||
endif
|
||||
ifdef __FUZZER__
|
||||
EXTRASUF3:=_afl
|
||||
endif
|
||||
endif
|
||||
EXTRASUF=$(EXTRASUF1)$(EXTRASUF2)$(EXTRASUF3)
|
||||
|
||||
#############################################################################
|
||||
SYSDIR=$(TARGET_PROCESSOR_NAME)_$(SYSNAME)_$(COMPILER_NAME)_$(ADRSIZE)$(OPTSUF)$(EXTRASUF)
|
||||
# libraries directory
|
||||
LIBDIR=$(IDA)lib/$(TARGET_PROCESSOR_NAME)_$(SYSNAME)_$(COMPILER_NAME)_$(ADRSIZE)$(EXTRASUF)
|
||||
# object files directory (using ?= to allow overriding)
|
||||
OBJDIR?=obj/$(SYSDIR)
|
||||
# PDB files directory
|
||||
PDBDIR=$(IDA)pdb/$(TARGET_PROCESSOR_NAME)_$(SYSNAME)_$(COMPILER_NAME)_$(ADRSIZE)$(EXTRASUF)
|
||||
# output directory for target platform
|
||||
R=$(IDA)bin/
|
||||
# input directory with existing build utilities
|
||||
RS=$(IDA)bin/
|
||||
# _ida.hlp placed in main tool directory
|
||||
HI=$(RS)
|
||||
# help source
|
||||
HS=.hls
|
||||
# help headers
|
||||
HH=.hhp
|
||||
# include,help and other directories are common for all platforms and compilers:
|
||||
I =$(IDA)include/
|
||||
C =$(R)cfg/
|
||||
RI=$(R)idc/
|
||||
F=$(OBJDIR)/
|
||||
L=$(LIBDIR)/
|
||||
|
||||
DUMB=$(L)dumb$(O)
|
||||
HELP=$(L)help$(O)
|
||||
HLIB=$(HI)_ida.hlp
|
||||
|
||||
# to be used like this:
|
||||
# $(L)va$(A): $(call lib, $(VA_OBJS))
|
||||
lib=$(1); $(strip $(QARf)$(AR) $(OUTAR)$$@ $$^)
|
||||
|
||||
# to be used like this: $(call _link_exe, target, objs, libs)
|
||||
_link_exe=$(strip $(QCCL)$(CCL) $(OUTSW)$(1) $(2) $(3) $(LDFLAGS) $(STDLIBS))
|
||||
|
||||
# to be used like this: $(call link_exe, objs, libs)
|
||||
link_exe=$(call _link_exe,$@,$(1),$(2))
|
||||
|
||||
# to be used like this: $(call _link_dll, target, objs, libs)
|
||||
_link_dll=$(strip $(QCCL)$(CCL) $(OUTDLL) $(DLLFLAGS) $(OUTSW)$(1) $(2) $(3) $(LDFLAGS) $(STDLIBS))
|
||||
|
||||
# to be used like this: $(call link_dll, objs, libs)
|
||||
link_dll=$(call _link_dll,$@,$(1),$(2))
|
||||
|
||||
# to be used like this: $(call link_dumb, target, libs, objs)
|
||||
link_dumb=$(3) $(patsubst %,$(L)%$(A),$(2)); $(strip $(QCCLf)$(CCL) $(OUTSW)$(1) $(LDFLAGS) $(3) $(patsubst %,$(L)%$(A),$(2)) $(STDLIBS))
|
||||
|
||||
# to be used like this:
|
||||
# target: $(call dumb_target, libs, objs) extra_ldflags
|
||||
dumb_target=$(call link_dumb,$$@,$(1),$(2) $(DUMB))
|
||||
|
||||
# to be used like this:
|
||||
# $(R)%$(B): $(F)%$(O) $(call dumb_pattern, libs, objs) extra_ldflags
|
||||
dumb_pattern=$(call link_dumb,$$@ $$<,$(1),$(2) $(DUMB))
|
||||
|
||||
# to be used like this:
|
||||
# OBJS += $(call objs,obj1 obj2 obj3 ...)
|
||||
objs=$(addprefix $(F),$(addsuffix $(O),$(1)))
|
||||
|
||||
# output name for module dll
|
||||
module_dll=$(BIN_PATH)$(1)$(SUFF64)$(DLLEXT)
|
||||
|
||||
# output name for server executable
|
||||
server_exe=$(R)dbgsrv/$(1)
|
||||
|
||||
ifeq ($(or $(M),$(MM),$(MMH),$(MO),$(MMO),$(MMHO)),1)
|
||||
BUILD_IDA = 1
|
||||
endif
|
||||
ifeq ($(or $(M32),$(MM),$(MO32),$(MMO)),1)
|
||||
BUILD_DBGSRV = 1
|
||||
endif
|
||||
|
||||
# target-os specific variables
|
||||
ifdef __NT__
|
||||
DLLEXT=.dll
|
||||
else ifdef __MAC__
|
||||
DLLEXT=.dylib
|
||||
else
|
||||
DLLEXT=.so
|
||||
endif
|
||||
|
||||
# build system commands
|
||||
ifeq ($(OS),Windows_NT)
|
||||
CP=cp -f --preserve=all
|
||||
MKDIR=-@mkdir
|
||||
AWK=gawk
|
||||
else
|
||||
CP=cp -f
|
||||
MKDIR=-@mkdir 2>/dev/null
|
||||
AWK=awk
|
||||
endif
|
||||
RM=rm -f
|
||||
MV=mv
|
||||
|
||||
# used to silence some makefile commands
|
||||
# run 'make Q=' to prevent commands from being silenced
|
||||
Q?=@
|
||||
|
||||
# some makefiles rebuild targets when the makefile itself changes.
|
||||
# this makes debugging makefiles a pain.
|
||||
# run 'make MAKEFILE_DEP=' to disable this behaviour.
|
||||
MAKEFILE_DEP?=makefile
|
||||
|
||||
# libida-related
|
||||
# Note: $(IDALIB) should be used in the dependency list
|
||||
# $(LINKIDA) should be used in the link command
|
||||
ifdef __NT__
|
||||
# Note: on Windows, ida.lib does not have a "64" suffix for ea64
|
||||
IDALIB = $(L)ida$(A)
|
||||
LINKIDA = $(IDALIB)
|
||||
else
|
||||
IDALIB = $(L)libida$(SUFF64)$(DLLEXT)
|
||||
LINKIDA = -L$(L) -lida$(SUFF64)
|
||||
endif
|
||||
|
||||
# simplify command echo
|
||||
ifdef IDAMAKE_SIMPLIFY
|
||||
ifeq ($(Q),@)
|
||||
DO_IDAMAKE_SIMPLIFY=1
|
||||
endif
|
||||
endif
|
||||
|
||||
ifdef DO_IDAMAKE_SIMPLIFY
|
||||
ifdef IDAMAKE_SIMPLIFY_NO_COLOR
|
||||
qcolor=$(1)
|
||||
else
|
||||
ifeq ($(OS),Windows_NT)
|
||||
qcolor=-e #
|
||||
endif
|
||||
qcolor+="\033[1;34m$(1)\033[0m"
|
||||
endif
|
||||
QCXX = @echo $(call qcolor,compile) $< && #
|
||||
QCC = @echo $(call qcolor,compile) $< && #
|
||||
QASM = @echo $(call qcolor,asm) $< && #
|
||||
QARf = @echo $(call qcolor,lib) $$@ && #
|
||||
QCCL = @echo $(call qcolor,link) $@ && #
|
||||
QCCLf = @echo $(call qcolor,link) $$@ && #
|
||||
endif
|
||||
|
||||
# simple build rules
|
||||
CONLY?=-c
|
||||
|
||||
$(F)%$(O): %.cpp
|
||||
$(strip $(QCXX)$(CXX) $(CXXFLAGS) $(NORTTI) $(CONLY) $(OBJSW)$@ $<)
|
||||
|
||||
$(F)%$(O): %.c
|
||||
$(strip $(QCC)$(CC) $(CFLAGS) $(CONLY) $(OBJSW)$@ $(FORCEC) $<)
|
||||
|
||||
$(C)%.cfg: %.cfg
|
||||
$(CP) $? $@
|
||||
|
||||
# http://www.cmcrossroads.com/article/printing-value-makefile-variable
|
||||
print-%:
|
||||
@echo $* = "$($*)"
|
||||
@echo $*\'s origin is $(origin $*)
|
||||
|
||||
#############################################################################
|
||||
.PHONY: all test cfg includes
|
||||
|
||||
# Force make to delete the target if the rule to build it fails
|
||||
.DELETE_ON_ERROR:
|
||||
Reference in New Issue
Block a user