Files
harbour-core/harbour/config/global.mk
Viktor Szakats 6f4a6b04a8 2009-08-17 17:38 UTC+0200 Viktor Szakats (harbour.01 syenar.hu)
* config/global.mk
    * Upped minimum GNU Make version requirement to 3.78 (from 3.70).
      We use many 3.78-only features since very long and in many
      Makefiles (like $(if)). 3.78 was released in 1999, the year
      Harbour has born, so this requirement looks pretty modest.
      Notice however that the "officially" documented (in INSTALL)
      minimum version is 3.81, and there are a few feature we
      actually use and need from this version. Some other make features
      are only enabled when using 3.80 (or upper) (parallel build),
      some others when using 3.81 (or upper) (build configuration
      information, verbose output).
    ; TODO: Either up the minimum version, or try to fix the remaining
            unprotected 3.80/3.81 features.
            My personal opininon is that if there is any reasonable
            chance we should make 3.80 or 3.81 the minimum official 
            requirement.
            This is a *nix-only issue, as dos/win/os2 are all covered 
            with recent 3.81 binary builds. Question is:
            How and which *nix platforms would be affected or limited 
            in such this case?
            BTW, 3.81 was released in 2006, 3.80 in 2002.

  * ChangeLog
    * Updated cross-build compatibility chart.
2009-08-18 15:40:42 +00:00

1072 lines
32 KiB
Makefile

