# ========================================
#
# (C) 2003 - ATI Research GmbH, Starnberg, GERMANY
#
# ========================================

# file: Makefile
#
# this builds the fireglcontrol panels for the FireGL Linux drivers


# ========================================
# assign defaults for non-set commandline switches
ifndef DEBUG
DEBUG=0
endif

ifndef QT_VER
QT_VER=0
endif

ifndef GCC_VER
GCC_VER=0
endif

ifndef QT_STATIC
QT_STATIC=0
endif


# ========================================
# makefile helpers
colon=;


# ========================================
# resolve target platform
# (on cross compiles this must be a commandline parameter)
PLATFORMTYPE = $(shell uname -m)
ifeq ($(PLATFORMTYPE), ia64) 
LIBQT_STATIC = libqt64.a
LIBQT_DYN = qt
LIB_DIR = lib
else
ifneq ($(findstring $(PLATFORMTYPE), i386 i486 i586 i686), )
LIBQT_STATIC = libqt.a
LIBQT_DYN = qt
LIB_DIR = lib
else
ifeq ($(PLATFORMTYPE), x86_64)
LIBQT_STATIC = libqtx86_64.a
LIBQT_DYN = qt-mt
LIB_DIR = lib64
else
LIBQT_STATIC = libunknownplatform.a
LIBQT_DYN = qtunknown
LIB_DIR = unknowndir
$(error Unknown Platform)
endif
endif
endif


# ========================================
# subdirs

# determine qt lib base directory
ifeq ($(QT_VER),0)
MK_QTDIR = $(QTDIR)
else
ifeq ($(shell test -e /usr/$(LIB_DIR)/qt$(QT_VER)-gcc$(GCC_VER)$(colon) echo $$?),0)
MK_QTDIR = /usr/$(LIB_DIR)/qt$(QT_VER)-gcc$(GCC_VER)
else
ifeq ($(shell test -e /usr/$(LIB_DIR)/qt$(QT_VER)$(colon) echo $$?),0)
MK_QTDIR = /usr/$(LIB_DIR)/qt$(QT_VER)
else
ifeq ($(shell test -e /usr/$(LIB_DIR)/qt$(colon) echo $$?),0)
MK_QTDIR = /usr/$(LIB_DIR)/qt
else
MK_QTDIR = $(QTDIR)
endif
endif
endif
endif

ifeq ($(shell test -e $(MK_QTDIR)$(colon) echo $$?),1)
$(error environment missing: MK_QTDIR=$(MK_QTDIR))
endif

ifeq ($(shell test -e $(MK_QTDIR)/include/qglobal.h$(colon) echo $$?),1)
$(error environment incomplete: MK_QTDIR=$(MK_QTDIR))
endif

ifeq ($(QT_VER),0)
QT_VER=$(shell grep QT_VERSION_STR $(MK_QTDIR)/include/qglobal.h | cut -d'"' -f2 | cut -d'.' -f1)
endif

ifeq ($(QT_VER),0)
$(error environment not found: QT_VER=$(QT_VER))
endif

ifeq ($(QT_VER),)
$(error environment not found: QT_VER=$(QT_VER))
endif


# ========================================
# tools
ifeq ($(GCC_VER), 0)
CC = g++
C  = gcc
GCC_VER=$(shell $(CC) -dumpversion)
else
CC = g++ -V $(GCC_VER)
C  = gcc -V $(GCC_VER)
endif

GCC_MAJ_VER=$(shell echo $(GCC_VER) | cut -d'.' -f1)

MOC = $(MK_QTDIR)/bin/moc
ifneq ($(shell test -e $(MOC)$(colon) echo $$?),0)
$(error environment incomplete - missing: $(MOC))
endif

SHELL =	/bin/sh

ifeq ($(DEBUG),0)
STRIP = strip
else
STRIP = @echo strip is disabled for:
endif


# ========================================
# tools settings
DEFINES = -Dlinux -DFGLRX_USE_XEXTENSIONS -DFGLRX_OGL_INFO -DQT_NO_STL

