1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 181 182 183 184 185 186 187 188 189 190 191 192 193 194 195 196 197 198 199 200 201 202 203 204 205 206 207 208 209 210 211 212 213 214 215 216 217 218 219 220 221 222 223 224 225 226 227 228 229 230 231 232 233 234 235 236 237 238 239 240 241 242 243 244
|
# -*-mode: makefile;-*-
# $Id: Makepkg,v 1.4 2010-08-13 09:46:16 thiebaut Exp $
# standard parts of yorick package Makefile
SHELL=/bin/sh
MAKE=make
# ------------------------------------------------------------------------
# Any libpkg.a file may require -L and -l linker options in order
# to be able to load it (a corresponding pkg.so would have already
# been linked against those when it was built). Since we want to
# be able to concoct executable yoricks with any subset of those
# libpkg.a statically linked, the required -L and -l options, if
# any, must be recorded in a libpkg.a.dep file kept alongside libpkg.a.
# The rule that does the static link uses the yorick/libdep.sh script
# to find and extract the information from these .dep files, in
# order to create the appropriate linker options.
# beware a subtle feature of Makefile semantics:
# macros used in targets and their prerequisites take their
# "instantaneous" values (make builds dependency tree as it goes)
# macros used in rules or RHS of assignment take their
# "final" values (actions actually happen after entire file parsed)
# these macros are targets or prerequisites:
# Makefile must define these _before_ including Makepkg
# Y_MAKEDIR
# TGT
# OBJS
# PKG_EXE, PKG_LIB, PKG_DLL, PKG_DEF
# EXE_TARGETS, LIB_TARGETS, DLL_TARGETS
# CODGER_DEP, H_YWRAP
# PKG_I_DEPS (same as PKG_I unless PKG_I_DIR)
# ALL_TARGETS
# these macros are used in rules directly:
# LD_DLL, DLL_LIBS
# LD_EXE, Y_MAIN_O, EXE_LIBS, PKG_DEPLIBS (to make .dep file)
# AR, ARFLAGS, RANLIB
# CODGER, PKG_NAME, PKG_I, PKG_I_DIR, EXTRA_PKGS
# Y_EXE, Y_SITE, Y_HOME
# PKG_CLEAN, Y_BINDIR
# DESTDIR, DEST_Y_SITE, DEST_Y_HOME, DEST_Y_BINDIR
# defined in package Makefile (which includes this Makepkg):
# Y_MAKEDIR directory containing Make.cfg, Makepkg, Makeexe, Makedll
# Y_EXE path to yorick executable
# Y_EXE_PKGS statically loaded packages in yorick executable
# Y_EXE_HOME path Y_HOME for yorick executable
# Y_EXE_SITE path Y_SITE for yorick executable
# COPT C optimization flags, COPT_DEFAULT
# TGT exe or dll, the target to be built, DEFAULT_TGT
# PKG_NAME name of this package
# PKG_I startup include file(s) for this package
# OBJS list of object files
# PKG_EXENAME normally just yorick
# PKG_DEPLIBS list of load options (-L, -l) required for this package
# PKG_CFLAGS optional additional CFLAGS for this package (e.g. -I...)
# PKG_LDFLAGS optional additional LDFLAGS for this package (rare)
# EXTRA_PKGS additional static packages if TGT=exe, default Y_EXE_PKGS
# Y_HOME_ALT alternate Y_HOME directory to scan for EXTRA_PKGS
# PKG_CLEAN optional list of non-standard cleanup files
# PKG_I_START optional autoload file(s) for this package
# PKG_I_EXTRA optional ordinary yorick include file(s) for this package
# defined in Make.cfg
# Y_CFG_HOME, Y_CFG_SITE Y_HOME, Y_SITE defined by yorick configure script
# these should always both be relocate in modern yorick installations
# Y_HOME, Y_SITE obsolete, set to Y_CFG_* for backward compatibility
# ALL_TARGETS optional prerequisites for all:
# EXE_TARGETS optional prerequisites for executable
# LIB_TARGETS optional prerequisites for static library
# DLL_TARGETS optional prerequisites for dynamic library
# DESTDIR optional (un)install root
# DEST_Y_SITE optional install Y_SITE (default: $(DESTDIR)$(Y_EXE_SITE))
# DEST_Y_HOME optional install Y_HOME (default: $(DESTDIR)$(Y_EXE_HOME))
# DEST_Y_BINDIR optional install Y_BINDIR (default: $(DESTDIR)$(Y_BINDIR))
# ------------------------------------------------------------------------
# defined in Make.cfg:
# CC
# Y_CFLAGS non-optimization flags required to compile (rare)
# Y_LDFLAGS non-optimization flags required to laod (rare)
# EXE_SFX .exe for WIN32, blank for UNIX
# PLUG_SFX .dll for WIN32, .so for UNIX, .sl for HPUX
# PLUG_EXPORT ld flags for yorick exe that can dlopen packages
# PLUG_LIB ld library containing dlopen
# PLUG_SHARED ld flags to create a dll (may reference Y_EXE)
# PLUG_PIC cc flags unique to modules to go in a dll (-fPIC)
PKG_EXE=$(PKG_EXENAME)$(EXE_SFX)
PKG_LIB=lib$(PKG_NAME).a
PKG_DLL=$(PKG_NAME)$(PLUG_SFX)
PKG_DEF=$(PKG_NAME).def
Y_LIBEXE=$(Y_EXE_HOME)/lib
Y_INCLUDE=$(Y_EXE_HOME)/include
CODGER=$(Y_LIBEXE)/codger$(EXE_SFX)
LIBDEP=$(Y_LIBEXE)/libdep.sh
# might want to override these on make command line
Y_IDIR=-I$(Y_INCLUDE)
Y_LDIR=-L$(Y_LIBEXE)
PKG_L_OPT=-L. -l$(PKG_NAME)
# note that PLUG is defined in Makeexe or Makedll
CFLAGS=$(COPT) $(Y_CFLAGS) $(PKG_CFLAGS) $(PLUG) -I. $(Y_IDIR)
LDFLAGS=$(COPT) $(Y_LDFLAGS) $(PKG_LDFLAGS)
ARFLAGS=rc
Y_HOME_ALT=
EXTRA_LIBS=`$(LIBDEP) "$(Y_EXE_HOME)" "$(Y_HOME_ALT)" $(EXTRA_PKGS)`
LD_EXE=$(CC) $(LDFLAGS) $(PLUG_EXPORT)
EXE_LIBS=$(PKG_L_OPT) $(Y_LDIR) $(PKG_DEPLIBS) $(EXTRA_LIBS) -lyor $(SYS_LIBS)
Y_MAIN_O=$(Y_LIBEXE)/main.o
LD_DLL=$(CC) $(LDFLAGS) $(PLUG_SHARED)
DLL_LIBS=$(PKG_DEPLIBS) $(MATHLIB)
DLL_DEF=$(YWIN_DEF)
SYS_LIBS=$(X11LIB) $(FPELIB) $(MATHLIB) $(PLUG_LIB)
# here are full warning options for gcc (for COPT)
GCCOPTS=-g -O2 -ansi -pedantic -Wall $(GCCPROTO)
GCCPROTO=-Wstrict-prototypes -Wmissing-prototypes -Wmissing-declarations
#------------------------------------------------------------------------
# standard targets
# macros in target names or dependency lists must be defined above here
all: $(ALL_TARGETS) $(TGT)
exe: $(PKG_EXE)
dll: $(PKG_DLL)
# Makeexe or Makedll used to get portable conditional make:
# contain PLUG macro, PKG_EXE, PKG_LIB, PKG_DLL targets
$(PKG_DEF):
echo IMPORTS >$@
sed -e "s/.*/\0 = `basename $(Y_EXE)`.\0/" <$(Y_LIBEXE)/yorapi.def >>$@
ywrap.c: Makefile $(CODGER_DEP) $(PKG_I_DEPS)
$(CODGER) w $(PKG_NAME) $(PKG_I_DIR) $(PKG_I)
yinit.c: Makefile $(CODGER_DEP)
$(CODGER) i "$(Y_CFG_HOME)" "$(Y_CFG_SITE)" $(EXTRA_PKGS) $(PKG_NAME)
yinit.o: yinit.c $(H_YWRAP)
ywrap.o: ywrap.c $(H_YWRAP)
check: check-$(TGT)
check-exe: $(PKG_EXE) check.i
./$(PKG_EXE) -batch check.i
check-dll: $(PKG_DLL) check.i
$(Y_EXE) -batch check.i
dist: distclean
D=`pwd`; D=`basename "$$D"`; cd ..; tar cvf - "$$D"|gzip - >"$$D.tgz"
# following have two colons so you can define additional rules elsewhere
# install-exe build and install PKG_EXE assuming TGT=exe
# install-dll build and install PKG_DLL assuming TGT=dll
# install build and install PKG_$(TGT)
# install0 build PKG_EXE, install all but PKG_EXE executable
# make clean; make TGT=exe install0; make clean; make TGT=dll install
# builds and installs both static and dynamic libraries
# use install instead of install0 to also install static executable
Y_GROUP=`cat $(Y_LIBEXE)/install.grp`
YNSTALL=$(Y_LIBEXE)/install.sh $(Y_GROUP)
DESTDIR=
DEST_Y_SITE=$(DESTDIR)$(Y_EXE_SITE)
DEST_Y_HOME=$(DESTDIR)$(Y_EXE_HOME)
DEST_Y_BINDIR=$(DESTDIR)$(Y_BINDIR)
install:: install-$(TGT)
$(YNSTALL) $(PKG_I_DEPS) $(DEST_Y_SITE)/i0
if test -n "$(PKG_I_START)"; then $(YNSTALL) $(PKG_I_START) $(DEST_Y_HOME)/i-start; fi
if test -n "$(PKG_I_EXTRA)"; then $(YNSTALL) $(PKG_I_EXTRA) $(DEST_Y_SITE)/i; fi
if test -f "$(PKG_NAME).cfg"; then $(YNSTALL) $(PKG_NAME).cfg $(DEST_Y_SITE)/lib; fi
install-exe:: install0
$(YNSTALL) $(PKG_EXE) $(DEST_Y_BINDIR)
install0:: $(PKG_EXE)
$(YNSTALL) $(PKG_LIB) $(DEST_Y_HOME)/lib
$(RANLIB) $(DEST_Y_HOME)/lib/$(PKG_LIB)
if test -f "$(PKG_LIB).dep"; then $(YNSTALL) $(PKG_LIB).dep $(DEST_Y_SITE)/lib; fi
install-dll:: $(PKG_DLL)
$(YNSTALL) $(PKG_DLL) $(DEST_Y_HOME)/lib
uninstall::
if test $(PKG_EXE) != yorick; then rm -f $(DEST_Y_BINDIR)/$(PKG_EXE); fi
rm -f $(DEST_Y_HOME)/lib/$(PKG_LIB) $(DEST_Y_HOME)/lib/$(PKG_LIB).dep $(DEST_Y_HOME)/lib/$(PKG_DLL)
cd $(DEST_Y_SITE)/i0; rm -f $(PKG_I)
if test -n "$(PKG_I_START)"; then cd $(DEST_Y_HOME)/i-start; rm -f $(PKG_I_START); fi
if test -n "$(PKG_I_EXTRA)"; then cd $(DEST_Y_SITE)/i; rm -f $(PKG_I_EXTRA); fi
# non-Y_HOME package installation to directory DEST (default relocate)
# install2 install to directory other than Y_EXE_HOME
# uninstall2 uninstall from directory other than Y_EXE_HOME
DEST=relocate
install2:
echo $(Y_EXE_HOME) >Y_HOME.txt
@$(MAKE) DEST_Y_HOME=$(DEST) DEST_Y_SITE=$(DEST) DEST_Y_BINDIR=$(DEST)/bin TGT=$(TGT) install
$(YNSTALL) Y_HOME.txt $(DEST)/bin
uninstall2:
@$(MAKE) DEST_Y_HOME=$(DEST) DEST_Y_SITE=$(DEST) DEST_Y_BINDIR=$(DEST)/bin TGT=$(TGT) uninstall
rm -f $(DEST)/bin/Y_HOME.txt
if test $(DEST) = relocate; then rm -rf relocate; fi
debug:
@$(MAKE) TGT=exe COPT=-g
clean::
rm -f *~ '#'* core* *.core a.out yinit.* ywrap.* *.dep so_locations Make.tmp
rm -f Y_HOME.txt
rm -f $(OBJS) $(PKG_EXE) $(PKG_LIB) $(PKG_DLL) $(PKG_DEF) $(PKG_CLEAN)
distclean:: clean $(Y_DISTMAKE)
rm -f Makefile.old
rm -rf relocate
distmake:
if S="s/^Y_MAKEDIR=.*/Y_MAKEDIR=/;s/^Y_EXE=.*/Y_EXE=/;\
s/^Y_EXE_PKGS=.*/Y_EXE_PKGS=/;s/^Y_EXE_SITE=.*/Y_EXE_SITE=/;\
s/^Y_EXE_HOME=.*/Y_EXE_HOME=/;s/^Y_HOME_PKG=.*/Y_HOME_PKG=/";\
sed -e "$$S" Makefile >Make.tmp; then mv Make.tmp Makefile; fi
# create optional $(PKG_NAME).cfg file which records package configuration
# do make dumpconfig before make install
# this information insufficient on some platforms
dumpconfig:
@rm -f $(PKG_NAME).cfg
@echo "$(PKG_NAME).cfg built by Make on `date`" >> $(PKG_NAME).cfg
@echo "HOST=`uname -a`" >>$(PKG_NAME).cfg
@echo 'PKG_CFLAGS=$(PKG_CFLAGS)' >> $(PKG_NAME).cfg
@echo 'PKG_LDFLAGS=$(PKG_LDFLAGS)' >> $(PKG_NAME).cfg
@echo 'PKG_DEPLIBS=$(PKG_DEPLIBS)' >> $(PKG_NAME).cfg
@echo 'CC_FULL=$(CC)' >> $(PKG_NAME).cfg
# grab the executable name from the $CC
@echo "CC_PATH=`which \`echo $(CC) | awk 'BEGIN { FS=\" \" };{print $$1}'\``" >> $(PKG_NAME).cfg
# grab the arguments (everyhing after the excutable) from CC
@echo "CC_OPT=`echo $(CC) | awk 'BEGIN { FS=\" \" };{{ for (f=2; f <= NF; f++) { if (f != 1 && f != 9) printf(\"%s \", $$f);}}}'`" >>$(PKG_NAME).cfg
@echo "LD_LIBRARY_PATH=$(LD_LIBRARY_PATH)" >>$(PKG_NAME).cfg
@echo "PATH=$(PATH)" >>$(PKG_NAME).cfg
|