diff --git a/harbour/ChangeLog b/harbour/ChangeLog index 15a03f3b92..a1f0ee5ae2 100644 --- a/harbour/ChangeLog +++ b/harbour/ChangeLog @@ -17,6 +17,42 @@ past entries belonging to author(s): Viktor Szakats. */ +2009-08-21 12:46 UTC+0200 Viktor Szakats (harbour.01 syenar.hu) + * source/Makefile + ! Fixed typo in prev commit. + + * config/global.mk + * config/wce/poccarm.mk + * config/wce/msvcarm.mk + * config/win/xcc.mk + * config/win/mingw.mk + * config/win/pocc.mk + * config/win/bcc.mk + * config/win/watcom.mk + * config/win/icc.mk + * config/win/msvc.mk + * config/dyn.mk + * config/rules.mk + + Added OBJ_DYN_POSTFIX variable instead of hardcoded '_dyn'. + + * config/global.mk + * config/dyn.mk + + Added DYN_DIR. Set to LIB_DIR for *nix, BIN_DIR for non-*nix. + + * config/globsh.mk + + Added dynamic lib dir/file related dir creation and cleanup rules. + + * config/win/mingw.mk + * config/wce/mingwarm.mk + + Added space between -o and output filename. + (this should probably be made default) + + * config/win/mingw.mk + + Added .dll build rules. + + * config/win/bcc.mk + % Using $(wildcard) instead of echo trick to delete __lib__.tmp. + 2009-08-21 11:29 UTC+0200 Viktor Szakats (harbour.01 syenar.hu) * source/dynlib/Makefile * source/Makefile diff --git a/harbour/config/dyn.mk b/harbour/config/dyn.mk index 5b7a2f19a1..3295f187fd 100644 --- a/harbour/config/dyn.mk +++ b/harbour/config/dyn.mk @@ -14,16 +14,16 @@ include $(TOP)$(ROOT)config/prg.mk DYN_NAME := $(DYN_PREF)$(DYNNAME)$(DYN_EXT) -DYN_FILE := $(BIN_DIR)/$(DYN_NAME) +DYN_FILE := $(DYN_DIR)/$(DYN_NAME) -ALL_OBJS := $(subst /,$(DIRSEP),$(foreach dir,$(DYNDIRLIST),$(wildcard $(TOP)$(ROOT)$(dir)/$(OBJ_DIR)/*_dyn$(OBJ_EXT)))) +ALL_OBJS := $(subst /,$(DIRSEP),$(foreach dir,$(DYNDIRLIST),$(wildcard $(TOP)$(ROOT)$(dir)/$(OBJ_DIR)/*$(OBJ_DYN_POSTFIX)$(OBJ_EXT)))) first:: dirbase descend descend:: dirbase +@$(MK) $(MKFLAGS) -C $(OBJ_DIR) -f $(GRANDP)Makefile TOP=$(GRANDP) $(DYN_NAME) -vpath $(DYN_NAME) $(BIN_DIR) +vpath $(DYN_NAME) $(DYN_DIR) $(DYN_NAME) : $(ALL_OBJS) $(DY_RULE) diff --git a/harbour/config/global.mk b/harbour/config/global.mk index dda4da1db2..bac357fc8d 100644 --- a/harbour/config/global.mk +++ b/harbour/config/global.mk @@ -705,17 +705,29 @@ endif export HB_ARCHITECTURE export HB_COMPILER +ifneq ($(filter $(HB_ARCHITECTURE),win wce dos os2),) + HB_OS_UNIX := no +else + HB_OS_UNIX := yes +endif + 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) +ifeq ($(HB_OS_UNIX),yes) + DYN_DIR := $(LIB_DIR) +else + DYN_DIR := $(BIN_DIR) +endif # define PKG_DIR only if run from root Makefile ifeq ($(ROOT),./) PKG_DIR := $(TOP)$(ROOT)pkg/$(ARCH_COMP) else PKG_DIR := endif +OBJ_DYN_POSTFIX := # Assemble relative path from OBJ_DIR to source. GRANDP := $(subst $(subst x,x, ),,$(foreach item, $(subst /, ,$(OBJ_DIR)), ../)) @@ -761,12 +773,6 @@ ifeq ($(HB_INIT_DONE),) endif endif -ifneq ($(filter $(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) diff --git a/harbour/config/globsh.mk b/harbour/config/globsh.mk index f7b3051cd7..150c6023b6 100644 --- a/harbour/config/globsh.mk +++ b/harbour/config/globsh.mk @@ -24,6 +24,8 @@ LIB_DIR_OS = $(subst /,\,$(LIB_DIR)) LIB_FILE_OS = $(subst /,\,$(LIB_FILE)) BIN_DIR_OS = $(subst /,\,$(BIN_DIR)) BIN_FILE_OS = $(subst /,\,$(BIN_FILE)) +DYN_DIR_OS = $(subst /,\,$(DYN_DIR)) +DYN_FILE_OS = $(subst /,\,$(DYN_FILE)) endif @@ -42,9 +44,10 @@ dirbase:: @[ -d "$(OBJ_DIR)" ] || $(MDP) $(OBJ_DIR) @[ -z "$(LIB_FILE)" ] || [ -d "$(LIB_DIR)" ] || $(MDP) $(LIB_DIR) @[ -z "$(BIN_FILE)" ] || [ -d "$(BIN_DIR)" ] || $(MDP) $(BIN_DIR) + @[ -z "$(DYN_FILE)" ] || [ -d "$(DYN_DIR)" ] || $(MDP) $(DYN_DIR) clean:: - -@$(RDP) $(PKG_DIR) $(OBJ_DIR) $(LIB_FILE) $(BIN_FILE); \ + -@$(RDP) $(PKG_DIR) $(OBJ_DIR) $(LIB_FILE) $(BIN_FILE) $(DYN_FILE); \ if [ -n "$(LIB_FILE)" ]; then \ $(RM) $(basename $(LIB_FILE)).bak; \ [ "`$(ECHO) $(LIB_DIR)/*`" != "$(LIB_DIR)/*" ] || $(RDP) $(LIB_DIR); \ @@ -52,6 +55,10 @@ clean:: if [ -n "$(BIN_FILE)" ]; then \ $(RM) $(basename $(BIN_FILE)).tds; \ [ "`$(ECHO) $(BIN_DIR)/*`" != "$(BIN_DIR)/*" ] || $(RDP) $(BIN_DIR); \ + fi ; \ + if [ -n "$(DYN_FILE)" ]; then \ + $(RM) $(basename $(DYN_FILE)).exp; \ + [ "`$(ECHO) $(DYN_DIR)/*`" != "$(DYN_DIR)/*" ] || $(RDP) $(DYN_DIR); \ fi endif @@ -76,6 +83,7 @@ dirbase:: -@if not exist "$(OBJ_DIR_OS)" $(MDP) "$(OBJ_DIR_OS)" $(if $(LIB_FILE),-@if not exist "$(LIB_DIR_OS)" $(MDP) "$(LIB_DIR_OS)",) $(if $(BIN_FILE),-@if not exist "$(BIN_DIR_OS)" $(MDP) "$(BIN_DIR_OS)",) + $(if $(DYN_FILE),-@if not exist "$(DYN_DIR_OS)" $(MDP) "$(DYN_DIR_OS)",) clean:: -@if exist "$(OBJ_DIR_OS)" $(RDP) "$(OBJ_DIR_OS)" @@ -86,6 +94,9 @@ clean:: $(if $(BIN_FILE),-@if exist "$(BIN_FILE_OS)" $(RM) "$(BIN_FILE_OS)",) $(if $(BIN_FILE),-@if exist "$(basename $(BIN_FILE_OS)).tds" $(RM) "$(basename $(BIN_FILE_OS)).tds",) $(if $(BIN_FILE),-@if exist "$(BIN_DIR_OS)" if not exist "$(BIN_DIR_OS)\*" $(RDP) "$(BIN_DIR_OS)",) + $(if $(DYN_FILE),-@if exist "$(DYN_FILE_OS)" $(RM) "$(DYN_FILE_OS)",) + $(if $(DYN_FILE),-@if exist "$(basename $(DYN_FILE_OS)).exp" $(RM) "$(basename $(DYN_FILE_OS)).exp",) + $(if $(DYN_FILE),-@if exist "$(DYN_DIR_OS)" if not exist "$(DYN_DIR_OS)\*" $(RDP) "$(DYN_DIR_OS)",) endif @@ -104,11 +115,13 @@ dirbase:: -@if not exist $(OBJ_DIR_OS) $(MDP) $(OBJ_DIR) $(if $(LIB_FILE),-@if not exist $(LIB_DIR_OS) $(MDP) $(LIB_DIR),) $(if $(BIN_FILE),-@if not exist $(BIN_DIR_OS) $(MDP) $(BIN_DIR),) + $(if $(DYN_FILE),-@if not exist $(DYN_DIR_OS) $(MDP) $(DYN_DIR),) clean:: @$(RDP) $(PKG_DIR_OS) $(OBJ_DIR_OS) $(LIB_FILE_OS) $(BIN_FILE_OS) $(if $(LIB_FILE),-@if exist $(LIB_DIR_OS) $(RDP) $(LIB_DIR_OS),) $(if $(BIN_FILE),-@if exist $(BIN_DIR_OS) $(RDP) $(BIN_DIR_OS),) + $(if $(DYN_FILE),-@if exist $(DYN_DIR_OS) $(RDP) $(DYN_DIR_OS),) endif @@ -127,6 +140,7 @@ dirbase:: -@$(MDP) $(OBJ_DIR_OS) $(if $(LIB_FILE),-@$(MDP) $(LIB_DIR_OS),) $(if $(BIN_FILE),-@$(MDP) $(BIN_DIR_OS),) + $(if $(DYN_FILE),-@$(MDP) $(DYN_DIR_OS),) clean:: -@$(RDP) $(PKG_DIR_OS) $(OBJ_DIR_OS) $(LIB_FILE_OS) $(BIN_FILE_OS) @@ -134,5 +148,7 @@ clean:: $(if $(LIB_FILE),$(if $(wildcard $(LIB_DIR_OS)/*.*),,-@$(RDP) $(LIB_DIR_OS)),) $(if $(BIN_FILE),-@$(RM) $(basename $(BIN_FILE_OS)).tds,) $(if $(BIN_FILE),$(if $(wildcard $(BIN_DIR_OS)/*.*),,-@$(RDP) $(BIN_DIR_OS)),) + $(if $(DYN_FILE),-@$(RM) $(basename $(DYN_FILE_OS)).exp,) + $(if $(DYN_FILE),$(if $(wildcard $(DYN_DIR_OS)/*.*),,-@$(RDP) $(DYN_DIR_OS)),) endif diff --git a/harbour/config/rules.mk b/harbour/config/rules.mk index 1d4fdeeb55..e954b4c221 100644 --- a/harbour/config/rules.mk +++ b/harbour/config/rules.mk @@ -38,7 +38,7 @@ ifeq ($(CC_RULE),) ifneq ($(filter $(LIBNAME),$(HB_DYN_LIBS)),) define cc_comp_all $(CC) $(CC_FLAGS) $(HB_USER_CFLAGS) $(CC_OUT)$( __lib__.tmp + $(if $(wildcard __lib__.tmp),@$(RM) __lib__.tmp,) $(foreach file,$(^F),$(lib_object)) @$(ECHO) -+>> __lib__.tmp $(AR) $(ARFLAGS) $(HB_USER_AFLAGS) "$(subst /,\,$(LIB_DIR)/$@)" @__lib__.tmp diff --git a/harbour/config/win/icc.mk b/harbour/config/win/icc.mk index 4dbd9be3d8..087ffd91cc 100644 --- a/harbour/config/win/icc.mk +++ b/harbour/config/win/icc.mk @@ -10,6 +10,7 @@ LIB_PREF := LIB_EXT := .lib HB_DYN_COPT := -DHB_DYNLIB +OBJ_DYN_POSTFIX := _dyn CC := icl.exe CC_IN := -c diff --git a/harbour/config/win/mingw.mk b/harbour/config/win/mingw.mk index 182664e16c..9ebac6c53a 100644 --- a/harbour/config/win/mingw.mk +++ b/harbour/config/win/mingw.mk @@ -37,7 +37,7 @@ ifeq ($(HB_BUILD_DEBUG),yes) endif LD := $(HB_CCPATH)$(HB_CCPREFIX)$(HB_CMP) -LD_OUT := -o +LD_OUT := -o$(subst x,x, ) LIBPATHS := -L$(LIB_DIR) LDLIBS := $(foreach lib,$(LIBS) $(SYSLIBS),-l$(lib)) @@ -55,4 +55,22 @@ AR := $(HB_CCPATH)$(HB_CCPREFIX)ar ARFLAGS := AR_RULE = $(AR) $(ARFLAGS) $(HB_USER_AFLAGS) crs $(LIB_DIR)/$@ $(^F) || $(RM) $(subst /,$(DIRSEP),$(LIB_DIR)/$@) +DY := $(CC) +DFLAGS := -shared +DY_OUT := $(LD_OUT) +DLIBS := $(foreach lib,$(SYSLIBS),-l$(lib)) + +# NOTE: The empty line directly before 'endef' HAVE TO exist! +define dyn_object + @$(ECHO) $(ECHOQUOTE)INPUT($(subst \,/,$(file)))$(ECHOQUOTE) >> __dyn__.tmp + +endef +define create_dynlib + $(if $(wildcard __dyn__.tmp),@$(RM) __dyn__.tmp,) + $(foreach file,$^,$(dyn_object)) + $(DY) $(DFLAGS) $(DY_OUT)"$(BIN_DIR)/$@"$(ECHOQUOTE) __dyn__.tmp $(HB_USER_DFLAGS) $(DLIBS) -Wl,--output-def,"$(BIN_DIR)/$(basename $@).def" +endef + +DY_RULE = $(create_dynlib) + include $(TOP)$(ROOT)config/rules.mk diff --git a/harbour/config/win/msvc.mk b/harbour/config/win/msvc.mk index f9a5656cc4..0b6e514a64 100644 --- a/harbour/config/win/msvc.mk +++ b/harbour/config/win/msvc.mk @@ -7,6 +7,7 @@ LIB_PREF := LIB_EXT := .lib HB_DYN_COPT := -DHB_DYNLIB +OBJ_DYN_POSTFIX := _dyn CC := cl.exe CC_IN := -c diff --git a/harbour/config/win/pocc.mk b/harbour/config/win/pocc.mk index 152efd8fed..9ee63b259b 100644 --- a/harbour/config/win/pocc.mk +++ b/harbour/config/win/pocc.mk @@ -9,6 +9,7 @@ LIB_PREF := LIB_EXT := .lib HB_DYN_COPT := -DHB_DYNLIB +OBJ_DYN_POSTFIX := _dyn CC := pocc.exe CC_IN := -c diff --git a/harbour/config/win/watcom.mk b/harbour/config/win/watcom.mk index d8206ab58e..6e6a85b2e2 100644 --- a/harbour/config/win/watcom.mk +++ b/harbour/config/win/watcom.mk @@ -9,6 +9,7 @@ LIB_PREF := LIB_EXT := .lib HB_DYN_COPT := -DHB_DYNLIB +OBJ_DYN_POSTFIX := _dyn ifeq ($(HB_BUILD_MODE),c) CC := wcc386 diff --git a/harbour/config/win/xcc.mk b/harbour/config/win/xcc.mk index f15a6a24b0..0ba4158df3 100644 --- a/harbour/config/win/xcc.mk +++ b/harbour/config/win/xcc.mk @@ -9,6 +9,7 @@ LIB_PREF := LIB_EXT := .lib HB_DYN_COPT := -DHB_DYNLIB +OBJ_DYN_POSTFIX := _dyn CC := xcc.exe CC_IN := -c diff --git a/harbour/source/Makefile b/harbour/source/Makefile index cba4a26c26..d3c4248a1f 100644 --- a/harbour/source/Makefile +++ b/harbour/source/Makefile @@ -6,44 +6,44 @@ ROOT := ../ ifeq ($(HB_HOST_BUILD),yes) -DIRS := \ - common \ - nortl \ - pp{common,nortl} \ - compiler{pp} \ - main{compiler} \ + DIRS := \ + common \ + nortl \ + pp{common,nortl} \ + compiler{pp} \ + main{compiler} \ else -ifeq ($(HB_HOST_BUILD),lib) - HB_COMP_DIR := - HB_COMP_REF := -else - HB_COMP_DIR := main{compiler} - HB_COMP_REF := {main} -endif - -DIRS := \ - common \ - nortl \ - pp{common,nortl} \ - compiler{pp} \ - $(HB_COMP_DIR) \ - rtl$(HB_COMP_REF) \ - vm$(HB_COMP_REF) \ - macro \ - codepage \ - lang \ - rdd$(HB_COMP_REF) \ - hbextern$(HB_COMP_REF) \ - hbpcre \ - hbzlib \ - debug$(HB_COMP_REF) - - ifneq ($(HB_BUILD_DLL),no) - DIRS += dynlib{codepage,common,hbextern,hbpcre,hbzlib,lang,macro,pp,rdd,rtl,vm} \ + ifeq ($(HB_HOST_BUILD),lib) + HB_COMP_DIR := + HB_COMP_REF := + else + HB_COMP_DIR := main{compiler} + HB_COMP_REF := {main} endif + DIRS := \ + common \ + nortl \ + pp{common,nortl} \ + compiler{pp} \ + $(HB_COMP_DIR) \ + rtl$(HB_COMP_REF) \ + vm$(HB_COMP_REF) \ + macro \ + codepage \ + lang \ + rdd$(HB_COMP_REF) \ + hbextern$(HB_COMP_REF) \ + hbpcre \ + hbzlib \ + debug$(HB_COMP_REF) + + ifneq ($(HB_BUILD_DLL),no) + DIRS += dynlib{codepage,common,hbextern,hbpcre,hbzlib,lang,macro,pp,rdd,rtl,vm} + endif + endif include $(ROOT)config/dir.mk