# for *.c
CINCDIR = -I/usr/X11R6/include -I. -I./include_dummy
CDEFINES = $(DEFINES)
ifeq ($(DEBUG),0)
CDEBFLAGS = -g
endif
CFLAGS = $(CDEBFLAGS) -O2 -fno-strength-reduce -funsigned-char $(CDEFINES)
LFLAGS = $(CDEBFLAGS) -L/usr/X11R6/$(LIB_DIR) -lXaw -lXmu -lXt -lXext -lX11

# for *.cpp
CCINCDIR = -I$(MK_QTDIR)/include -I. -I./include_dummy
CCDEFINES = $(DEFINES)
ifneq ($(DEBUG),0)
CCDEBFLAGS = -ggdb
endif

ifeq ($(QT_STATIC),0)
LIBQT = -l$(LIBQT_DYN)
LIBQT_DEPEND =
else
LIBQT = $(LIBQT_STATIC)
LIBQT_DEPEND = $(LIBQT_STATIC)
endif
LIBS_COMMON = \
    -L$(MK_QTDIR)/$(LIB_DIR) -L/usr/X11R6/$(LIB_DIR) \
    $(LIBQT) -lGLU -lGL -lXmu -lICE -lSM -ldl -lXext -lX11 -lm \
    -lXinerama -lXrender -lfreetype -lXxf86vm \
    -L/usr/X11R6/$(LIB_DIR)

ifeq ($(shell test -e /lib/lib-gcc$(GCC_VER)$(colon) echo $$?),0)
LIBS = \
    -L/lib/lib-gcc$(GCC_VER) -L/lib/lib-gcc$(GCC_VER)/i686 \
    -L/usr/lib/lib-gcc$(GCC_VER) -L/usr/lib \
    $(LIBS_COMMON) \
    -lpng12 -lXft2 -lfontconfig /lib/lib-gcc$(GCC_VER)/i686/libc-2.2.93.so
else
LIBS = \
    $(LIBS_COMMON) -lXft
endif

CCFLAGS =         $(CCDEBFLAGS) -O2 -fno-strength-reduce -funsigned-char -Wall -W $(CCDEFINES)
LLFLAGS =         $(CCDEBFLAGS) $(LIBS)

# reusable path shortcuts
DDX_DIR = ../../Xserver/hw/xfree86/drivers/fglrx

# misc other tools flags
LIBCFLAGS = -fPIC

YACCCFLAGS = -Wno-unused -Wno-parentheses

# ========================================
# status prints for debugging
ifeq (1,0)
$(warning QT_VER=$(QT_VER))
$(warning GCC_VER=$(GCC_VER))
$(warning QT_STATIC=$(QT_STATIC))
$(warning MK_QTDIR=$(MK_QTDIR))
$(error stop here)
endif


# ========================================
# filenames
PACKET_NAME = fglrx_panel_sources

BASENAME =  fireglcontrol

ifeq ($(QT_STATIC),0)
TARGET0	=	$(BASENAME).qt$(QT_VER).gcc$(GCC_VER)
else
TARGET0 =   $(BASENAME).qtstatic.gcc$(GCC_VER)
endif
TARGET1 =	Shutdown
TARGET2 =	Restart

# MOC
TARGET0_H_TEMPLATE =            \
        Sheet.h		            \
        Page.h		            \
        InfoPage.h	            \
        DualScreenPage.h        \
        AdjustPage.h            \
        TVoutAdjustPage.h       \

TARGET0_CC_META =               \
        moc_Sheet.cpp		    \
        moc_Page.cpp		    \
        moc_InfoPage.cpp		\
        moc_DualScreenPage.cpp  \
        moc_AdjustPage.cpp      \
        moc_TVoutAdjustPage.cpp \

TARGET0_OBJ_META =              \
        moc_Sheet.o			    \
        moc_Page.o			    \
        moc_InfoPage.o			\
        moc_DualScreenPage.o    \
        moc_AdjustPage.o        \
        moc_TVoutAdjustPage.o   \

# C
TARGET0_CSOURCES =          \
        FGLRXExtensions.c   \
        ATITVOExtensions.c  \

TARGET0_COBJECTS =          \
        FGLRXExtensions.o   \
        ATITVOExtensions.o  \

TARGET1_CSOURCES =          \
        Shutdown.c          \

