Browse Source

* Use FPCDIR and FPCMAKE environment to find makefile.fpc
* better install dir setting

peter 26 years ago
parent
commit
06ac8cce01
5 changed files with 200 additions and 742 deletions
  1. 33 20
      ide/text/Makefile
  2. 0 663
      ide/text/makefile.fpc
  3. 26 8
      install/make/Makefile
  4. 12 6
      install/make/README
  5. 129 45
      install/make/makefile.fpc

+ 33 - 20
ide/text/Makefile

@@ -16,22 +16,14 @@
 # Defaults
 #####################################################################
 
-# Where are the files located
-MAKEFILEFPC=makefile.fpc
-#RTL=
-#INC=
-#PROCINC=
-#OSINC=
-
-# Needed options, without it won't compile
-#NEEDOPT=
-
 # Add this dir also to the path as first
-UNITDIR=../fake
+ifdef FULL
+NEEDUNITDIR=../../compiler
+NEEDOPT=-dBrowserCol
+else
+NEEDUNITDIR=../fake
+endif
 
-# Where need we to place the executables/ppu/objects
-#TARGETDIR=
-#UNITTARGETDIR=
 
 #####################################################################
 # Real targets
@@ -40,22 +32,43 @@ UNITDIR=../fake
 UNITOBJECTS=
 EXEOBJECTS=fp
 
+
 #####################################################################
 # Include default makefile
 #####################################################################
 
-include $(MAKEFILEFPC)
+ifndef FPCMAKE
+ifdef FPCDIR
+FPCMAKE=$(FPCDIR)/makefile.fpc
+else
+FPCMAKE=makefile.fpc
+endif
+endif
+
+override FPCMAKE:=$(strip $(wildcard $(FPCMAKE)))
+ifeq ($(FPCMAKE),)
+nofpcmake:
+	@echo
+	@echo makefile.fpc not found!
+	@echo Check the FPCMAKE and FPCDIR environment variables.
+	@echo
+	@exit
+else
+include $(FPCMAKE)
+endif
+
 
 #####################################################################
 # Dependencies
 #####################################################################
 
+full:
+	make all FULL=1
+
 #
 # $Log$
-# Revision 1.1  1998-12-22 14:27:54  peter
-#   * moved
-#
-# Revision 1.1  1998/12/12 19:21:14  peter
-#   + Makefile
+# Revision 1.2  1999-01-19 18:21:49  peter
+#   * Use FPCDIR and FPCMAKE environment to find makefile.fpc
+#   * better install dir setting
 #
 #

+ 0 - 663
ide/text/makefile.fpc

