353 lines
10 KiB
Makefile
353 lines
10 KiB
Makefile
#
|
|
# Copyright (c) 1995, 3Dfx Interactive, Inc.
|
|
# All Rights Reserved.
|
|
#
|
|
# This is UNPUBLISHED PROPRIETARY SOURCE CODE of 3Dfx Interactive, Inc.;
|
|
# the contents of this file may not be disclosed to third parties, copied or
|
|
# duplicated in any form, in whole or in part, without the prior written
|
|
# permission of 3Dfx Interactive, Inc.
|
|
#
|
|
# RESTRICTED RIGHTS LEGEND:
|
|
# Use, duplication or disclosure by the Government is subject to restrictions
|
|
# as set forth in subdivision (c)(1)(ii) of the Rights in Technical Data
|
|
# and Computer Software clause at DFARS 252.227-7013, and/or in similar or
|
|
# successor clauses in the FAR, DOD or NASA FAR Supplement. Unpublished -
|
|
# rights reserved under the Copyright Laws of the United States.
|
|
#
|
|
# $Revision$
|
|
# $Date$
|
|
|
|
#
|
|
# If we call make recursively, we may want to print the subdirectory to which
|
|
# we are changing. This helps track down make errors. However, this can also
|
|
# make the make output noisy. If the envariable NOISY_RECURSION is
|
|
# set to "YES", we will print the directory when we recurse into it.
|
|
# Otherwise we will not. The default is to not print the directory.
|
|
#
|
|
ifneq ($(NOISY_RECURSION),YES)
|
|
MAKE_PRINT_DIRECTORY=--no-print-directory
|
|
endif
|
|
#
|
|
# Check to see that certain variables are actually set, and set them
|
|
# to reasonable values.
|
|
#
|
|
ifeq ($(BUILD_ROOT),)
|
|
ifeq ($(TOPDIR),)
|
|
export TOPDIR = $(shell pwd)
|
|
endif
|
|
export BUILD_ROOT = $(TOPDIR)
|
|
endif
|
|
ifeq ($(BUILD_ROOT_SWLIBS),)
|
|
export BUILD_ROOT_SWLIBS = $(TOPDIR)/swlibs
|
|
endif
|
|
ifeq ($(BUILD_ROOT_HW),)
|
|
export BUILD_ROOT_HW = $(TOPDIR)/$(FX_GLIDE_HW)
|
|
endif
|
|
|
|
ifeq ($(GCC_INCLUDE),)
|
|
GCC_INCLUDE=/usr/local/include/gcc
|
|
endif
|
|
|
|
#
|
|
# Make include file, kept as simple as possible, defines/setups the following
|
|
# 1) global CC flags
|
|
# 2) global LD flags
|
|
# 3) default rule (all)
|
|
# 4) make depend rules
|
|
# 5) file removal rules
|
|
# 6) recursive rules
|
|
|
|
#--------------------------------------------------------------------------
|
|
# configuration variables for the compiler environment
|
|
# FX_COMPILER must be set to either MICROSOFT or WATCOM
|
|
# DEBUG must be set to enable debugging flags for cc and link
|
|
#
|
|
ifeq ($(CC),)
|
|
CC = gcc
|
|
endif
|
|
CPP = $(CC) -E -c
|
|
ASM_LIST_FLAGS = -s
|
|
CDEBUG = -g
|
|
CNODEBUG = -O
|
|
LDEBUG = -g
|
|
LNODEBUG =
|
|
GLDOPTS = -L$(BUILD_ROOT_SWLIBS)/lib -L$(BUILD_ROOT_HW)/lib
|
|
LINK = $(CC)
|
|
|
|
DEBUGDEFS = -DGDBG_INFO_ON -DGLIDE_DEBUG
|
|
GCDEFS = -DENDB -DX11
|
|
GCINCS = -I. -I$(BUILD_ROOT_SWLIBS)/include -I$(BUILD_ROOT_HW)/include
|
|
GCOPTS = -Wall
|
|
ifeq "$(FX_GLIDE_PIC)" "1"
|
|
GCPTS := $(GCOPTS) -fPIC -DPIC
|
|
endif
|
|
|
|
#
|
|
# BIG_OPT Indicates O3(?) or better is being used. It changes the
|
|
# assembly language in grDrawTriangle. Larger optimization removes
|
|
# an extra push in the calling sequence.
|
|
#
|
|
CNODEBUG = -O6 -mcpu=pentium -fomit-frame-pointer -funroll-loops \
|
|
-fexpensive-optimizations -ffast-math -DBIG_OPT
|
|
|
|
CDEBUG = -g -O
|
|
GLDOPTS = -L$(BUILD_ROOT_SWLIBS)/lib -L/usr/lib
|
|
# Profiling
|
|
#CDEBUG = -pg -g -O
|
|
#GCDEFS =
|
|
|
|
# if we are not debugging then replace debug flags with nodebug flags
|
|
|
|
# DEBUG = xx
|
|
|
|
ifndef DEBUG
|
|
CDEBUG = $(CNODEBUG)
|
|
LDEBUG = $(LNODEBUG)
|
|
else
|
|
CDEBUG += $(DEBUGDEFS)
|
|
endif
|
|
|
|
#--------------------------------------------------------------------------
|
|
# build up CFLAGS from global, local, and variable flags
|
|
# each of which has includes, defines, and options
|
|
#
|
|
GCFLAGS = $(GCINCS) $(GCDEFS) $(GCOPTS)
|
|
LCFLAGS = $(LCINCS) $(LCDEFS) $(LCOPTS)
|
|
VCFLAGS = $(VCINCS) $(VCDEFS) $(VCOPTS)
|
|
|
|
CFLAGS = $(CDEBUG) $(GCFLAGS) $(LCFLAGS) $(VCFLAGS)
|
|
|
|
#--------------------------------------------------------------------------
|
|
# build up global linker flags (LDFLAGS) and libraries (LDLIBS)
|
|
# note that local libs are before global libs
|
|
#
|
|
GLDLIBS = -lm
|
|
LDFLAGS = $(LDEBUG) $(GLDOPTS) $(LLDOPTS)
|
|
LDLIBS = $(LLDLIBS) $(GLDLIBS)
|
|
|
|
#--------------------------------------------------------------------------
|
|
# configure OS commands
|
|
#
|
|
|
|
AR = /usr/bin/ar crsl
|
|
ECHO = /bin/echo
|
|
INSTALL = /usr/bin/install
|
|
|
|
DATE = date
|
|
RM = rm
|
|
|
|
#--------------------------------------------------------------------------
|
|
# TAGS file for emacs
|
|
|
|
TAGS = $(BUILD_ROOT)/TAGS
|
|
|
|
#--------------------------------------------------------------------------
|
|
#
|
|
# a default rule, serves 2 purposes
|
|
# 1) keeps us from typing "make install" all the time
|
|
# 2) allows this file to be included first, without clobber becoming
|
|
# the default rule
|
|
default: all
|
|
|
|
all: incs libs bins
|
|
|
|
# We need to handle asm files with extensions of .s and .S
|
|
OBJECTS = $(CFILES:.c=.o) $(CPPFILES:.cpp=.o) $(LIBOBJS) \
|
|
$(patsubst %.s,%.o,$(patsubst %.S,%.o,$(AFILES)))
|
|
#--------------------------------------------------------------------------
|
|
# rules for INCS, LIBS, and BINS , the three major targets
|
|
#
|
|
|
|
$(THISDIR)incs: $(HEADERS)
|
|
ifdef HEADERS
|
|
ifdef INSTALL_DESTINATION
|
|
$(INSTALL) -d $(INSTALL_DESTINATION)/include
|
|
$(INSTALL) -m 444 $(HEADERS) $(INSTALL_DESTINATION)/include
|
|
else
|
|
@echo INSTALL_DESTINATION not defined, not installing HEADERS
|
|
endif
|
|
endif
|
|
|
|
#--------------------------------------------------------------------------
|
|
# rules for LIBRARIES
|
|
# NOTE: we supply a default rule for making a library
|
|
ifdef LIBRARIES
|
|
LIBPARTS = $(OBJECTS) $(SUBLIBRARIES)
|
|
|
|
$(LIBRARIES): $(LIBPARTS)
|
|
/bin/rm -f $*.a
|
|
$(AR) $*.a $(OBJECTS)
|
|
|
|
ifneq ($(SHARED_LIBRARY),)
|
|
SONAME := $(shell echo $(SHARED_LIBRARY) | cut -d "." -f 1-3)
|
|
BASENAME := $(shell echo $(SHARED_LIBRARY) | cut -d "." -f 1-2)
|
|
|
|
$(SHARED_LIBRARY): $(LIBPARTS) $(SUBLIBRARIES)
|
|
$(LINK) $(LDFLAGS) -shared -Wl,-soname,$(SONAME) -o $(SHARED_LIBRARY) \
|
|
-Xlinker --whole-archive \
|
|
$(LIBRARIES) $(SUBLIBRARIES) \
|
|
-Xlinker --no-whole-archive \
|
|
$(LINKLIBRARIES)
|
|
endif
|
|
|
|
$(THISDIR)libs: $(LIBRARIES) $(SHARED_LIBRARY)
|
|
ifdef INSTALL_DESTINATION
|
|
$(INSTALL) -d $(INSTALL_DESTINATION)/lib
|
|
$(INSTALL) -m 444 $(LIBRARIES) $(INSTALL_DESTINATION)/lib
|
|
ifneq "$(SHARED_LIBRARY)" ""
|
|
$(INSTALL) -m 444 $(SHARED_LIBRARY) $(INSTALL_DESTINATION)/lib
|
|
# Create proper symlinks for the shared library so that the binaries
|
|
# can link against it.
|
|
rm -f $(INSTALL_DESTINATION)/lib/$(SONAME)
|
|
ln -s $(SHARED_LIBRARY) $(INSTALL_DESTINATION)/lib/$(SONAME)
|
|
rm -f $(INSTALL_DESTINATION)/lib/$(BASENAME)
|
|
ln -s $(SONAME) $(INSTALL_DESTINATION)/lib/$(BASENAME)
|
|
endif
|
|
else
|
|
@echo INSTALL_DESTINATION not defined, not installing LIBRARIES
|
|
endif
|
|
else
|
|
$(THISDIR)libs:
|
|
endif
|
|
|
|
#--------------------------------------------------------------------------
|
|
# rules for BINS
|
|
# NOTE: calling makefile must define rules for making programs
|
|
# or define SIMPLE_EXE or MULTI_EXE
|
|
PROGRAM_LLDOBJECTS=
|
|
|
|
ifdef PROGRAM
|
|
$(PROGRAM): $(OBJECTS) $(PROGRAM_LLDOBJECTS)
|
|
$(LINK) -o $@ $(OBJECTS) $(LDLIBS) $(LDFLAGS)
|
|
endif
|
|
|
|
ifdef PROGRAMS
|
|
$(PROGRAMS): % : %.o $(PROGRAM_LLDOBJECTS)
|
|
$(LINK) -o $@ $@.o $(LDLIBS) $(LDFLAGS)
|
|
endif
|
|
|
|
INSTALL_TARGETS = $(PROGRAM) $(PROGRAMS) $(BATS) $(DIAGS)
|
|
$(THISDIR)bins: $(PROGRAM) $(PROGRAMS) $(BATS) $(DIAGS)
|
|
ifneq ($(strip $(INSTALL_TARGETS)),)
|
|
ifdef INSTALL_DESTINATION
|
|
echo installing $(INSTALL_TARGETS)
|
|
$(INSTALL) -d $(INSTALL_DESTINATION)/bin
|
|
$(INSTALL) -m 555 $(INSTALL_TARGETS) $(INSTALL_DESTINATION)/bin
|
|
else
|
|
@echo INSTALL_DESTINATION not defined, not installing PROGRAMS
|
|
endif
|
|
endif
|
|
|
|
TARGETS += $(LIBRARIES) $(SHARED_LIBRARY) $(PROGRAM) $(PROGRAMS) $(BATS) $(DIAGS)
|
|
|
|
#--------------------------------------------------------------------------
|
|
# MKDEPFILE is the name of the dependency database
|
|
#
|
|
MKDEPFILE = makedep
|
|
|
|
#--------------------------------------------------------------------------
|
|
# File removal rules: there are four
|
|
# - neat removes dirt
|
|
# - clean removes intermediates and neat (dirt)
|
|
# - clobber removes targets and clean (intermediates and dirt)
|
|
# - rmtargets removes targets only
|
|
#
|
|
|
|
#--------------------------------------------------------------------------
|
|
# DIRT definitions
|
|
#
|
|
GDIRT = *.cod *.bak *.pdb *.ilk *.map *.sym *.err *.i stderr.out core
|
|
|
|
DIRT = $(GDIRT) $(LDIRT)
|
|
JUNK = __junk__
|
|
|
|
$(THISDIR)clobber: $(THISDIR)clean $(THISDIR)rmtargets
|
|
$(RM) -f $(MKDEPFILE) $(JUNK) $(TAGS)
|
|
|
|
$(THISDIR)clean: $(THISDIR)neat
|
|
$(RM) -f $(OBJECTS) $(JUNK)
|
|
|
|
$(THISDIR)neat:
|
|
$(RM) -f $(DIRT) $(JUNK)
|
|
|
|
$(THISDIR)rmtargets:
|
|
$(RM) -f $(TARGETS) $(JUNK)
|
|
|
|
.SUFFIXES: .cod .i .bat .sh
|
|
|
|
.c.cod:
|
|
$(CC) $(CFLAGS) $(ASM_LIST_FLAGS) $*.c
|
|
|
|
.c.i:
|
|
$(CPP) $(CFLAGS) $*.c > $@
|
|
|
|
.bat.sh:
|
|
awk -f $(BUILD_ROOT_CHIP)/diags/bat2sh.awk $*.bat > $@
|
|
@chmod +x $@
|
|
|
|
#--------------------------------------------------------------------------
|
|
# Include a makedepend file if necessary. Don't know if this
|
|
# works.
|
|
#
|
|
#if EXISTS ($(MKDEPFILE))
|
|
#include $(MKDEPFILE)
|
|
#endif
|
|
|
|
ifndef MAKEFILE
|
|
MAKEFILE = makefile.linux
|
|
endif
|
|
|
|
ifdef CFILES
|
|
$(OBJECTS): $(HEADERS) $(PRIVATE_HEADERS) $(MAKEFILE)
|
|
endif
|
|
|
|
#--------------------------------------------------------------------------
|
|
# Rules for emacs TAGS
|
|
# The etags command appends to the TAGS file, so the TAGS file will keep growing
|
|
# everytime you run add_tags. To start a whole new tags file, make new_tags.
|
|
# This will delete the old TAGS file first. Then if you want to add to
|
|
# the tags file later, just run add_tags. This is useful when you run make
|
|
# from more than one directory (like swlibs and h4), but you want all of it in
|
|
# one tags file.
|
|
|
|
new_tags:
|
|
- rm -f $(TAGS)
|
|
$(MAKE) -f $(MAKEFILE) rtags
|
|
|
|
add_tags:
|
|
$(MAKE) -f $(MAKEFILE) rtags
|
|
|
|
$(THISDIR)rtags: $(HEADERS) $(PRIVATE_HEADERS) $(CFILES) $(LIBSRC)
|
|
ifdef HEADERS
|
|
etags -t -a -C -o $(TAGS) $(HEADERS)
|
|
endif
|
|
ifdef PRIVATE_HEADERS
|
|
etags -t -a -C -o $(TAGS) $(PRIVATE_HEADERS)
|
|
endif
|
|
ifdef CFILES
|
|
etags -t -a -C -o $(TAGS) $(CFILES)
|
|
endif
|
|
ifdef LIBSRC
|
|
etags -t -a -C -o $(TAGS) $(LIBSRC)
|
|
endif
|
|
|
|
#--------------------------------------------------------------------------
|
|
# RECURSIVE rules
|
|
# A recursive makefile should set SUBDIRS and THISDIR
|
|
# setting THISDIR prefixes all the common targets with $(THISDIR)
|
|
# and enables the recursive definitions of them below
|
|
# SUBDIRS1 is used when SUBDIRS exceeds 6 (DOS args only go up to %9)
|
|
ifdef THISDIR
|
|
|
|
# Recursive targets and rules (decend into each subdirectory)
|
|
RETARGETS= clobber clean neat rmtargets depend incs libs bins rtags
|
|
|
|
$(RETARGETS): % : $(THISDIR)%
|
|
@for d in ${SUBDIRS} ;\
|
|
do \
|
|
echo "====recursing into "$$d" (make $@) ============================"; \
|
|
${MAKE} -f $(MAKEFILE) -C $$d $(MAKE_PRINT_DIRECTORY) $@ || exit 1;\
|
|
done
|
|
endif
|
|
|