TARGET1_COBJECTS =          \
        Shutdown.o          \

TARGET2_CSOURCES =          \
        Restart.c           \

TARGET2_COBJECTS =          \
        Restart.o           \

# CC
TARGET0_CCSOURCES =         \
        main.cpp            \
        Sheet.cpp           \
        Page.cpp            \
        InfoPage.cpp        \
        DualScreenPage.cpp  \
        AdjustPage.cpp	    \
        TVoutAdjustPage.cpp \
        BoardInfo.cpp       \

TARGET0_CCOBJECTS =         \
        main.o              \
        Sheet.o             \
        Page.o              \
        InfoPage.o          \
        DualScreenPage.o    \
        AdjustPage.o        \
        TVoutAdjustPage.o   \
        BoardInfo.o         \

# summary
TARGET0_SOURCES =               \
        $(TARGET0_CSOURCES)     \
        $(TARGET0_CCSOURCES)    \
        $(TARGET0_CC_META)      \

TARGET0_OBJECTS =               \
        $(TARGET0_COBJECTS)     \
        $(TARGET0_CCOBJECTS)    \
        $(TARGET0_OBJ_META)     \

TARGET0_SYMLINKS =              \
        Radeon_extension_tvout.h \
        R200_extensions.h \

TARGET1_SOURCES =               \
        $(TARGET1_CSOURCES)     \
        $(TARGET1_CCSOURCES)    \
        $(TARGET1_CC_META)      \

TARGET1_OBJECTS =               \
        $(TARGET1_COBJECTS)     \
        $(TARGET1_CCOBJECTS)    \
        $(TARGET1_OBJ_META)     \

TARGET2_SOURCES =               \
        $(TARGET2_CSOURCES)     \
        $(TARGET2_CCSOURCES)    \
        $(TARGET2_CC_META)      \

TARGET2_OBJECTS =               \
        $(TARGET2_COBJECTS)     \
        $(TARGET2_CCOBJECTS)    \
        $(TARGET2_OBJ_META)     \


# ========================================
####### Implicit rules

.SUFFIXES: .cpp

.c.o:
	$(C) -c $(CFLAGS) $(CINCDIR) $<

.cpp.o:
	$(CC) -c $(CCFLAGS) $(CCINCDIR) $<


# ========================================
# Explicit rules

moc_%.cpp:	%.h
	$(MOC) $< -o $@

# ========================================
# Build rules

all:: $(TARGET0)
#all:: $(TARGET0) $(TARGET1) $(TARGET2)

$(TARGET0): $(TARGET0_OBJECTS) $(LIBQT_DEPEND) $(TARGET0_SYMLINKS)
	$(CC) $(TARGET0_OBJECTS) $(LIBQT_DEPEND) -o $@ $(LLFLAGS)
	$(STRIP) $@
	bzip2 -c $@ >$@.bz2
	rm -f $(BASENAME)
	ln -s $@ $(BASENAME)


$(TARGET1): $(TARGET1_OBJECTS)
	$(C) $+ -o $@ $(LFLAGS)
	$(STRIP) $@

$(TARGET2): $(TARGET2_OBJECTS)
	$(C) $+ -o $@ $(LFLAGS)
	$(STRIP) $@

# extract the statically linked lib
$(LIBQT_DEPEND): $(LIBQT).bz2
	bzcat $(LIBQT).bz2 >$(LIBQT_DEPEND)

R200_extensions.h:
	ln -s $(DDX_DIR)/R200_extensions.h ./R200_extensions.h

Radeon_extension_tvout.h:
	ln -s $(DDX_DIR)/Radeon_extension_tvout.h ./Radeon_extension_tvout.h

#depend:: $(TARGET0_CSOURCES) $(TARGET0_CCSOURCES) $(TARGET1_CSOURCES) $(TARGET2_CSOURCES)
depend:: $(TARGET0_CSOURCES) $(TARGET0_CCSOURCES) $(TARGET0_SYMLINKS)
	make dep_clean
	makedepend -a $(CINCDIR)  $(CDEFINES)  $(TARGET0_CSOURCES)
	makedepend -a $(CCINCDIR) $(CCDEFINES) $(TARGET0_CCSOURCES)
	@#makedepend -a $(CINCDIR)  $(CDEFINES)  $(TARGET1_CSOURCES)
	@#makedepend -a $(CINCDIR)  $(CDEFINES)  $(TARGET2_CSOURCES)

