* config/win/clang.mk
+ add resource compiler detection chain to first stage,
now harbour.exe binary should also have manifest resource
compiled in when clang is used. Previously second stage rc
calling was implemented only in hbmk2.
* utils/hbmk2/hbmk2.prg
! fixed disappearing llvm-ar with fallback to ar, spotted
in windows-ci/MSYS2
152 lines
3.8 KiB
Makefile
152 lines
3.8 KiB
Makefile
ifeq ($(HB_BUILD_MODE),cpp)
|
|
HB_CMP := clang++
|
|
else
|
|
HB_CMP := clang
|
|
endif
|
|
|
|
OBJ_EXT := .o
|
|
ifeq ($(MSYSTEM),)
|
|
LIB_PREF :=
|
|
LIB_EXT := .lib
|
|
else
|
|
LIB_PREF := lib
|
|
LIB_EXT := .a
|
|
endif
|
|
|
|
HB_DYN_COPT := -DHB_DYNLIB
|
|
|
|
CC := $(HB_CCPATH)$(HB_CCPREFIX)$(HB_CMP)$(HB_CCSUFFIX)
|
|
ifneq ($(filter --analyze, $(HB_USER_CFLAGS)),)
|
|
CC_IN :=
|
|
else
|
|
CC_IN := -c
|
|
endif
|
|
CC_OUT := -o
|
|
|
|
CFLAGS += -I. -I$(HB_HOST_INC)
|
|
|
|
ifneq ($(HB_BUILD_WARN),no)
|
|
CFLAGS += -W -Wall
|
|
else
|
|
CFLAGS += -Wmissing-braces -Wreturn-type -Wformat
|
|
ifneq ($(HB_BUILD_MODE),cpp)
|
|
CFLAGS += -Wimplicit-int -Wimplicit-function-declaration
|
|
endif
|
|
endif
|
|
|
|
ifneq ($(HB_BUILD_OPTIM),no)
|
|
CFLAGS += -O3
|
|
endif
|
|
|
|
ifeq ($(HB_BUILD_DEBUG),yes)
|
|
CFLAGS += -g
|
|
endif
|
|
|
|
LD := $(CC)
|
|
LD_OUT := -o
|
|
|
|
LIBPATHS := $(foreach dir,$(LIB_DIR) $(SYSLIBPATHS),-L$(dir))
|
|
LDLIBS := $(foreach lib,$(HB_USER_LIBS) $(LIBS) $(SYSLIBS),-l$(lib))
|
|
|
|
LDFLAGS += $(LIBPATHS)
|
|
|
|
HB_AR_PATH := $(call find_in_path,$(HB_CCPREFIX)llvm-ar)
|
|
ifneq ($(HB_AR_PATH),)
|
|
AR := $(HB_CCPREFIX)llvm-ar
|
|
else
|
|
AR := $(HB_CCPREFIX)ar
|
|
endif
|
|
|
|
AR_RULE = ( $(AR) $(ARFLAGS) $(HB_AFLAGS) $(HB_USER_AFLAGS) rcs $(LIB_DIR)/$@ $(^F) $(ARSTRIP) ) || ( $(RM) $(subst /,$(DIRSEP),$(LIB_DIR)/$@) && $(FALSE) )
|
|
|
|
# order of resource compiler detect chain in this stage (hbmk2 uses similar):
|
|
# GNU windres, llvm-windres, llvm-rc
|
|
# non-GNU shown resource file encoding issues
|
|
|
|
RC_OUT := -o$(subst x,x, )
|
|
RCFLAGS += -I. -I$(HB_HOST_INC) -O coff
|
|
RES_EXT := .reso
|
|
|
|
HB_RC_PATH := $(call find_in_path,$(HB_CCPREFIX)windres)
|
|
ifneq ($(HB_RC_PATH),)
|
|
RC := $(HB_CCPREFIX)windres
|
|
else
|
|
HB_RC_PATH := $(call find_in_path,$(HB_CCPREFIX)llvm-windres)
|
|
ifneq ($(HB_RC_PATH),)
|
|
RC := $(HB_CCPREFIX)llvm-windres
|
|
else
|
|
HB_RC_PATH := $(call find_in_path,$(HB_CCPREFIX)llvm-rc)
|
|
ifneq ($(HB_RC_PATH),)
|
|
RC := $(HB_CCPREFIX)llvm-rc
|
|
RCFLAGS := /I. /I$(HB_HOST_INC) /C 1252
|
|
RC_OUT := /FO$(subst x,x, )
|
|
RES_EXT := .res
|
|
endif
|
|
endif
|
|
endif
|
|
|
|
DY := $(CC)
|
|
DFLAGS += -shared $(LIBPATHS)
|
|
DY_OUT := -o$(subst x,x, )
|
|
DLIBS := $(foreach lib,$(HB_USER_LIBS) $(SYSLIBS),-l$(lib))
|
|
|
|
ifeq ($(HB_SHELL),nt)
|
|
define dynlib_object
|
|
@$(ECHO) $(ECHOQUOTE)$(subst \,/,$(file)) $(ECHOQUOTE) >> __dyn__.tmp
|
|
|
|
endef
|
|
ifneq ($(MSYSTEM),)
|
|
# no-op on MSYS under cmd.exe shell
|
|
define dynlib_ln
|
|
|
|
endef
|
|
else
|
|
define dynlib_ln
|
|
$(LN) $(subst /,\,$(DYN_DIR)\$(LIB_PREF)$(basename $@)$(LIB_EXT)) $(subst /,\,$(LIB_DIR)\$(LIB_PREF)$(basename $@)$(LIB_EXT))
|
|
endef
|
|
endif
|
|
else
|
|
define dynlib_object
|
|
@$(ECHO) -n $(ECHOQUOTE)$(subst \,/,$(file)) $(ECHOQUOTE) >> __dyn__.tmp
|
|
|
|
endef
|
|
define dynlib_ln
|
|
$(LN) $(@F) $(DYN_FILE_NVR) && $(LN) $(@F) $(DYN_FILE_CPT)
|
|
endef
|
|
endif
|
|
|
|
TMPSPEC := @__dyn__.tmp
|
|
|
|
# setting HB_USER_FIXES=--mingw-script[...]
|
|
# may help to workaround if old clang + MinGW linker is in use,
|
|
# build may fail either with too long command line or unrecognized argument
|
|
ifneq ($(filter --mingw-script, $(HB_USER_FIXES)),)
|
|
# NOTE: The empty line directly before 'endef' HAS TO exist!
|
|
override define dynlib_object
|
|
@$(ECHO) $(ECHOQUOTE)INPUT($(subst \,/,$(file)))$(ECHOQUOTE) >> __dyn__.tmp
|
|
|
|
endef
|
|
TMPSPEC := __dyn__.tmp
|
|
endif
|
|
|
|
define create_dynlib
|
|
$(if $(wildcard __dyn__.tmp),@$(RM) __dyn__.tmp,)
|
|
$(foreach file,$^,$(dynlib_object))
|
|
$(DY) $(DFLAGS) $(HB_USER_DFLAGS) $(DY_OUT)$(DYN_DIR)/$@ $(TMPSPEC) $(DLIBS) $(IMPLIBFLAGS) $(DYSTRIP) $(DYSTRIP)
|
|
$(dynlib_ln)
|
|
endef
|
|
|
|
# clang distributed by MS uses lld-link, libs are *.lib not lib*.a
|
|
# in opposite MSYS/MinGW needs args to actually make an implib
|
|
ifeq ($(MSYSTEM),)
|
|
LDFLAGS += -Wl,-subsystem:console
|
|
DFLAGS += -Wl,-subsystem:console
|
|
else
|
|
IMPLIBFLAGS = -Wl,--out-implib,$(IMP_FILE),--output-def,$(DYN_DIR)/$(basename $@).def
|
|
endif
|
|
|
|
|
|
DY_RULE = $(create_dynlib)
|
|
|
|
include $(TOP)$(ROOT)config/rules.mk
|