aboutsummaryrefslogblamecommitdiffstats
path: root/src/Makefile.in
blob: 33bf8fbac672b84eed87d731c0a452fa48c18046 (plain) (tree)
1
2
3
4
5
6
7





                                                 
               




                                                 



                            

















                                                          







                                                 








                                                 

                                                  






























                                                                  











                                                                              

                                  

































                                                                              


                       
                                        



                              

                                                                                             















                                                                        
                                                













                                                 
           
























                                                       
               







                                                                     
             





                                                 






                                                                                  
 
                                                                          





                                                                    
 
                                           
                                                                      



                                                   



                                                   
 
                                                   

                                
                               
                                                       














                                                                       
                       







                                 



                           
#################################################
# @PACKAGE_STRING@
# @configure_input@
#################################################

@SET_MAKE@
SHELL = /bin/sh

#################################################
# Standard definitions
#################################################

prefix      ?= @prefix@
exec_prefix ?= @exec_prefix@
datarootdir ?= @datarootdir@
datadir     ?= @datadir@
# project root-dir (directory of configure script)
top_srcdir  ?= @top_srcdir@
# project src-dir (directory of the current Makefile)
srcdir      ?= @srcdir@

# file-type suffix of executables (e.g. ".exe" in windows)
EXEEXT ?= @EXEEXT@

#################################################
# Tools
#################################################

# recursive dir creation tool (mkdir -p)
MKDIR     ?= @MKDIR_P@
RM        ?= rm -f
RM_REC    ?= $(RM) -r

#################################################
# General package configuration
#################################################

USDX_PACKAGE_NAME := @PACKAGE_NAME@
USDX_VERSION := @PACKAGE_VERSION@
USDX_TARNAME := @PACKAGE_TARNAME@

#################################################
# USDX Paths
#################################################

USDX_SRC_DIR   := $(top_srcdir)/src
USDX_GAME_DIR  := $(top_srcdir)/game
USDX_TOOLS_DIR := $(top_srcdir)/tools
USDX_BUILD_DIR := $(top_srcdir)/build
USDX_LIB_DIR   := $(USDX_SRC_DIR)/lib

INSTALL_DATADIR := $(datadir)/$(USDX_PACKAGE_NAME)

#################################################
# RC -> resource.inc
#################################################

# RC resource extraction config
RESEXTRACTOR_DIR := $(USDX_TOOLS_DIR)/ResourceExtractor
RESEXTRACTOR_BIN := $(RESEXTRACTOR_DIR)/ResourceExtractor$(EXEEXT)
RESOURCE_DIR  := $(USDX_GAME_DIR)/resources
RESOURCE_FILE := $(srcdir)/resource.inc
RC_FILE       := $(srcdir)/ultrastardx.rc

#################################################
# FPC config
#################################################

# Free Pascal compiler binary
PPC := @PPC@
# FPC target platform and processor
PPLATFORM  := @FPC_PLATFORM@
PPROCESSOR := @FPC_PROCESSOR@

# Directories added to the unit path
PUNIT_FLAGS := -Fu.

# Directory where compiled units (.ppu and .o files) are stored
PCUNIT_DIR   := $(USDX_BUILD_DIR)/fpc-$(PPROCESSOR)-$(PPLATFORM)
PCUNIT_FLAGS := -FU$(PCUNIT_DIR)

# Directories added to the includes path
PINC_FLAGS := -Fi$(USDX_LIB_DIR)/JEDI-SDL/SDL/Pas

##
# PFLAGS
##

# Defined on debug mode
ENABLE_DEBUG := @ENABLE_DEBUG@

# Note: 
#   - PFLAGS/PFLAGS_* defaults to $(PFLAGS_XYZ_DEFAULT) if not set by the user
#   - if PFLAGS is defined, PFLAGS_* will be ignored on "make all"
PFLAGS         ?= @PFLAGS@
PFLAGS_BASE    ?= @PFLAGS_BASE@
PFLAGS_DEBUG   ?= @PFLAGS_DEBUG@
PFLAGS_RELEASE ?= @PFLAGS_RELEASE@

# Do not overwrite, just add extra flags
PFLAGS_EXTRA   += @PFLAGS_EXTRA@

# Default PFLAGS, used if PFLAGS/PFLAGS_* was not set by the user 
# - Do not use -dDEBUG because it will enable unwanted features
# - Do not strip executable (-Xs, set by fpc.cfg) to be GNU make conformant
# - Use DEBUG_MODE instead of DEBUG to avoid enabling the fpc.cfg DEBUG preset
# - The flag -vB appends the full path to filenames
# - Note that fpc.cfg already defines -vinw, so add -v0 first
# - The stack check (-Ct) might not work with enabled threading
# - Do we need -Coi?
PFLAGS_BASE_DEFAULT    := -Si -Sg- -Sc- -v0Binwe
PFLAGS_DEBUG_DEFAULT   := -Xs- -g -gl -dDEBUG_MODE
PFLAGS_RELEASE_DEFAULT := -Xs- -O2
PFLAGS_EXTRA_DEFAULT   :=

