view Makefile @ 282:256ab6cb8e85

Signals look-up andNew syntax for connect. The old one will not work from now on. This will allow for the signals overload. Although changes are done for both D1 and D2 versions, D1 won't work because of compiler bugs. I am tired of waiting for fixes.
author eldar
date Fri, 16 Oct 2009 02:43:59 +0000
parents d80396e54c93
children
line wrap: on
line source

## TODO: CPP_SHARED is very experemental on posix.
## TODO: "make clean" don`t work as expected.
## TODO: add target "install"
## TODO: delete 'lib' prefix from output library name under windows.

## Read variable from shell.
export QTDIR
export QTDIR_INC
export QTDIR_LIB
## End. Read variable from shell.

## Try identify system.
ifeq ($(strip $(shell uname)),Linux)
	SYSTEM=posix
else
	ifeq ($(strip $(shell uname)),Darwin)
		SYSTEM=posix
	else
		SYSTEM=windows
	endif
endif
## End, Try identify system.

## Load system specify settings.
include build/$(SYSTEM).makefile

## Main settings.
## D compiler.
ifndef $(DC)
DC = dmd
endif
## C++ compiler.
ifndef $(CC)
CC = g++
endif
## Archiver.
ifndef $(AR)
AR = ar
endif
## Set default target.
ifndef $(BUILD_TYPE)
BUILD_TYPE = release
endif

## Tmp path.
ifndef $(TMP_PATH)
TMP_PATH_ = tmp
TMP_PATH = $(TMP_PATH_)$(SL)$(BUILD_TYPE)
endif
## Output path.
ifndef $(OUTPUT_PATH)
OUTPUT_PATH = lib
endif
## Prefix for lib name.
ifndef $(NAME_PREFIX)
NAME_PREFIX = qtd
endif

ifndef $(PACKAGES)
PACKAGES = core gui
endif

ifeq ($(DMD_WIN), false)
LIB_PREFIX = lib
endif

CC_INCLUDE += include $(QTDIR_INC) $(QTDIR_INC)$(SL)Qt $(QTDIR_INC)$(SL)QtCore $(QTDIR_INC)$(SL)QtGui $(QTDIR_INC)$(SL)QtOpenGL $(QTDIR_INC)$(SL)QtSvg
D_INCLUDE +=
CC_LFLAGS += -enable-stdcall-fixup -Wl,-enable-auto-import -Wl,-enable-runtime-pseudo-reloc -Wl,-s -mthreads
CC_CFLAGS +=
D_CFLAGS +=
CC_LIB_PATH += $(QTDIR_LIB) $(TMP_PATH)
D_LIB_PATH += $(TMP_PATH)

## D target
ifndef D_TARGET
D_TARGET = d1-tango
endif

ifeq ($(D_TARGET), d1-tango)
D_VERSION = 1
else
D_VERSION = 2
endif
D_CFLAGS += -Iqt/d$(D_VERSION)

#End. Main settings.

## Flags for debug version.
ifeq ($(BUILD_TYPE), debug)
CC_CFLAGS += -O0
D_CFLAGS += -debug -g -gc
LIB_POSTFIX = d
else ifeq ($(BUILD_TYPE), release)
## End. Flags for debug version.
## Flags for release version
CC_CFLAGS += -O
D_CFLAGS += -O -release -inline
endif
## End. Flags for release version.

## Load classes list.
## param 1 - package name.
define MODULE_template
    include build/$(1).makefile
    qt_$(1)_lib_name = $$(qt_$(1)_name)$(QT_LIB_POSTFIX)
    $(1)_cpp_files += $$($(1)_classes:%=cpp/qt_$(1)/%_shell.cpp)
    $(1)_cpp_obj_files = $$($(1)_cpp_files:cpp/%.cpp=$(TMP_PATH)/%.o)
    $(1)_d_files += $$($(1)_classes:%=qt/$(1)/%.d)
endef
$(foreach package,$(PACKAGES),$(eval $(call MODULE_template,$(package))))
## End. Load classes list

## DMD compile template bug fix
ifeq ($(DC), dmd)
NOT_SEPARATE_D_OBJ = true
endif

ifeq ($(SYSTEM), windows)
	ifeq ($(DC), dmd)
		DMD_WIN = true
	endif
endif

ifeq ($(DMD_WIN), true)
	CPP_SHARED = true
	LIB_EXT = lib
else
	LIB_EXT = a
endif

## CPP_SHARED options.
ifeq ($(CPP_SHARED), true)
CC_CFLAGS += -DCPP_SHARED
GEN_OPT   += --cpp_shared
D_CFLAGS += -version=cpp_shared
endif
## End. CPP_SHARED options.

all: dgen build

windows:
	$(MAKE) SYSTEM=windows

posix:
	$(MAKE) SYSTEM=posix

release: all

debug:
	$(MAKE) BUILD_TYPE=debug

build: mkdir $(PACKAGES)

## DGenerator
make_gen:
	cd generator && qmake && $(MAKE)

dgen:  make_gen
	cd generator && $(GEN) $(GEN_OPT) --d-target=$(D_TARGET) --output-directory=../ qtjambi_masterinclude.h build_gui.txt
## DGenerator ## end

