# # $Id$ # # # Makefile for Harbour Project for GNU gcc compiler # # --------------------------------------------------------------- # If you need to set additional compiler/linker options use the # environment variables below, but please DON'T MODIFY THIS FILE # for this purpose. # --------------------------------------------------------------- # # NOTE: You can use these envvars to configure the make process: # (note that these are all optional) # # CFLAGS - Extra C compiler options for libraries and for # executables # C_USR - Extra C compiler options for libraries and for # executables (GNU make compatible envvar) # CLIBFLAGS - Extra C compiler options for the static libraries # CLIBFLAGSDLL - Extra C compiler options for the shared libraries # # LDFLAGS - Extra linker options for the static libraries # LDFLAGSDLL - Extra linker options for the shared libraries # # HARBOURFLAGS - Extra Harbour compiler options for static libs/exes # HARBOURFLAGSDLL - Extra Harbour compiler options for shared libraries # PRG_USR - Extra Harbour compiler options # (GNU make compatible envvar) # HB_GT_DEFAULT - The default GT driver, Choose between : # gtstd (default),gtcgi,gtpca,gttrm,gtcrs,gtsln,gtxwc # HB_GT_LIB - Set if you want to override the default GT driver # (search for HB_GT_LIBS for a list of values) # # HB_GPM_MOUSE - If set to yes enables using GPM mouse driver on console # HB_WITHOUT_GTSLN - If set to yes causes to not build gtsln # (if you don't have slang installed) # # HB_COMMERCE - If set to yes disables pure GNU modules (slang,GPM,...) # HB_BUILD_DLL - If set to yes enables building harbour VM+RTL # dll in addition to normal static build (currently not working) # HB_BUILD_DEBUG - If set to yes causes to compile with debug info # HB_BUILD_VERBOSE - enables echoing commands being executed # HB_REBUILD_PARSER - If set to yes force preprocessing new rules by # bison (you must use bison 2.3 or later) # # HB_INSTALL_PREFIX - Path to instalation directory into which # Harbour will be installed when the command # "make_gcc.bat install" is lauched. Defaults # to current directory # # HB_DOC_PDF - Turns on the .PDF file support in the HBDOC utility. # Note that this will require the pdflib contrib. # --------------------------------------------------------------- .SUFFIXES: #********************************************************** ifndef ECHO ECHO = echo endif ifndef DEL DEL = rm -f endif ifndef COPY COPY = cp endif ifndef LIBPREF LIBPREF=lib endif #********************************************************** #ifeq ($(CC),) #CC = gcc #endif #ifeq ($(LD),) #LD = gcc #endif ifeq ($(MKLIB),) MKLIB = ar endif #********************************************************** # Include Common Object list files shared # between Msvc, Borland and Gcc compilers include common.cf #********************************************************** # Hack for WINDOWS systems. We're removing mainstd file # from VM lib and we're putting it into a new library # libmainstd.a to allow building either CONSOLE or GUI # programs, depending on which library we're linking # against. If we're linking against libmainstd we're # building CONSOLE programs. Otherwise we're building # GUI programs without console. Please note IT IS A # DIRTY HACK and any better solution is HIGHLY WELCOME ifeq ($(HB_ARCHITECTURE),w32) MAIN_LIB = $(LIB_DIR)/$(LIBPREF)mainstd$(LIBEXT) MAIN_LIB_OBJS = $(OBJ_DIR)/mainstd$(OBJEXT) VM_STATIC_LIB_OBJS := $(VM_STATIC_LIB_OBJS:$(OBJ_DIR)/mainstd$(OBJEXT)=) STANDARD_STATIC_HBLIBS := $(STANDARD_STATIC_HBLIBS) $(MAIN_LIB) HB_BUILD_TARGETS := $(MAIN_LIB) $(HB_BUILD_TARGETS) endif #********************************************************** #.SUFFIXES: $(EXEEXT) $(LIBEXT) $(OBJEXT) .prg .c .l .y #********************************************************** # Default sources directory search paths VPATH := $(ALL_SRC_DIRS) $(LIB_DIR) $(BIN_DIR) $(OBJ_DIR) #********************************************************** # Some definitions cannot be kept in Common.mak # due to serious limitations of Microsoft Nmake DLL_OBJS = $(TMP_DLL_OBJS:$(OBJ_DIR)=$(DLL_OBJ_DIR)) #********************************************************** #********************************************************** #********************************************************** # allows to do cross-compiling if neccesary. ifndef HB HB = $(HARBOUR_EXE) endif # allows to do cross-compiling if neccesary. ifndef HBPPGEN HBPPGEN = $(HBPPGEN_EXE) endif #********************************************************** #********************************************************** #********************************************************** #********************************************************** # C compiler flags and Harbour compiler flags. #********************************************************** # Main "Include" directory INCLUDE_DIR := include CFLAGS := -W -Wall -I$(INCLUDE_DIR) $(C_USR) $(CFLAGS) -Iobj/$(CC_DIRNAME) #----------- ifndef GCC_NOOPTIM CFLAGS := -O3 $(CFLAGS) endif #----------- ifeq ($(HB_BUILD_DEBUG),yes) CFLAGS := -g $(CFLAGS) endif #----------- ifneq ($(HB_GT_DEFAULT),) CFLAGS += -DHB_GT_DEFAULT=$(HB_GT_DEFAULT:gt%=%) endif #----------- ifneq ($(HB_GT_LIB),) CFLAGS += -DHB_GT_LIB=$(HB_GT_LIB:gt%=%) endif #----------- CLIBFLAGS := -c $(CFLAGS) $(CLIBFLAGS) CLIBFLAGSDLL := -D__EXPORT__ $(CLIBFLAGS) $(CLIBFLAGSDLL) CEXEFLAGSDLL := $(CLIBFLAGS) $(CEXEFLAGSDLL) # Harbour Compiler Flags HBFLAGSCMN := -i$(INCLUDE_DIR) -q0 -w2 -es2 -gc0 -kM $(PRG_USR) ifdef HB_DOC_PDF HBFLAGSCMN := $(HBFLAGSCMN) -dPDF endif HARBOURFLAGS := -n $(HBFLAGSCMN) $(HARBOURFLAGS) HARBOURFLAGSDLL:= -D__EXPORT__ -n1 -l $(HBFLAGSCMN) $(HARBOURFLAGSDLL) #********************************************************** # Linker Flags #********************************************************** LDFLAGS := $(L_USR) -Wl,--start-group $(STANDARD_STATIC_HBLIBS) # HB_GPM_MOUSE: use gpm mouse driver ifeq ($(HB_GPM_MOUSE),yes) LDFLAGS += -lgpm CFLAGS += -DHAVE_GPM_H endif ifneq ($(findstring -DHB_PCRE_REGEX, $(CFLAGS)),) LDFLAGS += -lpcre endif LDFLAGS += -Wl,--end-group $(HB_OS_LIBS) LDFLAGSDLL := -L$(LIB_DIR) $(LDFLAGSDLL) #********************************************************** # This is needed, otherwise the libs may overflow # when debug info is requested with -v -y ARFLAGS = rc $(A_USR) #********************************************************** # COMPILE Rules #********************************************************** # General *.prg --> *.o COMPILE rule for STATIC Libraries $(OBJ_DIR)/%$(OBJEXT) : %.prg $(HB) $(HARBOURFLAGS) -o$(OBJ_DIR)/ $< $(CC) $(CLIBFLAGS) -o$@ $(OBJ_DIR)/$( *.o COMPILE rule for STATIC Libraries $(OBJ_DIR)/%$(OBJEXT) : %.c $(CC) $(CLIBFLAGS) -o$@ $< #******************************************************* # General *.prg --> *.o COMPILE rule for SHARED Libraries $(DLL_OBJ_DIR)/%$(OBJEXT) : %.prg $(HB) $(HARBOURFLAGSDLL) -o$(DLL_OBJ_DIR)/ $** $(CC) $(CLIBFLAGSDLL) -o$@ $(DLL_OBJ_DIR)/$&.c #---------------------------------------------------------- # General *.c --> *.o COMPILE rule for SHARED Libraries $(DLL_OBJ_DIR)/%$(OBJEXT) : %.c $(CC) $(CLIBFLAGSDLL) -o$@ $< #********************************************************** # General *.o -> *.a LIBRARY CREATION rule #%$(LIBEXT) : %$(OBJEXT) #$(LIB_DIR)/%$(LIBEXT) : $(OBJ_DIR)/%$(OBJEXT) $(LIB_DIR)/%$(LIBEXT) : %$(OBJEXT) $(MKLIB) $(ARFLAGS) $@ $^ #********************************************************** #********************************************************** # TARGET dependencies #********************************************************** all : $(HB_DEST_DIRS) $(HB_BUILD_TARGETS) #********************************************************** #********************************************************** # Helper targets #********************************************************** BasicLibs : $(COMMON_LIB) $(HBPPGEN_EXE) $(PP_LIB) $(COMPILER_LIB) BasicExes : BasicLibs $(HB) StdLibs : BasicExes $(STANDARD_STATIC_HBLIBS) #********************************************************** #********************************************************** # Implicit directory creation rule $(HB_DEST_DIRS) $(HB_BIN_INSTALL) $(HB_LIB_INSTALL) $(HB_INC_INSTALL): mkdir -p $@ #********************************************************** #********************************************************** # LIBRARY Targets BUILD rules #********************************************************** $(COMMON_LIB) : $(COMMON_LIB_OBJS) $(MKLIB) $(ARFLAGS) $@ $^ #********************************************************** $(PP_LIB) : $(PP_LIB_OBJS) $(MKLIB) $(ARFLAGS) $@ $^ #********************************************************** $(COMPILER_LIB) : $(COMPILER_LIB_OBJS) $(MKLIB) $(ARFLAGS) $@ $^ #********************************************************** $(VM_LIB) : $(VM_LIB_OBJS) $(MKLIB) $(ARFLAGS) $@ $^ #********************************************************** ifeq ($(HB_ARCHITECTURE),w32) $(MAIN_LIB) : $(MAIN_LIB_OBJS) $(MKLIB) $(ARFLAGS) $@ $^ endif #********************************************************** $(RTL_LIB) : $(RTL_LIB_OBJS) $(MKLIB) $(ARFLAGS) $@ $^ #********************************************************** $(MACRO_LIB) : $(MACRO_LIB_OBJS) $(MKLIB) $(ARFLAGS) $@ $^ #********************************************************** $(DEBUG_LIB) : $(DEBUG_LIB_OBJS) $(MKLIB) $(ARFLAGS) $@ $^ #********************************************************** $(LANG_LIB) : $(LANG_LIB_OBJS) $(MKLIB) $(ARFLAGS) $@ $^ #********************************************************** $(CODEPAGE_LIB) : $(CODEPAGE_LIB_OBJS) $(MKLIB) $(ARFLAGS) $@ $^ #********************************************************** $(PCRE_LIB) : $(PCRE_LIB_OBJS) $(MKLIB) $(ARFLAGS) $@ $^ #********************************************************** $(RDD_LIB) : $(RDD_LIB_OBJS) $(MKLIB) $(ARFLAGS) $@ $^ #********************************************************** $(NULSYS_LIB) : $(NULSYS_LIB_OBJS) $(MKLIB) $(ARFLAGS) $@ $^ #********************************************************** $(DBFNTX_LIB) : $(DBFNTX_LIB_OBJS) $(MKLIB) $(ARFLAGS) $@ $^ #********************************************************** $(DBFCDX_LIB) : $(DBFCDX_LIB_OBJS) $(MKLIB) $(ARFLAGS) $@ $^ #********************************************************** $(DBFFPT_LIB) : $(DBFFPT_LIB_OBJS) $(MKLIB) $(ARFLAGS) $@ $^ #********************************************************** $(HBSIX_LIB) : $(HBSIX_LIB_OBJS) $(MKLIB) $(ARFLAGS) $@ $^ #********************************************************** $(HSX_LIB) : $(HSX_LIB_OBJS) $(MKLIB) $(ARFLAGS) $@ $^ #********************************************************** $(USRRDD_LIB) : $(USRRDD_LIB_OBJS) $(MKLIB) $(ARFLAGS) $@ $^ #********************************************************** $(GTCGI_LIB) : $(GTCGI_LIB_OBJS) $(MKLIB) $(ARFLAGS) $@ $^ #********************************************************** $(GTSTD_LIB) : $(GTSTD_LIB_OBJS) $(MKLIB) $(ARFLAGS) $@ $^ #********************************************************** $(GTPCA_LIB) : $(GTPCA_LIB_OBJS) $(MKLIB) $(ARFLAGS) $@ $^ #********************************************************** $(GTWIN_LIB) : $(GTWIN_LIB_OBJS) $(MKLIB) $(ARFLAGS) $@ $^ #********************************************************** $(GTWVT_LIB) : $(GTWVT_LIB_OBJS) $(MKLIB) $(ARFLAGS) $@ $^ #********************************************************** $(GTGUI_LIB) : $(GTGUI_LIB_OBJS) $(MKLIB) $(ARFLAGS) $@ $^ #********************************************************** $(GTTRM_LIB) : $(GTTRM_LIB_OBJS) $(MKLIB) $(ARFLAGS) $@ $^ #********************************************************** $(GTCRS_LIB) : $(GTCRS_LIB_OBJS) $(MKLIB) $(ARFLAGS) $@ $^ #********************************************************** $(GTSLN_LIB) : $(GTSLN_LIB_OBJS) $(MKLIB) $(ARFLAGS) $@ $^ #********************************************************** $(GTXWC_LIB) : $(GTXWC_LIB_OBJS) $(MKLIB) $(ARFLAGS) $@ $^ #********************************************************** #********************************************************** # EXECUTABLE Targets BUILD rules #********************************************************** $(HBPPGEN_EXE) : $(HBPPGEN_EXE_OBJS) $(COMMON_LIB) $(CC) $(CFLAGS) -o$@ $^ $(HB_OS_LIBS) #********************************************************** $(HARBOUR_EXE) : $(HARBOUR_EXE_OBJS) $(COMPILER_LIB) $(PP_LIB) $(COMMON_LIB) $(CC) $(CFLAGS) -o$@ $^ $(HB_OS_LIBS) #********************************************************** $(HBPP_EXE) : $(HBPP_EXE_OBJS) $(COMPILER_LIB) $(PP_LIB) $(COMMON_LIB) $(CC) $(CFLAGS) -o$@ $^ $(HB_OS_LIBS) #********************************************************** $(HBRUN_EXE) :: $(StdLibs) $(HBRUN_EXE) :: $(HBRUN_EXE_OBJS) $(CC) $(CFLAGS) -o$@ $^ $(LDFLAGS) #********************************************************** $(HBDOT_EXE) :: $(StdLibs) $(HBDOT_EXE) :: $(HBDOT_EXE_OBJS) $(CC) $(CFLAGS) -o$@ $^ $(LDFLAGS) #********************************************************** $(HBTEST_EXE) :: $(StdLibs) $(HBTEST_EXE) :: $(HBTEST_EXE_OBJS) $(CC) $(CFLAGS) -o$@ $^ $(LDFLAGS) #********************************************************** $(HBPPTEST_EXE) :: $(StdLibs) $(HBPPTEST_EXE) :: $(HBPPTEST_EXE_OBJS) $(CC) $(CFLAGS) -o$@ $^ $(LDFLAGS) #********************************************************** $(HBDOC_EXE) :: $(StdLibs) $(HBDOC_EXE) :: $(HBDOC_EXE_OBJS) $(CC) $(CFLAGS) -o$@ $^ $(LDFLAGS) #********************************************************** $(HBMAKE_EXE) :: $(StdLibs) $(HBMAKE_EXE) :: $(HBMAKE_EXE_OBJS) $(CC) $(CFLAGS) -o$@ $^ $(LDFLAGS) #********************************************************** $(HBVER_EXE) :: $(StdLibs) $(HBVER_EXE) :: $(HBVER_EXE_OBJS) $(CC) $(CFLAGS) -o$@ $^ $(HB_OS_LIBS) #********************************************************** #********************************************************** # EXTRA Object's DEPENDENCIES #********************************************************** # Generated by an intermediate utility ppgen.exe # built at the initial phase of build process $(OBJ_DIR)/pptable$(OBJEXT) : $(OBJ_DIR)/pptable.c $(OBJ_DIR)/pptable.c : $(HBPPGEN) include/hbstdgen.ch include/std.ch $(PP_DIR)/ppcore.c $(PP_DIR)/ppgen.c $< include/hbstdgen.ch -o$@ -q #********************************************************** ifeq ("$(HB_REBUILD_PARSER)","yes") $(OBJ_DIR)/macroy.c : $(MACRO_DIR)/macro.y bison --no-line -d $** -o$@ $(OBJ_DIR)/harboury.c : $(COMPILER_DIR)/harbour.y bison --no-line -d $** -o$@ else $(OBJ_DIR)/macroy.c : $(MACRO_DIR)/macro.yyc $(COPY) $< $@ $(COPY) $(<:.yyc=.yyh) $(@:.c=.h) $(OBJ_DIR)/harboury.c : $(COMPILER_DIR)/harbour.yyc $(COPY) $< $@ $(COPY) $(<:.yyc=.yyh) $(@:.c=.h) endif #********************************************************** #$(OBJ_DIR)/macrol.c : $(MACRO_DIR)/macro.l # flex -Phb_macro -i -8 -o$@ $** #$(OBJ_DIR)/harbourl.c : $(COMPILER_DIR)/harbour.l # flex -Phb_comp -i -8 -o$@ $** #$(OBJ_DIR)/harbourl$(OBJEXT) : $(OBJ_DIR)/harbourl.c #$(OBJ_DIR)/macrol$(OBJEXT) : $(OBJ_DIR)/macrol.c #********************************************************** $(OBJ_DIR)/harboury$(OBJEXT) : $(OBJ_DIR)/harboury.c $(OBJ_DIR)/macroy$(OBJEXT) : $(OBJ_DIR)/macroy.c #********************************************************** ifeq ("$(HB_REBUILD_PARSER)","yes") $(DLL_OBJ_DIR)/macroy.c : $(MACRO_DIR)/macro.y bison --no-line -d $** -o$@ $(DLL_OBJ_DIR)/harboury.c : $(COMPILER_DIR)/harbour.y bison --no-line -d $** -o$@ else $(DLL_OBJ_DIR)/macroy.c : $(MACRO_DIR)/macro.yyc $(COPY) $** $@ $(COPY) $(**:.yyc=.yyh) $(@:.c=.h) $(DLL_OBJ_DIR)/harboury.c : $(COMPILER_DIR)/harbour.yyc $(COPY) $** $@ $(COPY) $(**:.yyc=.yyh) $(@:.c=.h) endif #********************************************************** #$(DLL_OBJ_DIR)/macrol.c : $(MACRO_DIR)/macro.l # flex -Phb_macro -i -8 -o$@ $** #$(DLL_OBJ_DIR)/harbourl.c : $(COMPILER_DIR)/harbour.l # flex -Phb_comp -i -8 -o$@ $** #$(DLL_OBJ_DIR)/harbourl$(OBJEXT) : $(DLL_OBJ_DIR)/harbourl.c #$(DLL_OBJ_DIR)/macrol$(OBJEXT) : $(DLL_OBJ_DIR)/macrol.c #********************************************************** $(DLL_OBJ_DIR)/harboury$(OBJEXT) : $(DLL_OBJ_DIR)/harboury.c $(DLL_OBJ_DIR)/macroy$(OBJEXT) : $(DLL_OBJ_DIR)/macroy.c #********************************************************** # CLEAN rules #********************************************************** clean: doClean Clean: doClean CLEAN: doClean doClean: -$(DEL) $(HB_BUILD_TARGETS) -$(DEL) $(OBJ_DIR)/*$(OBJEXT) -$(DEL) $(OBJ_DIR)/*.c -$(DEL) $(OBJ_DIR)/*.h -$(DEL) $(DLL_OBJ_DIR)/*$(OBJEXT) -$(DEL) $(DLL_OBJ_DIR)/*.c -$(DEL) $(DLL_OBJ_DIR)/*.h -$(DEL) $(PP_DIR)/pptable.c -$(DEL) inst_$(CC_DIRNAME).log -$(DEL) common.cf #********************************************************** # INSTALL rules #********************************************************** install : doInstall Install : doInstall INSTALL : doInstall doInstall: $(HB_BIN_INSTALL) $(HB_LIB_INSTALL) $(HB_INC_INSTALL) -for n in $(HB_BUILD_TARGETS); \ do \ [ -f "$$n" ] && \ case $$n in \ *$(DLLEXT) ) $(COPY) $$n $(HB_BIN_INSTALL);; \ *$(LIBEXT) ) $(COPY) $$n $(HB_LIB_INSTALL);; \ *$(EXEEXT) ) $(COPY) $$n $(HB_BIN_INSTALL);; \ esac \ done ifneq ("$(HB_INSTALL_PREFIX)",".") -[ ! -d "$(HB_INC_INSTALL)" ] || $(COPY) include/*.api $(HB_INC_INSTALL) -[ ! -d "$(HB_INC_INSTALL)" ] || $(COPY) include/*.ch $(HB_INC_INSTALL) -[ ! -d "$(HB_INC_INSTALL)" ] || $(COPY) include/*.h $(HB_INC_INSTALL) endif #**********************************************************