#
# $Id$
#
# ---------------------------------------------------------------
# Copyright 2009 Viktor Szakats (harbour.01 syenar.hu)
# See COPYING for licensing terms.
# ---------------------------------------------------------------
# ---------------------------------------------------------------
# See GNU make docs here:
# http://www.gnu.org/software/make/manual/make.html
# http://www.jgc.org/feeds/topic-gnumake.xml
# http://lists.gnu.org/archive/html/help-make/
# Portable shell programming:
# http://www.gnu.org/software/autoconf/manual/html_node/Portable-Shell.html
# http://www.gnu.org/software/bash/manual/bashref.html
# http://www.opengroup.org/onlinepubs/009695399/utilities/xcu_chap02.html
# GNU Coding standards:
# http://www.gnu.org/prep/standards/standards.html
# ---------------------------------------------------------------
# GNU Make NEWS:
# http://cvs.savannah.gnu.org/viewvc/make/NEWS?root=make&view=markup
#
# TOFIX: $(realpath/abspath) need GNU Make 3.81 or upper
# TOFIX: $(eval) needs GNU Make 3.80 or upper
ifeq ($(GLOBAL_CF_),)
GLOBAL_CF_ := yes
# This isn't strictly necessary, but it does signficantly reduce
# the number of rules that make has to evaluate otherwise, which may give
# a performance boost on a slow system.
.SUFFIXES:
need := 3.78
ok := $(filter $(need),$(firstword $(sort $(MAKE_VERSION) $(need))))
ifeq ($(ok),)
all: ; @echo "! Error: GNU Make version $(MAKE_VERSION) found, $(need) or upper needed for Harbour"
else
need := 3.81
MAKE_381 := $(filter $(need),$(firstword $(sort $(MAKE_VERSION) $(need))))
# Don't indent this subroutine
define find_in_path
$(strip $(foreach dir,$(subst $(PTHSEP), ,$(PATH)),$(wildcard $(dir)/$(1)$(HB_HOST_BIN_EXT))))
endef
define find_in_path_par
$(strip $(foreach dir,$(subst $(PTHSEP), ,$(2)),$(wildcard $(dir)/$(1)$(HB_HOST_BIN_EXT))))
endef
define find_in_path_raw
$(strip $(foreach dir,$(subst $(PTHSEP), ,$(2)),$(wildcard $(dir)/$(1))))
endef
define check_host
ifneq ($(findstring MINGW,$(1)),)
HB_HOST_ARCH := win
else
ifneq ($(findstring MSys,$(1)),)
HB_HOST_ARCH := win
else
ifneq ($(findstring Windows,$(1)),)
HB_HOST_ARCH := win
else
ifneq ($(findstring CYGWIN,$(1)),)
HB_HOST_ARCH := win
else
ifneq ($(findstring Darwin,$(1)),)
HB_HOST_ARCH := darwin
else
ifneq ($(findstring darwin,$(1)),)
HB_HOST_ARCH := darwin
else
ifneq ($(findstring Linux,$(1)),)
HB_HOST_ARCH := linux
else
ifneq ($(findstring linux,$(1)),)
HB_HOST_ARCH := linux
else
ifneq ($(findstring HP-UX,$(1)),)
HB_HOST_ARCH := hpux
else
ifneq ($(findstring hp-ux,$(1)),)
HB_HOST_ARCH := hpux
else
ifneq ($(findstring SunOS,$(1)),)
HB_HOST_ARCH := sunos
else
ifneq ($(findstring sunos,$(1)),)
HB_HOST_ARCH := sunos
else
ifneq ($(findstring BSD,$(1)),)
HB_HOST_ARCH := bsd
else
ifneq ($(findstring bsd,$(1)),)
HB_HOST_ARCH := bsd
else
ifneq ($(findstring OS/2,$(1)),)
HB_HOST_ARCH := os2
else
ifneq ($(findstring msdos,$(1)),)
HB_HOST_ARCH := dos
endif
endif
endif
endif
endif
endif
endif
endif
endif
endif
endif
endif
endif
endif
endif
endif
endef
# Some presets based on HB_BUILD_NAME
ifneq ($(HB_BUILD_NAME),)
ifeq ($(HB_BUILD_NAME),.r)
HB_BUILD_DEBUG := no
HB_BUILD_OPTIM := yes
HB_BUILD_UNICODE := no
HB_BUILD_MODE ?= c
else
ifeq ($(HB_BUILD_NAME),.ru)
HB_BUILD_DEBUG := no
HB_BUILD_OPTIM := yes
HB_BUILD_UNICODE := yes
HB_BUILD_MODE ?= c
else
ifeq ($(HB_BUILD_NAME),.rp)
HB_BUILD_DEBUG := no
HB_BUILD_OPTIM := yes
HB_BUILD_UNICODE := no
HB_BUILD_MODE ?= cpp
else
ifeq ($(HB_BUILD_NAME),.rpu)
HB_BUILD_DEBUG := no
HB_BUILD_OPTIM := yes
HB_BUILD_UNICODE := yes
HB_BUILD_MODE ?= cpp
else
ifeq ($(HB_BUILD_NAME),.d)
HB_BUILD_DEBUG := yes
HB_BUILD_OPTIM := no
HB_BUILD_UNICODE := no
HB_BUILD_MODE ?= c
else
ifeq ($(HB_BUILD_NAME),.du)
HB_BUILD_DEBUG := yes
HB_BUILD_OPTIM := no
HB_BUILD_UNICODE := yes
HB_BUILD_MODE ?= c
else
ifeq ($(HB_BUILD_NAME),.dp)
HB_BUILD_DEBUG := yes
HB_BUILD_OPTIM := no
HB_BUILD_UNICODE := no
HB_BUILD_MODE ?= cpp
else
ifeq ($(HB_BUILD_NAME),.dpu)
HB_BUILD_DEBUG := yes
HB_BUILD_OPTIM := no
HB_BUILD_UNICODE := yes
HB_BUILD_MODE ?= cpp
endif
endif
endif
endif
endif
endif
endif
endif
endif
ifeq ($(HB_INIT_DONE),)
# Store the original value
export HB_MAKECMDGOALS := $(MAKECMDGOALS)
ifeq ($(HB_BUILD_PKG),yes)
# 'clean' and 'install' are required when building a release package
ifeq ($(findstring clean,$(HB_MAKECMDGOALS)),)
export HB_BUILD_PKG := no
else
ifeq ($(findstring install,$(HB_MAKECMDGOALS)),)
export HB_BUILD_PKG := no
else
ifeq ($(HB_POSTINST),)
export HB_BUILD_PKG := no
endif
endif
endif
ifeq ($(HB_BUILD_PKG),no)
$(warning ! Warning: Use 'clean install' from Harbour root directory to create a release package)
endif
# Enforce some basic setting for release packages
export HB_BUILD_DLL := yes
export HB_BUILD_IMPLIB := no
export HB_BUILD_OPTIM := yes
export HB_BUILD_DEBUG := no
endif
endif
ifeq ($(HB_INIT_DONE),)
ifneq ($(MAKE_381),)
# Some additional ones to be given a standard name:
# HB_HOST_BUILD [yes|all|lib] -> ?
# HB_XBUILD -> HB_BUILD_INCDEF
# HB_WITHOUT_* -> HB_HAS_*
# HB_REBUILD_PARSER -> HB_BUILD_PARSER
# HB_DB_DRVEXT -> -
# HB_COMMERCE -> ?
# HB_CRS_LIB -> HB_LIB_CURSES
# HB_BUILD_VERBOSE [ OK ]
# HB_BIN_COMPILE -> HB_BUILD_BIN_DIR
# HB_INC_COMPILE -> - (HB_BUILD_INC_DIR)
# HB_GPM_MOUSE -> HB_HAS_GPM
# HB_POSTINST -> ?
# HB_ROOTPOSTINST -> ?
# HB_POSTINSTPARAM -> ?
# HB_GPM_NOICE_DISABLE -> HB_USER_CFLAGS=-DHB_GPM_NOICE_DISABLE
# HB_GT_CRS_BCEHACK -> HB_USER_CFLAGS=-DHB_GT_CRS_BCEHACK
# HB_NCURSES_194 -> HB_USER_CFLAGS=-DHB_NCURSES_194
# Macros:
# -DHB_PCRE_REGEX, -DHB_POSIX_REGEX, -DHB_EXT_ZLIB, -DHB_HAS_GPM
$(info ! MAKE: $(MAKE) $(MAKE_VERSION) $(HB_MAKECMDGOALS) $(MAKEFLAGS) $(SHELL))
ifneq ($(HB_USER_PRGFLAGS),)
$(info ! HB_USER_PRGFLAGS: $(HB_USER_PRGFLAGS))
endif
ifneq ($(HB_USER_CFLAGS),)
$(info ! HB_USER_CFLAGS: $(HB_USER_CFLAGS))
endif
ifneq ($(HB_USER_LDFLAGS),)
$(info ! HB_USER_LDFLAGS: $(HB_USER_LDFLAGS))
endif
ifneq ($(HB_USER_AFLAGS),)
$(info ! HB_USER_AFLAGS: $(HB_USER_AFLAGS))
endif
ifneq ($(HB_INSTALL_PREFIX),)
$(info ! HB_INSTALL_PREFIX: $(HB_INSTALL_PREFIX))
endif
ifneq ($(HB_BIN_INSTALL),)
$(info ! HB_BIN_INSTALL: $(HB_BIN_INSTALL))
endif
ifneq ($(HB_LIB_INSTALL),)
$(info ! HB_LIB_INSTALL: $(HB_LIB_INSTALL))
endif
ifneq ($(HB_INC_INSTALL),)
$(info ! HB_INC_INSTALL: $(HB_INC_INSTALL))
endif
ifneq ($(HB_DOC_INSTALL),)
$(info ! HB_DOC_INSTALL: $(HB_DOC_INSTALL))
endif
ifneq ($(HB_BUILD_NAME),)
$(info ! HB_BUILD_NAME: $(HB_BUILD_NAME))
endif
ifneq ($(HB_BUILD_PKG),)
$(info ! HB_BUILD_PKG: $(HB_BUILD_PKG))
endif
ifneq ($(HB_BUILD_DLL),)
$(info ! HB_BUILD_DLL: $(HB_BUILD_DLL))
endif
ifneq ($(HB_BUILD_DEBUG),)
$(info ! HB_BUILD_DEBUG: $(HB_BUILD_DEBUG))
endif
ifneq ($(HB_BUILD_OPTIM),)
$(info ! HB_BUILD_OPTIM: $(HB_BUILD_OPTIM))
endif
ifneq ($(HB_BUILD_UNICODE),)
$(info ! HB_BUILD_UNICODE: $(HB_BUILD_UNICODE))
endif
ifneq ($(HB_BUILD_MODE),)
$(info ! HB_BUILD_MODE: $(HB_BUILD_MODE))
endif
ifneq ($(HB_CONTRIBLIBS),)
$(info ! HB_CONTRIBLIBS: $(HB_CONTRIBLIBS))
endif
ifneq ($(HB_CONTRIB_ADDONS),)
$(info ! HB_CONTRIB_ADDONS: $(HB_CONTRIB_ADDONS))
endif
ifneq ($(HB_EXTERNALLIBS),)
$(info ! HB_EXTERNALLIBS: $(HB_EXTERNALLIBS))
endif
ifneq ($(HB_EXTERNAL_ADDONS),)
$(info ! HB_EXTERNAL_ADDONS: $(HB_EXTERNAL_ADDONS))
endif
endif
endif
# Shell detection
ifneq ($(SHLVL),)
HB_SHELL := sh
else
ifeq ($(SHELL),/bin/sh)
HB_SHELL := sh
else
ifneq ($(OS2_SHELL),)
HB_SHELL := os2
SHELL := $(COMSPEC)
else
ifneq ($(ComSpec),)
COMSPEC := $(ComSpec)
endif
ifeq ($(COMSPEC),)
ifeq ($(OS),Windows_NT)
COMSPEC := cmd.exe
else
COMSPEC := command.com
endif
endif
SHELL := $(COMSPEC)
ifneq ($(findstring COMMAND,$(COMSPEC)),)
HB_SHELL := dos
else
ifneq ($(findstring command,$(COMSPEC)),)
HB_SHELL := dos
else
HB_SHELL := nt
endif
endif
endif
endif
endif
# Not needed anymore, can be deleted if everything stays fine [20090812] [vszakats]
# CMDPREF :=
# ifneq ($(HB_SHELL),sh)
# ifneq ($(COMSPEC),)
# CMDPREF := $(COMSPEC) /C
# endif
# endif
# Directory separator default
ifeq ($(DIRSEP),)
DIRSEP := /
ifneq ($(HB_SHELL),sh)
DIRSEP := $(subst /,\,\)
endif
endif
# Path separator default
ifeq ($(PTHSEP),)
# small hack, it's hard to detect what is real path separator because
# some shells in MS-DOS/Windows translates MS-DOS style paths to POSIX form
ifeq ($(subst ;,:,$(PATH)),$(PATH))
PTHSEP := :
else
PTHSEP := ;
endif
endif
ifeq ($(HB_HOST_ARCH),)
$(eval $(call check_host,$(OSTYPE),))
ifeq ($(HB_HOST_ARCH),)
$(eval $(call check_host,$(MACHTYPE),))
ifeq ($(HB_HOST_ARCH),)
$(eval $(call check_host,$(OS),))
ifeq ($(HB_HOST_ARCH),)
$(eval $(call check_host,$(shell uname -s),))
endif
endif
endif
endif
ifeq ($(HB_HOST_ARCH),)
ifneq ($(OS2_SHELL),)
HB_HOST_ARCH := os2
else
ifneq ($(windir),)
HB_HOST_ARCH := win
else
ifneq ($(WINDIR),)
HB_HOST_ARCH := win
else
ifneq ($(HB_ARCHITECTURE),)
HB_HOST_ARCH := $(HB_ARCHITECTURE)
else
HB_HOST_ARCH := dos
endif
endif
endif
endif
endif
ifeq ($(HB_INIT_DONE),)
ifneq ($(MAKE_381),)
$(info ! HB_HOST_ARCH: $(HB_HOST_ARCH) HB_SHELL: $(HB_SHELL))
endif
endif
ifneq ($(findstring $(HB_HOST_ARCH),win wce dos os2),)
HB_HOST_BIN_EXT := .exe
else
HB_HOST_BIN_EXT :=
endif
ifeq ($(HB_BUILD_VERBOSE),yes)
ifneq ($(MAKE_381),)
$(info ! Detected host executable extension: $(HB_HOST_BIN_EXT))
endif
endif
# Couldn't find a builds of these tools which would fit Harbour respository,
# so these will have to installed by user.
#ifeq ($(HB_SHELL),os2)
# ifeq ($(call find_in_path,mkdir),)
# $(error ! Harbour build on OS/2 requires GNU mkdir executable in PATH. See INSTALL for more)
# else
# ifeq ($(call find_in_path,rm),)
# $(error ! Harbour build on OS/2 requires GNU rm executable in PATH. See INSTALL for more)
# endif
# endif
#endif
ifeq ($(HB_SHELL),sh)
ECHOQUOTE := "
else
ECHOQUOTE :=
endif
HB_HOST_CPU :=
ifeq ($(HB_HOST_ARCH),win)
ifeq ($(PROCESSOR_ARCHITECTURE),AMD64)
HB_HOST_CPU := x86_64
else
ifeq ($(PROCESSOR_ARCHITECTURE),IA64)
HB_HOST_CPU := ia64
else
HB_HOST_CPU := x86
endif
endif
else
# TODO: CPU detection for rest of systems.
endif
ifeq ($(HB_BUILD_VERBOSE),yes)
ifneq ($(MAKE_381),)
$(info ! Detected host CPU: $(HB_HOST_CPU))
endif
endif
HB_ARCH_AUTO :=
ifeq ($(HB_ARCHITECTURE),)
HB_ARCHITECTURE := $(HB_HOST_ARCH)
ifneq ($(HB_COMPILER),)
ifeq ($(HB_COMPILER),msvcarm)
HB_ARCHITECTURE := wce
else
ifeq ($(HB_COMPILER),mingwarm)
HB_ARCHITECTURE := wce
else
ifeq ($(HB_COMPILER),poccarm)
HB_ARCHITECTURE := wce
else
ifeq ($(HB_COMPILER),djgpp)
HB_ARCHITECTURE := dos
else
ifeq ($(findstring $(HB_COMPILER),mingw mingw64 msvc msvc64 msvcia64 bcc xcc pocc pocc64),)
HB_ARCHITECTURE := win
endif
endif
endif
endif
endif
endif
ifneq ($(HB_ARCHITECTURE),)
HB_ARCH_AUTO := (autodetected)
endif
endif
HB_COMP_AUTO :=
ifeq ($(HB_COMPILER),)
ifneq ($(HB_HOST_ARCH),$(HB_ARCHITECTURE))
# cross-build section *nix -> win/wce
ifeq ($(HB_ARCHITECTURE),win)
ifeq ($(call find_in_path_par,$(HB_CCPREFIX),$(HB_CCPATH)),)
HB_CCPREFIX :=
HB_CCPATH :=
endif
# try to detect MinGW cross-compiler location using some default platform settings
ifeq ($(HB_CCPATH)$(HB_CCPREFIX),)
ifneq ($(call find_in_path_raw,debian_version,/etc),)
HB_CCPREFIX := i586-mingw32msvc-
else
ifneq ($(call find_in_path_raw,gentoo-release,/etc),)
ifneq ($(call find_in_path_par,i386-mingw32-,/opt/xmingw/bin),)
HB_CCPATH := /opt/xmingw
HB_CCPREFIX := i386-mingw32-
else
HB_CCPREFIX := i686-mingw32-
endif
else
ifeq ($(HB_ARCHITECTURE),bsd)
HB_CCPATH := /usr/local/mingw32
else
MINGW_OK := $(strip $(foreach d, i386-mingw i486-mingw i586-mingw i686-mingw i386-mingw32 i486-mingw32 i586-mingw32 i686-mingw32, $(if $(wildcard /usr/local/bin/$(d)-gcc),$(d),)))
ifneq ($(MINGW_OK),)
HB_CCPATH := /usr/local/bin
HB_CCPREFIX := $(MINGW_OK)-
endif
endif
endif
endif
endif
# generic detection for mingw cross-compiler
ifeq ($(HB_CCPATH)$(HB_CCPREFIX),)
MINGW_BASE_LIST := /usr /usr/local /usr/local/mingw32 /opt/xmingw
MINGW_PREFIX := $(subst -gcc,,$(firstword $(call find_in_path_par,bin/i?86-mingw*-,$(MINGW_BASE_LIST))))
ifneq ($(MINGW_PREFIX),)
HB_CCPATH := $(dir $(MINGW_PREFIX))
HB_CCPREFIX := $(notdir $(MINGW_PREFIX))
else
MINGW_PREFIX := $(dir $(firstword $(call find_in_path_par,i?86-mingw*/bin/,$(MINGW_BASE_LIST))))
ifneq ($(MINGW_PREFIX),)
HB_CCPATH := $(MINGW_PREFIX)
HB_CCPREFIX :=
endif
endif
endif
ifneq ($(HB_CCPATH)$(HB_CCPREFIX),)
HB_COMPILER := mingw
HB_ARCHITECTURE := win
export HB_TOOLS_PREF := hbw
export HB_XBUILD := win
ifneq ($(HB_HOST_BUILD),all)
HB_HOST_BUILD := lib
endif
else
$(error ! Harbour build couldn't find mingw32 cross-compiler. Please install it, or point HB_CCPATH/HB_CCPREFIX environment variables to it)
endif
else
ifeq ($(HB_ARCHITECTURE),wce)
ifeq ($(HB_CCPATH),)
HB_CCPATH := /opt/mingw32ce/bin/
endif
ifneq ($(call find_in_path_par,arm-wince-mingw32ce-gcc,$(HB_CCPATH)),)
HB_CCPREFIX := arm-wince-mingw32ce-
HB_CCPATH := $(HB_CCPATH)/
else
ifneq ($(call find_in_path_par,arm-mingw32ce-gcc,$(HB_CCPATH)),)
HB_CCPREFIX := arm-mingw32ce-
HB_CCPATH := $(HB_CCPATH)/
else
HB_CCPATH :=
HB_CCPREFIX :=
endif
endif
ifneq ($(HB_CCPATH)$(HB_CCPREFIX),)
HB_COMPILER := mingwarm
HB_ARCHITECTURE := wce
export HB_TOOLS_PREF := hbce
export HB_XBUILD := wce
ifneq ($(HB_HOST_BUILD),all)
HB_HOST_BUILD := lib
endif
else
$(error ! Harbour build couldn't find cegcc cross-compiler. Please install it to /opt/mingw32ce, or point HB_CCPATH/HB_CCPREFIX environment variables to it)
endif
endif
endif
endif
ifeq ($(HB_COMPILER),)
ifeq ($(HB_ARCHITECTURE),win)
ifneq ($(call find_in_path,arm-wince-mingw32ce-gcc),)
HB_COMPILER := mingwarm
HB_ARCHITECTURE := wce
HB_CCPREFIX := arm-wince-mingw32ce-
else
ifneq ($(call find_in_path,arm-mingw32ce-gcc),)
HB_COMPILER := mingwarm
HB_ARCHITECTURE := wce
HB_CCPREFIX := arm-mingw32ce-
else
ifneq ($(call find_in_path,cygstart),)
HB_COMPILER := cygwin
else
ifneq ($(call find_in_path,gcc),)
HB_COMPILER := mingw
else
ifneq ($(call find_in_path,wpp386),)
HB_COMPILER := watcom
else
ifneq ($(call find_in_path,ml64),)
HB_COMPILER := msvc64
else
ifneq ($(call find_in_path,icl),)
HB_COMPILER := icc
else
ifneq ($(call find_in_path,cl),)
HB_COMPILER := msvc
else
ifneq ($(call find_in_path,bcc32),)
HB_COMPILER := bcc
else
ifneq ($(call find_in_path,pocc),)
HB_COMPILER := pocc
else
ifneq ($(call find_in_path,xcc),)
HB_COMPILER := xcc
else
ifneq ($(call find_in_path,x86_64-w64-mingw32-gcc),)
HB_COMPILER := mingw64
HB_CCPREFIX := x86_64-w64-mingw32-
endif
endif
endif
endif
endif
endif
endif
endif
endif
endif
endif
endif
else
ifeq ($(HB_ARCHITECTURE),linux)
ifneq ($(call find_in_path,wpp386),)
HB_COMPILER := watcom
else
ifneq ($(call find_in_path,gcc),)
HB_COMPILER := gcc
endif
endif
else
ifneq ($(findstring $(HB_ARCHITECTURE),darwin hpux bsd),)
ifneq ($(call find_in_path,gcc),)
HB_COMPILER := gcc
endif
else
ifeq ($(HB_ARCHITECTURE),sunos)
ifneq ($(call find_in_path,cc),)
HB_COMPILER := sunpro
else
ifneq ($(call find_in_path,gcc),)
HB_COMPILER := gcc
endif
endif
else
ifeq ($(HB_ARCHITECTURE),dos)
ifneq ($(call find_in_path,gcc),)
HB_COMPILER := djgpp
else
ifneq ($(call find_in_path,wpp386),)
HB_COMPILER := watcom
endif
endif
else
ifeq ($(HB_ARCHITECTURE),os2)
ifneq ($(call find_in_path,gcc),)
HB_COMPILER := gcc
else
ifneq ($(call find_in_path,wpp386),)
HB_COMPILER := watcom
endif
endif
else
# add other platforms here
endif
endif
endif
endif
endif
endif
endif
ifneq ($(HB_COMPILER),)
HB_COMP_AUTO := (autodetected)
endif
export HB_CCPATH
export HB_CCPREFIX
endif
ifeq ($(HB_ARCHITECTURE),)
$(error ! HB_ARCHICTECTURE not set, couldn't autodetect)
endif
ifeq ($(HB_COMPILER),)
$(error ! HB_COMPILER not set, couldn't autodetect)
endif
ifeq ($(HB_INIT_DONE),)
ifneq ($(MAKE_381),)
$(info ! HB_ARCHITECTURE: $(HB_ARCHITECTURE) $(HB_ARCH_AUTO))
$(info ! HB_COMPILER: $(HB_COMPILER) $(HB_COMP_AUTO))
endif
endif
export HB_ARCHITECTURE
export HB_COMPILER
ARCH_COMP := $(HB_ARCHITECTURE)/$(HB_COMPILER)$(subst \,/,$(HB_BUILD_NAME))
OBJ_DIR := obj/$(ARCH_COMP)
BIN_DIR := $(TOP)$(ROOT)bin/$(ARCH_COMP)
LIB_DIR := $(TOP)$(ROOT)lib/$(ARCH_COMP)
# define PKG_DIR only if run from root Makefile
ifneq ($(HB_POSTINST),)
PKG_DIR := $(TOP)$(ROOT)pkg/$(ARCH_COMP)
endif
# Assemble relative path from OBJ_DIR to source.
GRANDP := $(subst $(subst x,x, ),,$(foreach item, $(subst /, ,$(OBJ_DIR)), ../))
# TODO: Set this in <arch>/<comp>.mk
HB_CPU :=
ifeq ($(HB_ARCHITECTURE),win)
ifeq ($(HB_COMPILER),msvc64)
HB_CPU := x86_64
else
ifeq ($(HB_COMPILER),mingw64)
HB_CPU := x86_64
else
ifeq ($(HB_COMPILER),pocc64)
HB_CPU := x86_64
else
ifeq ($(HB_COMPILER),msvcia64)
HB_CPU := ia64
else
ifeq ($(HB_COMPILER),iccia64)
HB_CPU := ia64
else
HB_CPU := x86
endif
endif
endif
endif
endif
endif
ifeq ($(HB_BUILD_VERBOSE),yes)
ifneq ($(MAKE_381),)
$(info ! Detected target CPU: $(HB_CPU))
endif
endif
ifneq ($(findstring $(HB_ARCHITECTURE),win wce dos os2),)
HB_OS_UNIX := no
else
HB_OS_UNIX := yes
endif
# Reserve variables for local compiler flags. Makefiles
# should only modify these instead of HB_USER_* variables
# as these can have bad side effects (doubly added values)
# caused by recursive GNU Make runs.
# Notice that even single lib/bin builds will currently
# result in recursive runs, see rule 'descend'. [vszakats]
HB_CFLAGS :=
HB_PRGFLAGS :=
HB_CROSS_BUILD :=
ifneq ($(HB_HOST_ARCH)$(HB_HOST_CPU),$(HB_ARCHITECTURE)$(HB_CPU))
ifeq ($(HB_BIN_COMPILE),)
# Not required in these combinations: [vszakats]
ifneq ($(HB_HOST_ARCH)-$(HB_HOST_CPU)-$(HB_ARCHITECTURE)-$(HB_CPU),win-x86_64-win-x86)
ifneq ($(HB_HOST_ARCH)-$(HB_HOST_CPU)-$(HB_ARCHITECTURE)-$(HB_CPU),win-x86-dos-)
HB_CROSS_BUILD := yes
# Try to autosetup
HB_BIN_COMPILE := $(dir $(firstword $(wildcard $(TOP)$(ROOT)bin/$(HB_HOST_ARCH)/*/harbour$(HB_HOST_BIN_EXT))))
ifeq ($(HB_BIN_COMPILE),)
HB_BIN_COMPILE := $(dir $(firstword $(foreach dir,$(subst $(PTHSEP), ,$(PATH)),$(wildcard $(dir)/harbour$(HB_HOST_BIN_EXT)))))
ifneq ($(HB_BIN_COMPILE),)
HB_BIN_COMPILE := $(realpath $(HB_BIN_COMPILE))
endif
else
HB_BIN_COMPILE := $(realpath $(HB_BIN_COMPILE))
endif
ifeq ($(HB_BIN_COMPILE),)
$(warning ! Warning: HB_BIN_COMPILE not specified. Couldn't find native build)
else
ifneq ($(MAKE_381),)
$(info ! HB_BIN_COMPILE not specified. Automatically set to: $(HB_BIN_COMPILE))
endif
endif
endif
endif
export HB_BIN_COMPILE
else
HB_CROSS_BUILD := yes
endif
ifeq ($(HB_CROSS_BUILD),yes)
# Setup platform macros (undefine host, define target)
ifeq ($(HB_HOST_ARCH),win)
HB_PRGFLAGS += -undef:__PLATFORM__WINDOWS
else
ifeq ($(HB_HOST_ARCH),dos)
HB_PRGFLAGS += -undef:__PLATFORM__DOS
else
ifeq ($(HB_HOST_ARCH),os2)
HB_PRGFLAGS += -undef:__PLATFORM__OS2
else
ifeq ($(HB_HOST_ARCH),linux)
HB_PRGFLAGS += -undef:__PLATFORM__LINUX -undef:__PLATFORM__UNIX
endif
endif
endif
endif
ifeq ($(HB_ARCHITECTURE),win)
HB_PRGFLAGS += -D__PLATFORM__WINDOWS
ifeq ($(HB_CPU),x86_64)
HB_PRGFLAGS += -D__ARCH64BIT__
else
ifeq ($(HB_CPU),ia64)
HB_PRGFLAGS += -D__ARCH64BIT__
endif
endif
else
ifeq ($(HB_ARCHITECTURE),wce)
HB_PRGFLAGS += -D__PLATFORM__WINDOWS -D__PLATFORM__WINCE
else
ifeq ($(HB_ARCHITECTURE),dos)
HB_PRGFLAGS += -D__PLATFORM__DOS
else
ifeq ($(HB_ARCHITECTURE),os2)
HB_PRGFLAGS += -D__PLATFORM__OS2
else
ifeq ($(HB_ARCHITECTURE),linux)
HB_PRGFLAGS += -D__PLATFORM__LINUX -D__PLATFORM__UNIX
endif
endif
endif
endif
endif
endif
endif
# Exclude Harbour-wide features prohibiting commercial usage
ifeq ($(HB_COMMERCE),yes)
export HB_GPM_MOUSE := no
export HB_WITHOUT_GTSLN := yes
endif
# Detect OpenSSL lib
ifeq ($(HB_HAS_OPENSSL),)
HB_HAS_OPENSSL := no
ifneq ($(HB_ARCHITECTURE),dos)
ifneq ($(HB_COMPILER),watcom)
ifeq ($(HB_INC_OPENSSL),)
ifeq ($(HB_XBUILD),)
HB_INC_OPENSSL := /usr/include /usr/local/ssl/include
endif
endif
HB_INC_OPENSSL := $(strip $(foreach d,$(HB_INC_OPENSSL),$(if $(wildcard $(d)/openssl/ssl.h),$(d),)))
ifneq ($(HB_INC_OPENSSL),)
HB_HAS_OPENSSL := yes
export HB_INC_OPENSSL
endif
endif
endif
export HB_HAS_OPENSSL
endif
# Detect GPM mouse lib
ifeq ($(HB_GPM_MOUSE),)
HB_GPM_MOUSE := no
ifeq ($(HB_INC_GPM),)
HB_INC_GPM := /usr/include /usr/local/include
endif
ifneq ($(strip $(foreach d,$(HB_INC_GPM),$(if $(wildcard $(d)/gpm.h),$(d),))),)
HB_GPM_MOUSE := yes
endif
export HB_GPM_MOUSE
endif
# Names of portable GT drivers
HB_GT_LIBS := \
gtcgi \
gtpca \
gtstd \
# Names of valid RDD libraries
HB_RDD_LIBS := \
rddntx \
rddnsx \
rddcdx \
rddfpt \
hbsix \
hbhsx \
hbusrrdd \
hbuddall \
# Names of valid RDD subdirectories
HB_RDD_DIRS := \
dbfntx \
dbfnsx \
dbfcdx \
dbffpt \
hbsix \
hsx \
usrrdd \
usrrdd/rdds \
ifneq ($(HB_DB_DRVEXT),)
HB_RDD_LIBS += $(HB_DB_DRVEXT)
HB_RDD_DIRS += $(HB_DB_DRVEXT)
endif
ifneq ($(HB_HOST_ARCH),dos)
HB_VERSION := 2.0.0beta2
HB_PKGNAME := harbour-$(HB_VERSION)-$(HB_ARCHITECTURE)-$(HB_COMPILER)
HB_PKGNAMI := $(HB_PKGNAME)
else
# Use short names in MS-DOS
HB_VERSION := 2b2
HB_PKGNAME := hb$(HB_VERSION)
# Ugly solution
ifeq ($(HB_COMPILER),djgpp)
HB_PKGNAME += dj
else
ifeq ($(HB_COMPILER),watcom)
HB_PKGNAME += wa
endif
endif
HB_PKGNAMI := $(HB_PKGNAME)
endif
export HB_VERSION
export HB_PKGNAME
export HB_PKGNAMI
HB_INSTALL_PREFIX_ORI := $(HB_INSTALL_PREFIX)
ifeq ($(HB_BUILD_PKG),yes)
ifeq ($(HB_INIT_DONE),)
export HB_TOP := $(subst /,$(DIRSEP),$(realpath $(TOP)$(ROOT)))
HB_INSTALL_PREFIX := $(subst /,$(DIRSEP),$(abspath $(PKG_DIR)/$(HB_PKGNAME)))
HB_BIN_INSTALL :=
HB_INC_INSTALL :=
HB_LIB_INSTALL :=
HB_DOC_INSTALL :=
endif
else
# Fill it automatically if not specified
ifeq ($(HB_INSTALL_PREFIX),)
ifeq ($(HB_OS_UNIX),no)
HB_INSTALL_PREFIX := $(realpath $(TOP)$(ROOT))
else
ifneq ($(PREFIX),)
HB_INSTALL_PREFIX := $(PREFIX)
else
ifneq ($(DESTDIR),)
HB_INSTALL_PREFIX := $(DESTDIR)
else
# Stick to *nix customs. I don't like it, it needs admin.
HB_INSTALL_PREFIX := /usr/local
# Add postfix for cross builds
ifneq ($(HB_HOST_ARCH),$(HB_ARCHITECTURE))
HB_INSTALL_PREFIX += /harbour-$(HB_ARCHITECTURE)-$(HB_COMPILER)
endif
endif
endif
endif
HB_INSTALL_PREFIX := $(subst /,$(DIRSEP),$(HB_INSTALL_PREFIX))
else
# TOFIX: HB_INSTALL_PREFIX will have to be duplicated internally to avoid
# recursive operation here.
# Handle simple macros in value
HB_INSTALL_PREFIX := $(subst {HB_ARCH},$(HB_ARCHITECTURE),$(HB_INSTALL_PREFIX))
HB_INSTALL_PREFIX := $(subst {HB_COMP},$(HB_COMPILER),$(HB_INSTALL_PREFIX))
HB_INSTALL_PREFIX := $(subst {HB_CPU},$(HB_CPU),$(HB_INSTALL_PREFIX))
HB_INSTALL_PREFIX := $(subst {HB_TOP},$(realpath $(TOP)$(ROOT)),$(HB_INSTALL_PREFIX))
HB_INSTALL_PREFIX := $(subst /,$(DIRSEP),$(HB_INSTALL_PREFIX))
endif
endif
export HB_INSTALL_PREFIX
ifneq ($(HB_INSTALL_PREFIX_ORI),$(HB_INSTALL_PREFIX))
ifneq ($(MAKE_381),)
$(info ! HB_INSTALL_PREFIX set to: $(HB_INSTALL_PREFIX))
endif
endif
ifneq ($(HB_INSTALL_PREFIX),)
ifeq ($(HB_OS_UNIX),no)
LIBPOSTFIX := $(DIRSEP)$(subst /,$(DIRSEP),$(ARCH_COMP))
else
# Not perfect, please enhance it.
ifneq ($(findstring /usr,$(HB_INSTALL_PREFIX)),)
ifeq ($(findstring /usr/home,$(HB_INSTALL_PREFIX)),)
LIBPOSTFIX := $(DIRSEP)harbour
INCPOSTFIX := $(DIRSEP)harbour
endif
else
ifneq ($(findstring /opt,$(HB_INSTALL_PREFIX)),)
LIBPOSTFIX := $(DIRSEP)harbour
INCPOSTFIX := $(DIRSEP)harbour
endif
endif
endif
ifeq ($(HB_BIN_INSTALL),)
export HB_BIN_INSTALL := $(HB_INSTALL_PREFIX)$(DIRSEP)bin
endif
ifeq ($(HB_LIB_INSTALL),)
export HB_LIB_INSTALL := $(HB_INSTALL_PREFIX)$(DIRSEP)lib$(LIBPOSTFIX)
endif
ifeq ($(HB_INC_INSTALL),)
export HB_INC_INSTALL := $(HB_INSTALL_PREFIX)$(DIRSEP)include$(INCPOSTFIX)
endif
ifeq ($(HB_DOC_INSTALL),)
# Don't set doc dir for *nix targets
ifeq ($(HB_OS_UNIX),no)
export HB_DOC_INSTALL := $(HB_INSTALL_PREFIX)$(DIRSEP)doc
endif
endif
endif
export HB_OBJ_DIR := $(subst /,$(DIRSEP),$(OBJ_DIR))
ifeq ($(HB_BIN_COMPILE),)
HB_HOST_BIN_DIR := $(BIN_DIR)
else
HB_HOST_BIN_DIR := $(HB_BIN_COMPILE)
endif
ifeq ($(HB_INC_COMPILE),)
HB_INC_COMPILE := $(TOP)$(ROOT)include
endif
HB_DYN_COMPILE := no
# export some variables to eliminate repeated setting in recursive calls
export HB_HOST_ARCH
export HB_HOST_CPU
export HB_HOST_BIN_DIR
# clear these options for an unambiguous Harbour enviornment
export HARBOUR :=
export HARBOURCMD :=
export CLIPPER :=
export CLIPPERCMD :=
# relevant only on non-*nix hosts where --print-directory is on by default
ifeq ($(findstring w,$(MAKEFLAGS)),)
MKFLAGS := --no-print-directory
endif
export HB_INIT_DONE := yes
include $(TOP)$(ROOT)config/$(HB_ARCHITECTURE)/global.mk
include $(TOP)$(ROOT)config/globsh.mk
endif
endif # GLOBAL_CF_