@@ -1,663 +0,0 @@
-#
-#   $Id$
-#   Copyright (c) 1998 by the Free Pascal Development Team
-#
-#   Common makefile for Free Pascal
-#
-#   See the file COPYING.FPC, included in this distribution,
-#   for details about the copyright.
-#
-#   This program is distributed in the hope that it will be useful,
-#   but WITHOUT ANY WARRANTY; without even the implied warranty of
-#   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
-#
-
-#####################################################################
-# Force default settings
-#####################################################################
-
-# Latest release version
-override RELEASEVER:=0.99.9
-
-#####################################################################
-# Autodetect OS (Linux or Dos or Windows NT)
-# define inlinux when running under linux
-# define inWinNT when running under WinNT
-#####################################################################
-
-PWD=$(strip $(wildcard $(addsuffix /pwd.exe,$(subst ;, ,$(PATH)))))
-ifeq ($(PWD),)
-PWD=$(strip $(wildcard $(addsuffix /pwd,$(subst :, ,$(PATH)))))
-ifeq ($(PWD),)
-nopwd:
-	@echo
-	@echo You need the GNU pwd,cp,mv,rm,install utils to use this makefile!
-	@echo Get ftp://tflily.fys.kuleuven.ac.be/pub/fpc/dist/gnuutils.zip
-	@echo
-	@exit
-else
-inlinux=1
-endif
-else
-PWD:=$(subst \,/,$(firstword $(PWD)))
-endif
-
-# Detect NT - NT sets OS to Windows_NT
-ifndef inlinux
-ifeq ($(OS),Windows_NT)
-inWinNT=1
-endif
-endif
-
-
-#####################################################################
-# Targets
-#####################################################################
-
-# Target OS
-ifndef OS_TARGET
-ifdef inlinux
-OS_TARGET=linux
-else
-ifdef inWinNT
-OS_TARGET=win32
-else
-OS_TARGET=go32v2
-endif
-endif
-endif
-
-# Source OS
-ifndef OS_SOURCE
-ifdef inlinux
-OS_SOURCE=linux
-else
-ifndef inWinNT
-OS_SOURCE=win32
-else
-OS_SOURCE=go32v2
-endif
-endif
-endif
-
-# CPU
-ifndef CPU
-CPU=i386
-endif
-
-# Options
-ifndef OPT
-OPT=
-endif
-
-# What compiler to use ?
-ifndef PP
-PP=ppc386
-endif
-
-# assembler, redefine it if cross compiling
-ifndef AS
-AS=as
-endif
-
-# linker, but probably not used 
-ifndef LD
-LD=ld
-endif
-
-# Release ? Then force OPT and don't use extra opts via commandline
-ifdef RELEASE
-override OPT:=-Xs -OG2p2 -n
-endif
-
-# Verbose settings (warning,note,info)
-ifdef VERBOSE
-override OPT+=-vwni
-endif
-
-#####################################################################
-# Shell commands
-#####################################################################
-
-# To copy pograms
-ifndef COPY
-COPY=cp -fp
-endif
-
-# To move pograms
-ifndef MOVE
-MOVE=mv -f
-endif
-
-# Check delete program
-ifndef DEL
-DEL=rm -f
-endif
-
-# Check deltree program
-ifndef DELTREE
-DELTREE=rm -rf
-endif
-
-# To install files
-ifndef INSTALL
-ifdef inlinux
-INSTALL=install -m 644
-else
-INSTALL=$(COPY)
-# ginstall has the strange thing to stubify all .o files !
-#INSTALL=ginstall -m 644
-endif
-endif
-
-# To install programs
-ifndef INSTALLEXE
-ifdef inlinux
-INSTALLEXE=install -m 755
-else
-INSTALLEXE=$(COPY)
-# ginstall has the strange thing to stubify all .o files !
-#INSTALLEXE=ginstall -m 755
-endif
-endif
-
-# To make a directory.
-ifndef MKDIR
-ifdef inlinux
-MKDIR=install -m 755 -d
-else
-MKDIR=ginstall -m 755 -d
-endif
-endif
-
-
-#####################################################################
-# Default Tools
-#####################################################################
-
-# ppas.bat / ppas.sh
-ifdef inlinux
-PPAS=ppas.sh
-else
-PPAS=ppas.bat
-endif
-
-# ldconfig to rebuild .so cache
-ifdef inlinux
-LDCONFIG=ldconfig
-else
-LDCONFIG=
-endif
-
-# Where is the ppumove program ?
-ifndef PPUMOVE
-PPUMOVE=ppumove
-endif
-
-# diff
-ifndef DIFF
-DIFF=diff
-endif
-
-# date
-ifndef DATE
-# first try go32v2 specific gdate
-DATE=$(strip $(wildcard $(addsuffix /gdate.exe,$(subst ;, ,$(PATH)))))
-# try generic date.exe
-ifeq ($(DATE),)
-DATE=$(strip $(wildcard $(addsuffix /date.exe,$(subst ;, ,$(PATH)))))
-# finally try for linux
-ifeq ($(DATE),)
-DATE=$(strip $(wildcard $(addsuffix /date,$(subst :, ,$(PATH)))))
-ifeq ($(DATE),)
-DATE=
-endif
-else
-DATE:=$(subst \,/,$(firstword $(DATE)))
-endif
-else
-DATE:=$(subst \,/,$(firstword $(DATE)))
-endif
-endif
-
-# Sed
-ifndef SED
-SED=$(strip $(wildcard $(addsuffix /sed.exe,$(subst ;, ,$(PATH)))))
-ifeq ($(SED),)
-SED=$(strip $(wildcard $(addsuffix /sed,$(subst :, ,$(PATH)))))
-ifeq ($(SED),)
-SED=
-endif
-else
-SED:=$(subst \,/,$(firstword $(SED)))
-endif
-endif
-
-
-#####################################################################
-# Default Directories
-#####################################################################
-
-# Base dir
-ifdef PWD
-BASEDIR=$(shell $(PWD))
-endif
-
-# set the directory to the rtl base
-ifndef RTLDIR
-ifdef RTL
-RTLDIR=$(RTL)
-else
-RTLDIR:=$(BASEDIR)/../rtl
-endif
-endif
-
-# specify where units are.
-ifndef UNITDIR
-UNITDIR=$(RTLDIR)/$(OS_TARGET)
-ifeq ($(OS_TARGET),go32v1)
-UNITDIR=$(RTLDIR)/dos/go32v1
-endif
-ifeq ($(OS_TARGET),go32v2)
-UNITDIR=$(RTLDIR)/dos/go32v2
-endif
-endif
-
-# set the prefix directory where to install everything
-ifndef PREFIXINSTALLDIR
-ifdef inlinux
-PREFIXINSTALLDIR=/usr
-else
-PREFIXINSTALLDIR=/pp
-endif
-endif
-
-# set the base directory where to install everything
-ifndef BASEINSTALLDIR
-ifdef inlinux
-BASEINSTALLDIR=$(PREFIXINSTALLDIR)/lib/fpc/$(RELEASEVER)
-else
-BASEINSTALLDIR=$(PREFIXINSTALLDIR)
-endif
-endif
-
-
-#####################################################################
-# Install Directories based on BASEINSTALLDIR
-#####################################################################
-
-# Linux binary really goes to baseinstalldir
-ifndef LIBINSTALLDIR
-ifdef inlinux
-LIBINSTALLDIR=$(BASEINSTALLDIR)
-else
-LIBINSTALLDIR=$(BASEINSTALLDIR)/lib
-endif
-endif
-
-# set the directory where to install the binaries
-ifndef BININSTALLDIR
-ifdef inlinux
-BININSTALLDIR=$(PREFIXINSTALLDIR)/bin
-else
-BININSTALLDIR=$(BASEINSTALLDIR)/bin/$(OS_TARGET)
-endif
-endif
-
-# set the directory where to install the units.
-ifndef UNITINSTALLDIR
-ifdef inlinux
-UNITINSTALLDIR=$(BASEINSTALLDIR)/linuxunits
-else
-UNITINSTALLDIR=$(BASEINSTALLDIR)/rtl/$(OS_TARGET)
-endif
-endif
-
-# set the directory where to install the units.
-ifndef STATIC_UNITINSTALLDIR
-ifdef inlinux
-STATIC_UNITINSTALLDIR=$(BASEINSTALLDIR)/staticunits
-else
-STATIC_UNITINSTALLDIR=$(BASEINSTALLDIR)/rtl/$(OS_TARGET)/static
-endif
-endif
-
-# set the directory where to install the units.
-ifndef SHARED_UNITINSTALLDIR
-ifdef inlinux
-SHARED_UNITINSTALLDIR=$(BASEINSTALLDIR)/sharedunits
-else
-SHARED_UNITINSTALLDIR=$(BASEINSTALLDIR)/rtl/$(OS_TARGET)/shared
-endif
-endif
-
-# set the directory where to install the libs (must exist)
-ifndef STATIC_LIBINSTALLDIR
-ifdef inlinux
-STATIC_LIBINSTALLDIR=$(BASEINSTALLDIR)/staticunits
-else
-STATIC_LIBINSTALLDIR=$(STATIC_UNITINSTALLDIR)
-endif
-endif
-
-# set the directory where to install the libs (must exist)
-ifndef SHARED_LIBINSTALLDIR
-ifdef inlinux
-SHARED_LIBINSTALLDIR=$(PREFIXINSTALLDIR)/lib
-else
-SHARED_LIBINSTALLDIR=$(SHARED_UNITINSTALLDIR)
-endif
-endif
-
-# Where the .msg files will be stored
-ifndef MSGINSTALLDIR
-ifdef inlinux
-MSGINSTALLDIR=$(BASEINSTALLDIR)/msg
-else
-MSGINSTALLDIR=$(BININSTALLDIR)
-endif
-endif
-
-# Where the doc files will be stored
-ifndef DOCINSTALLDIR
-ifdef inlinux
-DOCINSTALLDIR=$(PREFIXINSTALLDIR)/doc/fpc/$(RELEASEVER)
-else
-DOCINSTALLDIR=$(BASEINSTALLDIR)/doc
-endif
-endif
-
-
-#####################################################################
-# Compiler Command Line
-#####################################################################
-
-# Load commandline OPTDEF and add CPU define
-override PPOPTDEF=$(OPTDEF) -d$(CPU)
-
-# Load commandline OPT and add target and unit dir to be sure
-override PPOPT=$(OPT) -T$(OS_TARGET) -Fu$(UNITDIR) $(NEEDOPT)
-
-# Add include dirs INC and PROCINC
-ifdef INC
-override PPOPT+=-I$(INC)
-endif
-ifdef PROCINC
-override PPOPT+=-I$(PROCINC)
-endif
-ifdef OSINC
-override PPOPT+=-I$(OSINC)
-endif
-
-# Target dirs
-ifdef TARGETDIR
-override PPOPT+=-FE$(TARGETDIR)
-endif
-ifdef UNITTARGETDIR
-override PPOPT+=-FU$(UNITTARGETDIR)
-endif
-
-# Smartlinking
-ifeq ($(SMARTLINK),YES)
-ifeq ($(LIBTYPE),shared)
-override SMARTLINK=NO
-else
-override PPOPT+=-Cx
-endif
-endif
-
-# Add library type, for static libraries smartlinking is automatic used
-ifeq ($(LIBTYPE),shared)
-override PPOPT+=-CD
-else
-ifeq ($(LIBTYPE),static)
-override PPOPT+=-CS
-endif
-endif
-
-# Add library name
-ifneq ($(LIBNAME),)
-override PPOPT:=$(PPOPT) -o$(LIBNAME)
-endif
-
-# Add defines from PPOPTDEF to PPOPT
-override PPOPT:=$(PPOPT) $(PPOPTDEF)
-
-# Was a config file specified ?
-ifdef CFGFILE
-override PPOPT:=$(PPOPT) @$(CFGFILE)
-endif
-
-override COMPILER=$(PP) $(PPOPT)
-
-
-#####################################################################
-# Default extensions
-#####################################################################
-
-# Default needed extensions (Go32v2,Linux)
-PPLEXT=.ppl
-PPUEXT=.ppu
-OEXT=.o
-ASMEXT=.s
-SMARTEXT=.sl
-STATICLIBEXT=.a
-SHAREDLIBEXT=.so
-
-# Executable extension
-ifdef inlinux
-EXEEXT=
-else
-EXEEXT=.exe
-endif
-
-# Go32v1
-ifeq ($(OS_TARGET),go32v1)
-PPUEXT=.pp1
-OEXT=.o1
-ASMEXT=.s1
-SMARTEXT=.sl1
-STATICLIBEXT=.a1
-SHAREDLIBEXT=.so1
-endif
-
-# Win32
-ifeq ($(OS_TARGET),win32)
-PPUEXT=.ppw
-OEXT=.ow
-ASMEXT=.sw
-SMARTEXT=.slw
-STATICLIBEXT=.aw
-SHAREDLIBEXT=.dll
-endif
-
-# OS/2
-ifeq ($(OS_TARGET),os2)
-PPUEXT=.ppo
-ASMEXT=.so2
-OEXT=.o2
-SMARTEXT=.so
-STATICLIBEXT=.ao
-SHAREDLIBEXT=.dll
-endif
-
-# determine libary extension.
-ifeq ($(LIBTYPE),static)
-LIBEXT=$(STATICLIBEXT)
-else
-LIBEXT=$(SHAREDLIBEXT)
-endif
-
-# library prefix
-LIBPREFIX=lib
-ifeq ($(OS_TARGET),go32v2)
-LIBPREFIX=
-endif
-ifeq ($(OS_TARGET),go32v1)
-LIBPREFIX=
-endif
-
-# determine with .pas extension is used
-ifdef EXEOBJECTS
-override TESTPAS:=$(strip $(wildcard $(addsuffix .pas,$(firstword $(EXEOBJECTS)))))
-else
-override TESTPAS:=$(strip $(wildcard $(addsuffix .pas,$(firstword $(UNITOBJECTS)))))
-endif
-
-ifeq ($(TESTPAS),)
-PASEXT=.pp
-else
-PASEXT=.pas
-endif
-
-
-#####################################################################
-# Export commandline values, so nesting use the same values
-#####################################################################
-
-export OS_SOURCE OS_TARGET OPT OPTDEF CPU PP RELEASE VERBOSE
-export SMARTLINK LIBTYPE LIBNAME
-export BASEINSTALLDIR
-
-
-#####################################################################
-# General compile rules
-#####################################################################
-
-# Create Filenames
-EXEFILES=$(addsuffix $(EXEEXT),$(EXEOBJECTS))
-UNITFILES=$(addsuffix $(PPUEXT),$(UNITOBJECTS))
-UNITOFILES=$(addsuffix $(OEXT),$(UNITOBJECTS))
-
-.PHONY : all clean install \
-         info cfginfo objectinfo installinfo filesinfo
-
-.SUFFIXES : $(EXEEXT) $(PPUEXT) $(PASEXT)
-
-ifdef DEFAULTUNITS
-all: units
-else
-all: units exes
-endif
-
-units: $(UNITFILES)
-
-exes: $(EXEFILES)
-
-# General compile rules
-%$(PPUEXT): %$(PASEXT)
-	$(COMPILER) $<
-
-%$(EXEEXT): %$(PASEXT)
-	$(COMPILER) $<
-
-
-
-#####################################################################
-# Install rules
-#####################################################################
-
-install : all
-ifdef EXEOBJECTS
-	$(MKDIR) $(BININSTALLDIR)
-	$(INSTALLEXE) $(EXEFILES) $(BININSTALLDIR)
-endif
-ifdef UNITOBJECTS
-	$(MKDIR) $(UNITINSTALLDIR)
-ifeq ($(SMARTLINK),YES)
-	$(INSTALL) $(LIBPREFIX)$(LIBNAME)$(LIBEXT) $(UNITINSTALLDIR)
-else
-	$(INSTALL) $(UNITFILES) $(UNITOFILES) $(UNITINSTALLDIR)
-endif
-endif
-
-
-#####################################################################
-# Clean rules
-#####################################################################
-
-clean:
-	-$(DEL) *$(OEXT) *$(ASMEXT) *$(PPUEXT) *$(STATICLIBEXT) *$(SHAREDLIBEXT) $(PPAS) link.res log
-	-$(DELTREE) *$(SMARTEXT)
-ifdef EXEOBJECTS
-	-$(DEL) $(EXEFILES)
-endif
-
-
-#####################################################################
-# Depend rules
-#####################################################################
-
-depend:
-	makedep $(UNITOBJECTS)
-
-#####################################################################
-# Info rules
-#####################################################################
-
-info: cfginfo objectinfo installinfo
-
-cfginfo:
-	@echo
-	@echo  == Configuration info ==
-	@echo
-	@echo  Source.... $(OS_SOURCE)
-	@echo  Target.... $(OS_TARGET)
-	@echo  Basedir... $(BASEDIR)
-	@echo  Pwd....... $(PWD)
-ifdef SED
-	@echo  Sed....... $(SED)
-endif
-	@echo
-
-objectinfo:
-	@echo
-	@echo  == Object info ==
-	@echo
-	@echo  UnitObjects... $(UNITOBJECTS)
-	@echo  ExeObjects.... $(EXEOBJECTS)
-	@echo
-
-installinfo:
-	@echo
-	@echo  == Install info ==
-	@echo
-	@echo  BaseInstallDir....... $(BASEINSTALLDIR)
-	@echo  BinInstallDir........ $(BININSTALLDIR)
-	@echo  UnitInstallDir....... $(UNITINSTALLDIR)
-	@echo  StaticUnitInstallDir. $(STATIC_UNITINSTALLDIR)
-	@echo  SharedUnitInstallDir. $(SHARED_UNITINSTALLDIR)
-	@echo  LibInstallDir........ $(LIBINSTALLDIR)
-	@echo  StaticLibInstallDir.. $(STATIC_LIBINSTALLDIR)
-	@echo  SharedLibInstallDir.. $(SHARED_LIBINSTALLDIR)
-	@echo  MsgInstallDir........ $(MSGINSTALLDIR)
-	@echo  DocInstallDir........ $(DOCINSTALLDIR)
-	@echo
-
-# try to get the files in the currentdir
-PASFILES:=$(wildcard *.pas)
-PPFILES:=$(wildcard *.pp)
-INCFILES:=$(wildcard *.inc)
-MSGFILES:=$(wildcard *.msg)
-ASFILES:=$(wildcard *.as)
-
-filesinfo:
-	@echo
-	@echo  == Files info ==
-	@echo
-ifdef PASFILES
-	@echo  Pas files are $(PASFILES)
-endif
-ifdef PPFILES
-	@echo  PP  files are $(PPFILES)
-endif
-ifdef INCFILES
-	@echo  Inc files are $(INCFILES)
-endif
-ifdef MSGFILES
-	@echo  Msg files are $(MSGFILES)
-endif
-ifdef ASFILES
-	@echo  As  files are $(ASFILES)
-endif
-