# Debug/Release mode flags
# Note that flags will overwrite previously specified flags,
# e.g. "-vinwe -vi-" is the same as "-vnwe"
PFLAGS_DEBUG_ALL   := $(PFLAGS_BASE) $(PFLAGS_DEBUG) $(PFLAGS_EXTRA)
PFLAGS_RELEASE_ALL := $(PFLAGS_BASE) $(PFLAGS_RELEASE) $(PFLAGS_EXTRA)

# Choose default PFLAGS, depending on debug mode.
# Only used if PFLAGS was not set by the user.
ifdef ENABLE_DEBUG
PFLAGS_DEFAULT := $(PFLAGS_DEBUG_ALL)
else
PFLAGS_DEFAULT := $(PFLAGS_RELEASE_ALL)
endif

###
# linker and library settings
###

LIBS       ?= @LIBS@
LDFLAGS    ?= @LDFLAGS@
linkflags  := $(sort $(LDFLAGS) $(LIBS))
ifneq ($(linkflags),)
PLINKFLAGS := -k"$(linkflags)"
endif

PFLAGS_ALL = $(PFLAGS) $(PDEFINES) $(PLINKFLAGS) $(PINC_FLAGS) $(PUNIT_FLAGS) $(PCUNIT_FLAGS)

#################################################
# USDX project config
#################################################

# dpr project file used as input
USDX_PROJ := ultrastardx.dpr
# name of executable
USDX_BIN_NAME ?= ultrastardx$(EXEEXT)
USDX_BIN := $(USDX_GAME_DIR)/$(USDX_BIN_NAME)

#################################################
# ProjectM
#################################################

PROJECTM_CWRAPPER_DIR := $(USDX_LIB_DIR)/projectM/cwrapper
PROJECTM_CWRAPPER_LIB := $(PROJECTM_CWRAPPER_DIR)/libprojectM-cwrapper.a
USE_PROJECTM_CWRAPPER := @USE_PROJECTM_CWRAPPER@

#################################################
# Static libs
#################################################

STATIC_LIBS := 
ifeq ($(USE_PROJECTM_CWRAPPER), yes)
STATIC_LIBS += $(PROJECTM_CWRAPPER_LIB)
endif

#################################################
# general targets
#################################################

.PHONY: all
all: build

# One shot debug build (always rebuild)
# Note: we cannot set PFLAGS and call build directly, 
#  as target specific flags are not passed at recursive
#  make calls. So call debug-build first.
.PHONY: debug debug-build
debug: clean_obj
	$(MAKE) debug-build

debug-build: PFLAGS := $(PFLAGS_DEBUG_ALL)
debug-build: build

# One shot release build (always rebuild)
# Note: we cannot set PFLAGS and call build directly, 
#  as target specific flags are not passed at recursive
#  make calls. So call release-build first.
.PHONY: release release-build
release: clean_obj
	$(MAKE) release-build

release-build: PFLAGS := $(PFLAGS_RELEASE_ALL)
release-build: build

# Always rebuild, even if no file changed.
.PHONY: rebuild
rebuild: clean_obj
	$(MAKE) build

# Build if files changed. Always clean old data before compiling.
# FPC does not reliably recognize changes, neither in .pas, 
# .inc-files nor static libs (.a/.o). This might result in corrupted 
# builds and renders debugging difficult (because FPC uses outdated
# .ppu/.o data of files that have been changed).
.PHONY: build
build: $(USDX_BIN)

#################################################
# build
#################################################

SRC_FILES = $(shell find $(srcdir) -name "*.inc" -o -name "*.pas" -o -name "*.pp")

# To conform to the GNU Coding Standards, INSTALL_DATADIR is
# not hardcoded so $prefix and $datadir can be changed at any
# execution of this Makefile. 
# Paths cannot be passed to fpc via -d as with gcc's -D parameter.
# We use an intermediate file instead.
#
# See [info autoconf], "19.5 How Do I `#define' Installation Directories?"
#
# Do NOT use paths.inc as target name as it is in the requisite list
# of $(USDX_BIN).
.PHONY: create-pathinfo
create-pathinfo:
	echo "INSTALL_DATADIR = '$(INSTALL_DATADIR)';" > paths.inc

# check if any src-file changed and rebuild
$(USDX_BIN): $(RESOURCE_FILE) $(USDX_PROJ) $(STATIC_LIBS) $(SRC_FILES)
	@echo "==================================="
	@echo "Changed files:"
	@echo "$?"
	@echo "==================================="
	@echo "-----------------------------------"
	@echo "Clean old object data..."

	$(MAKE) clean_obj

	@echo "-----------------------------------"

	$(MKDIR) "$(PCUNIT_DIR)"
	$(MAKE) create-pathinfo
	$(PPC) $(strip $(PFLAGS_ALL)) -o$@ $(USDX_PROJ)

#################################################
# Resource-file
#################################################

$(RESOURCE_FILE): $(RC_FILE)
	$(RESEXTRACTOR_BIN) $(RC_FILE) $(RESOURCE_DIR) $(RESOURCE_FILE)


#################################################
# clean-up
#################################################

.PHONY: clean
clean: clean_obj clean_res
	$(RM) paths.inc

.PHONY: clean_res
clean_res:
	$(RM) "$(RESOURCE_FILE)"

.PHONY: clean_obj
clean_obj: clean_bin
	$(RM_REC) "$(PCUNIT_DIR)"

.PHONY: clean_bin
clean_bin:
	$(RM) "$(USDX_BIN)"