mkdir:
	@$(MKDIR) $(TMP_PATH_)
	@$(MKDIR) $(TMP_PATH)
	@$(MKDIR) $(TMP_PATH)$(SL)qt_qtd
	@$(MKDIR) $(TMP_PATH)$(SL)qtd
	@$(MKDIR) $(OUTPUT_PATH)

## Build cpp files.
$(TMP_PATH)/%.o: cpp/%.cpp
	$(CC) $(CC_CFLAGS) $(CC_INCLUDE:%=-I%) -c $(@:$(TMP_PATH)/%.o=cpp/%.cpp) -o$@

## Build d files.
$(TMP_PATH)/%_d.o: qt/%.d
	$(DC) $(D_CFLAGS) -c $(@:$(TMP_PATH)/%_d.o=qt/%.d) -of$@

## Build package.
## param 1 - package name.
define BUILD_template
    ## mkdir
    mkdir_$(1):
	    @$(MKDIR) $(TMP_PATH)$(SL)qt_$(1)
	    @$(MKDIR) $(TMP_PATH)$(SL)$(1)
    ## End. mkdir
    ## Build d part.
    ifeq ($(NOT_SEPARATE_D_OBJ), true)
    ## DMD compile template bug fix
    $(1)_D_RULE =$(TMP_PATH)/$(1)_dobj.$(D_OBJ_EXT)
    $$($(1)_D_RULE):
	    $(DC) $(D_CFLAGS) $(D_INCLUDE) -c $$($(1)_d_files) -of$$($(1)_D_RULE)
    else
    $(1)_D_RULE = $$($(1)_d_files:qt/%.d=$(TMP_PATH)/%_d.o)
    endif
    ## End. Build d part.
    ## Build cpp part.
    ifeq ($(CPP_SHARED), true)
    ifeq ($(SYSTEM), windows)
    $(1)_CPP_DYN_LIB = $(OUTPUT_PATH)$(SL)$(LIB_PREFIX)$(NAME_PREFIX)$(1)$(LIB_POSTFIX).$(DYN_LIB_EXT)
    $$($(1)_CPP_DYN_LIB): $$($(1)_cpp_obj_files)
	    $(CC) $(CC_LFLAGS) -shared $$($(1)_cpp_obj_files) -o $$($(1)_CPP_DYN_LIB) $(CC_LIB_PATH:%=-L%) -l$(qt_$(1)_lib_name) $$($(1)_link_cpp:%=-l%) -Wl,--out-implib,$(TMP_PATH)\$(LIB_PREFIX)$(NAME_PREFIX)$(1)_cpp.a
    $(1)_CPP_RULE = $(TMP_PATH)\cpp_$(1).$(LIB_EXT)
    $$($(1)_CPP_RULE): $$($(1)_CPP_DYN_LIB)
	    $(IMPLIB) $$($(1)_CPP_RULE) $$($(1)_CPP_DYN_LIB)
    else ## CPP_SHARED != true
    $(1)_CPP_RULE = $(OUTPUT_PATH)$(SL)$(LIB_PREFIX)$(NAME_PREFIX)$(1)$(LIB_POSTFIX).$(DYN_LIB_EXT)
    $$($(1)_CPP_RULE): $$($(1)_cpp_obj_files)
	    $(CC) $(CC_LFLAGS) $(QTDIR_LIB)/$(LIB_PREFIX)$(qt_$(1)_name).$(DYN_LIB_EXT) $$($(1)_link_cpp:%=-l%) $$($(1)_cpp_obj_files) -o $$($(1)_CPP_RULE)
    endif ## CPP_SHARED
    DELETE_FILES += $$($(1)_CPP_DYN_LIB) $$($(1)_cpp_obj_files) $(TMP_PATH)\$(LIB_PREFIX)$(NAME_PREFIX)$(1)_cpp.a
    else
    $(1)_CPP_RULE = $$($(1)_cpp_obj_files)
    endif
    ## End. Build cpp part.

    DELETE_FILES += $$($(1)_D_RULE) $$($(1)_CPP_RULE) $(OUTPUT_PATH)/$(LIB_PREFIX)$$(qt_$(1)_name)D.$(LIB_EXT)
    ## Implib link.
    $(1)_LIB = $(OUTPUT_PATH)$(SL)$(LIB_PREFIX)$(NAME_PREFIX)$(1)$(LIB_POSTFIX).$(LIB_EXT)
    ifeq ($(DMD_WIN), true)
    $$($(1)_LIB): $$($(1)_D_RULE) $$($(1)_CPP_RULE)
	    $(DC) $$($(1)_D_RULE) $$($(1)_CPP_RULE) $(D_LIB_PATH:%=-L-L%) $$($(1)_link_d:%=-L-l%) -lib -of$$($(1)_LIB)
    else
    $$($(1)_LIB): $$($(1)_D_RULE) $$($(1)_CPP_RULE)
	    $(AR) rcs $$($(1)_LIB) $$($(1)_D_RULE) $$($(1)_CPP_RULE)
    endif
    # End. Implib link.
    $(1): mkdir_$(1) $$($(1)_LIB)
endef
$(foreach package,$(PACKAGES),$(eval $(call BUILD_template,$(package))))
## End. Build package.

clean:
	@$(RM) $(DELETE_FILES)