+ 26 - 8
install/make/Makefile

@@ -16,9 +16,7 @@
 # Defaults
 #####################################################################
 
-# Where are the files located
-MAKEFILEFPC=makefile.fpc
-RTL=
+# Where are the include files located
 INC=
 PROCINC=
 OSINC=
@@ -26,8 +24,8 @@ OSINC=
 # Needed options, without it won't compile
 NEEDOPT=
 
-# Add this dir also to the path as first
-UNITDIR=
+# Needed unit dir, which is searched as the first path
+NEEDUNITDIR=
 
 # Where need we to place the executables/ppu/objects
 TARGETDIR=
@@ -49,7 +47,25 @@ EXEOBJECTS=
 # Include default makefile
 #####################################################################
 
-include $(MAKEFILEFPC)
+ifndef FPCMAKE
+ifdef FPCDIR
+FPCMAKE=$(FPCDIR)/makefile.fpc
+else
+FPCMAKE=makefile.fpc
+endif
+endif
+
+override FPCMAKE:=$(strip $(wildcard $(FPCMAKE)))
+ifeq ($(FPCMAKE),)
+nofpcmake:
+	@echo
+	@echo makefile.fpc not found!
+	@echo Check the FPCMAKE and FPCDIR environment variables.
+	@echo
+	@exit
+else
+include $(FPCMAKE)
+endif
 
 
 #####################################################################