dep:: depend


dep_clean::
	@sed -n -e '1,/^# DO NOT DELETE THIS LINE/p' Makefile >~Makefile; chmod --reference=Makefile ~Makefile; mv ~Makefile Makefile

depclean:: dep_clean

clean::
	@make dep_clean
	@rm -f *.o *.bak *~ *% #*
	@rm -f $(TARGET0_CC_META) $(BASENAME) $(TARGET0)
	@#rm -f $(TARGET0_CC_META) $(BASENAME) $(TARGET0) $(TARGET1) $(TARGET2)
	@for name in $(TARGET0_SYMLINKS); do \
	  if [ -h $$name ]; then \
	    rm -f $$name; \
	  fi; \
	done

# do _not_ cleanup the packed target package
distclean:: clean
	@#rm -f $(TARGET0).bz2

# do cleanup any packed target package
really_distclean:: distclean
	@rm -f $(BASENAME).*.bz2 $(PACKET_NAME).tgz


install::
	cp $(TARGET0) /usr/X11R6/bin/.
	cd /usr/X11R6/bin/. ; rm -f $(BASENAME) ; ln -s $(TARGET0) $(BASENAME)
	cp LICENSE.GPL /usr/X11R6/bin/.
	cp LICENSE.QPL /usr/X11R6/bin/.
	if  [ $KDEDIR ]; then\
	  cp fireglcontrol.kdelnk $(KDEDIR)/share/applnk/. ;\
	  cp ati.xpm $(KDEDIR)/share/icons/. ;\
	fi
	if test -d /usr/share/gnome/apps; then \
	  cp fireglcontrol.desktop /usr/share/gnome/apps/. ;\
	  if test -d /usr/share/pixmaps; then \
	    cp ati.xpm /usr/share/pixmaps/. ;\
	  fi ;\
	fi

source_package::
	@if [ -f $(PACKET_NAME).tar ]; then      \
	  rm -f $(PACKET_NAME).tar ;            \
	fi
	@if [ -f $(PACKET_NAME).tar.gz ]; then   \
	  rm -f $(PACKET_NAME).tar.gz ;         \
	fi
	@if [ -f $(PACKET_NAME).tgz ]; then      \
	  rm -f $(PACKET_NAME).tgz ;            \
	fi
	@make dep
	@echo -n "" >dependencies.txt
	@for name in `cat Makefile | sed -n -e '/^# DO NOT DELETE THIS LINE/,$$s@.*\(\: \)\(.*\)@\2@p'`; do \
	  echo $$name >>dependencies.txt; \
	done
	@sort dependencies.txt >dependencies_sort.txt
	@echo -n "" >dependencies_stripped.txt
	@last_name=""; \
	for name in `cat dependencies_sort.txt`; do \
	  if [ "$$name" != "$$last_name" ]; then \
	    echo $$name >>dependencies_stripped.txt; \
	    last_name=$$name; \
	  fi; \
	done
	@cat dependencies_stripped.txt | sed -n -e 's@\(^[^/].*\)@\1@p' >dependencies_local.txt
	@make dep_clean
	@chmod a-x *.c *.cpp *.h *.xpm LICENSE.*
	tar  -r -v -h -f $(PACKET_NAME).tar Makefile $(TARGET0_CSOURCES) $(TARGET0_CCSOURCES) `cat dependencies_local.txt` LICENSE.GPL LICENSE.QPL
	@#tar  -r -v -h -f $(PACKET_NAME).tar Makefile $(TARGET0_CSOURCES) $(TARGET0_CCSOURCES) $(TARGET1_CSOURCES) $(TARGET2_CSOURCES) `cat dependencies_local.txt` LICENSE.GPL LICENSE.QPL
	gzip --best $(PACKET_NAME).tar
	mv $(PACKET_NAME).tar.gz $(PACKET_NAME).tgz
	chmod a-wx $(PACKET_NAME).tgz
		

# ========================================
# DO NOT DELETE THIS LINE -- `make depend` depends on it.