@@ -59,7 +75,9 @@ include $(MAKEFILEFPC)
 
 #
 # $Log$
-# Revision 1.3  1998-12-12 19:14:42  peter
-#   + DEFAULTUNITS to have a make all only compile the units
+# Revision 1.4  1999-01-19 18:21:51  peter
+#   * Use FPCDIR and FPCMAKE environment to find makefile.fpc
+#   * better install dir setting
+#
 #
 #

+ 12 - 6
install/make/README

@@ -21,6 +21,8 @@ OPTDEF          Commandline defines, which also need to be passed to
 NEEDOPT         Realy needed commandline options, also used when
                 RELEASE=1. Example: NEEDOPT=-Sg to allow goto
 
+NEEDUNITDIR     Realy needed unitdir
+
 PP              compiler to use, default is ppc386
                 Example to compile with version 0.99.8: PP=ppc998
 
@@ -54,6 +56,9 @@ LIBTYPE         can be set to shared or static to set the library type you
 DEFAULTUNITS    if this is set then a 'make all' will only compile the units
                 and not the exes
 
+NODEFAULTRULES  Don't include the default compiler rules. This is needed for
+                top-makefiles which call other files in subdirs
+
 
 Location:
 ---------
@@ -99,15 +104,16 @@ PWD             GNU PWD (automaticly searched)
 
 
 Directories:
-------------
+-----------
 BASEDIR         Current working directory (automaticly loaded using PWD)
 
-RTLDIR          Base directory of the Free Pascal RTL. Can also be loaded
-                from the RTL variable
-                Default: $BASEDIR/../rtl
+FPCDIR          Base directory of Free Pascal
+
+RTLDIR          Directory to the used RTL. This contains already the target
+                Default: $FPCDIR/rtl/$OS_TARGET
 
-UNITDIR         Unit directory to add.
-                Default: $RTLDIR/$OS_TARGET
+UNITDIR         Directory to the currently used units for the target
+                Default: $FPCDIR/units/$OS_TARGET
 
 
 Installation directories:

+ 129 - 45
install/make/makefile.fpc

@@ -17,7 +17,8 @@
 #####################################################################
 
 # Latest release version
-override RELEASEVER:=0.99.9
+override RELEASEVER:=0.99.11
+
 
 #####################################################################
 # Autodetect OS (Linux or Dos or Windows NT)
@@ -50,6 +51,21 @@ endif
 endif
 
 
+#####################################################################
+# Check for FPCDIR environment
+#####################################################################
+
+ifndef FPCDIR
+nofpcdir:
+	@echo
+	@echo You need to set the FPCDIR environment variable to use
+	@echo this Makefile.
+	@echo Example: SET FPCDIR=/pp
+	@echo
+	@exit
+endif
+
+
 #####################################################################
 # Targets
 #####################################################################
@@ -100,7 +116,7 @@ ifndef AS
 AS=as
 endif
 
-# linker, but probably not used 
+# linker, but probably not used
 ifndef LD
 LD=ld
 endif
@@ -115,6 +131,7 @@ ifdef VERBOSE
 override OPT+=-vwni
 endif
 
+
 #####################################################################
 # Shell commands
 #####################################################################
@@ -246,15 +263,19 @@ endif
 # set the directory to the rtl base
 ifndef RTLDIR
 ifdef RTL
-RTLDIR=$(RTL)
+RTLDIR=$(RTL)/$(OS_TARGET)
 else
-RTLDIR:=$(BASEDIR)/../rtl
+RTLDIR:=$(FPCDIR)/rtl/$(OS_TARGET)
 endif
 endif
 
 # specify where units are.
 ifndef UNITDIR
-UNITDIR=$(RTLDIR)/$(OS_TARGET)
+ifdef UNITS
+UNITDIR=$(UNITS)/$(OS_TARGET)
+else
+UNITDIR=$(FPCDIR)/units/$(OS_TARGET)
+endif
 endif
 
 # set the prefix directory where to install everything
@@ -262,7 +283,7 @@ ifndef PREFIXINSTALLDIR
 ifdef inlinux
 PREFIXINSTALLDIR=/usr
 else
-PREFIXINSTALLDIR=/pp
+PREFIXINSTALLDIR=$(FPCDIR)
 endif
 endif
 
@@ -298,41 +319,56 @@ BININSTALLDIR=$(BASEINSTALLDIR)/bin/$(OS_TARGET)
 endif
 endif
 
-# set the directory where to install the units.
-ifndef UNITINSTALLDIR
+# Where the .msg files will be stored
+ifndef MSGINSTALLDIR
 ifdef inlinux
-UNITINSTALLDIR=$(BASEINSTALLDIR)/linuxunits
+MSGINSTALLDIR=$(BASEINSTALLDIR)/msg
 else
-UNITINSTALLDIR=$(BASEINSTALLDIR)/rtl/$(OS_TARGET)
+MSGINSTALLDIR=$(BININSTALLDIR)
 endif
 endif
 
-# set the directory where to install the units.
-ifndef STATIC_UNITINSTALLDIR
+# Where the doc files will be stored
+ifndef DOCINSTALLDIR
 ifdef inlinux
-STATIC_UNITINSTALLDIR=$(BASEINSTALLDIR)/staticunits
+DOCINSTALLDIR=$(PREFIXINSTALLDIR)/doc/fpc/$(RELEASEVER)
 else
-STATIC_UNITINSTALLDIR=$(BASEINSTALLDIR)/rtl/$(OS_TARGET)/static
+DOCINSTALLDIR=$(BASEINSTALLDIR)/doc
+endif
 endif
+
+########################
+# Unit Directories
+########################
+
+# this can be set to 'rtl' when the RTL units are installed
+ifndef UNITPREFIX
+UNITPREFIX=units
 endif
 
 # set the directory where to install the units.
-ifndef SHARED_UNITINSTALLDIR
+ifndef UNITINSTALLDIR
 ifdef inlinux
-SHARED_UNITINSTALLDIR=$(BASEINSTALLDIR)/sharedunits
+UNITINSTALLDIR=$(BASEINSTALLDIR)/$(UNITPREFIX)
 else
-SHARED_UNITINSTALLDIR=$(BASEINSTALLDIR)/rtl/$(OS_TARGET)/shared
+UNITINSTALLDIR=$(BASEINSTALLDIR)/$(UNITPREFIX)/$(OS_TARGET)
+endif
+endif
+
+# set the directory where to install the units.
+ifndef STATIC_UNITINSTALLDIR
+STATIC_UNITINSTALLDIR=$(UNITINSTALLDIR)/static
 endif
+
+# set the directory where to install the units.
+ifndef SHARED_UNITINSTALLDIR
+SHARED_UNITINSTALLDIR=$(UNITINSTALLDIR)/shared
 endif
 
 # set the directory where to install the libs (must exist)
 ifndef STATIC_LIBINSTALLDIR
-ifdef inlinux
-STATIC_LIBINSTALLDIR=$(BASEINSTALLDIR)/staticunits
-else
 STATIC_LIBINSTALLDIR=$(STATIC_UNITINSTALLDIR)
 endif
-endif
 
 # set the directory where to install the libs (must exist)
 ifndef SHARED_LIBINSTALLDIR
@@ -343,36 +379,29 @@ SHARED_LIBINSTALLDIR=$(SHARED_UNITINSTALLDIR)
 endif
 endif
 
-# Where the .msg files will be stored
-ifndef MSGINSTALLDIR
-ifdef inlinux
-MSGINSTALLDIR=$(BASEINSTALLDIR)/msg
-else
-MSGINSTALLDIR=$(BININSTALLDIR)
-endif
-endif
-
-# Where the doc files will be stored
-ifndef DOCINSTALLDIR
-ifdef inlinux
-DOCINSTALLDIR=$(PREFIXINSTALLDIR)/doc/fpc/$(RELEASEVER)
-else
-DOCINSTALLDIR=$(BASEINSTALLDIR)/doc
-endif
-endif
-
 
 #####################################################################
 # Compiler Command Line
 #####################################################################
 
 # Load commandline OPTDEF and add CPU define
-override PPOPTDEF=$(OPTDEF) -d$(CPU)
+override PPOPTDEF:=$(OPTDEF) -d$(CPU)
 
 # Load commandline OPT and add target and unit dir to be sure
-override PPOPT=$(OPT) -T$(OS_TARGET) -Fu$(UNITDIR) $(NEEDOPT)
+override PPOPT:=$(OPT) -T$(OS_TARGET) $(NEEDOPT)
 
-# Add include dirs INC and PROCINC
+# RTL first and then Unit dir (a unit can override RTLunit)
+ifdef RTLDIR
+override PPOPT+=$(addprefix -Fu,$(RTLDIR))
+endif
+ifdef UNITDIR
+override PPOPT+=$(addprefix -Fu,$(UNITDIR))
+endif
+ifdef NEEDUNITDIR
+override PPOPT+=$(addprefix -Fu,$(NEEDUNITDIR))
+endif
+
+# Add include dirs INC and PROCINC and OSINC
 ifdef INC
 override PPOPT+=-I$(INC)
 endif
@@ -509,7 +538,8 @@ endif
 # Export commandline values, so nesting use the same values
 #####################################################################
 
-export OS_SOURCE OS_TARGET OPT OPTDEF CPU PP RELEASE VERBOSE
+export FPCDIR FPCMAKE
+export RELEASEVER OS_SOURCE OS_TARGET OPT OPTDEF CPU PP RELEASE VERBOSE
 export SMARTLINK LIBTYPE LIBNAME
 export BASEINSTALLDIR
 
@@ -518,16 +548,23 @@ export BASEINSTALLDIR
 # General compile rules
 #####################################################################
 
+ifndef NODEFAULTRULES
+
 # Create Filenames
 EXEFILES=$(addsuffix $(EXEEXT),$(EXEOBJECTS))
 UNITFILES=$(addsuffix $(PPUEXT),$(UNITOBJECTS))
 UNITOFILES=$(addsuffix $(OEXT),$(UNITOBJECTS))
 
 .PHONY : all clean install \
-         info cfginfo objectinfo installinfo filesinfo
+	 info cfginfo objectinfo installinfo filesinfo
 
 .SUFFIXES : $(EXEEXT) $(PPUEXT) $(PASEXT)
 
+
+#####################################################################
+# Default
+#####################################################################
+
 ifdef DEFAULTUNITS
 all: units
 else
@@ -546,26 +583,67 @@ exes: $(EXEFILES)
 	$(COMPILER) $<
 
 
+#####################################################################
+# Library
+#####################################################################
+
+staticlib:
+	$(MAKE) libsclean
+	$(MAKE) all SMARTLINK=YES LIBTYPE=static
+
+
+sharedlib:
+ifdef inlinux
+	$(MAKE) libsclean
+	$(MAKE) all LIBTYPE=shared
+else
+	@echo Shared Libraries not supported
+endif
+
+
+libsclean : clean
+	-$(DEL) *$(STATICLIBEXT) *$(SHAREDLIBEXT) *$(PPLEXT)
+
 
 #####################################################################
 # Install rules
 #####################################################################
 
 install : all
+ifndef DEFAULTUNITS
 ifdef EXEOBJECTS
 	$(MKDIR) $(BININSTALLDIR)
 	$(INSTALLEXE) $(EXEFILES) $(BININSTALLDIR)
 endif
+endif
 ifdef UNITOBJECTS
 	$(MKDIR) $(UNITINSTALLDIR)
+	$(INSTALL) $(UNITFILES) $(UNITINSTALLDIR)
 ifeq ($(SMARTLINK),YES)
 	$(INSTALL) $(LIBPREFIX)$(LIBNAME)$(LIBEXT) $(UNITINSTALLDIR)
 else
-	$(INSTALL) $(UNITFILES) $(UNITOFILES) $(UNITINSTALLDIR)
+	-$(INSTALL) *$(OEXT) $(UNITINSTALLDIR)
 endif
 endif
 
 
+staticlibinstall: staticlib
+	$(MKDIR) $(STATIC_UNITINSTALLDIR)
+	$(INSTALL) $(UNITFILES) $(STATIC_UNITINSTALLDIR)
+	$(MKDIR) $(STATIC_LIBINSTALLDIR)
+	$(INSTALLEXE) *$(STATICLIBEXT) $(STATIC_LIBINSTALLDIR)
+
+
+sharedlibinstall: sharedlib
+	$(MKDIR) $(SHARED_UNITINSTALLDIR)
+	$(INSTALL) $(UNITFILES) $(SHARED_UNITINSTALLDIR)
+	$(MKDIR) $(SHARED_LIBINSTALLDIR)
+	$(INSTALLEXE) *$(SHAREDLIBEXT) $(SHARED_LIBINSTALLDIR)
+
+
+libinstall: staticlibinstall sharedlibinstall
+
+
 #####################################################################
 # Clean rules
 #####################################################################
@@ -585,6 +663,7 @@ endif
 depend:
 	makedep $(UNITOBJECTS)
 
+
 #####################################################################
 # Info rules
 #####################################################################
@@ -595,6 +674,10 @@ cfginfo:
 	@echo
 	@echo  == Configuration info ==
 	@echo
+	@echo  FPCDir.... $(FPCDIR)
+	@echo  FPCMake... $(FPCMAKE)
+	@echo
+	@echo  Target.... $(OS_TARGET)
 	@echo  Source.... $(OS_SOURCE)
 	@echo  Target.... $(OS_TARGET)
 	@echo  Basedir... $(BASEDIR)
@@ -655,3 +738,4 @@ ifdef ASFILES
 	@echo  As  files are $(ASFILES)
 endif
 
+endif #NODEFAULTRULES