first 2.5.11, with accidentally forgotten debug output removed
[k8jam.git] / misc / Jambase.pkg
blob855178ffa5a36f100082a459063a5c3c9a551c4f
2 # special package-management rules
4 # check that the package root directory is set
5 # otherwise, set it to $HOME/packages by default
8 # $(1)   : list variable identifier
9 # $(2)   : new list
11 rule _PkgAppend {
12   local result = $($(1)) ;
13   local i ;
15   for i in $(2) {
16     if ! $(i) in $(result) { result += $(i) ; }
17   }
18   $(1) = $(result) ;
22 # $(1)   : list variable identifier
23 # $(2)   : new list
25 rule _PkgPrepend {
26   local result = $($(1)) ;
27   local i ;
29   for i in $(2) {
30     if ! $(i) in $(result) { result = $(i) $(result) ; }
31   }
32   $(1) = $(result) ;
36 # $(1) : Package Name
37 # $(2) : optional top-level installation directory
39 rule PkgBegin {
40   if $(_PKG_NAME) {
41     Echo "nested package declarations are not allowed. please use"
42     Exit "PkgEnd to finish" $(_PKG_NAME)"'s declaration" ;
43   }
45   if ! $(PACKAGE_ROOT) {
46     PACKAGE_ROOT = [ FDirName  $(HOME) packages ] ;
47     Echo "PACKAGE_ROOT  variable not set, using" $(PACKAGE_ROOT) "directory" ;
48   }
50   _PKG_NAME = $(1[1]) ;
51   _PKG_DESC = [ FDirName $(PACKAGE_ROOT) $(_PKG_NAME).pc ] ;
52   _PKG_TOP  = $(2) ;
53   if ! $(_PKG_TOP) {
54     _PKG_TOP = [ FDirName $(PACKAGE_ROOT) $(_PKG_NAME) ] ;
55   }
57   _PKG_ORG_HDRS       = $(HDRS) ;
58   _PKG_ORG_DEFINES    = $(DEFINES) ;
59   _PKG_ORG_LINKLIBS   = $(LINKLIBS) ;
60   _PKG_ORG_SUBDIRHDRS = $(SUBDIRHDRS) ;
62    pkg-$(_PKG_NAME)-top = $(_PKG_TOP) ;
64   _PKG_USES = ;
65   _PKG_DEFINES = ;
66   _PKG_INCLUDES = ;
67   _PKG_LIBS = ;
68   _PKG_DO_INSTALL = ;
70   _PKG_ALL_USES = ;
72   _PkgUpdate ;
76 rule PkgEnd {
77   if $(_PKG_DO_INSTALL) {
78     _PkgGeneratePc $(_PKG_DESC) ;
79     PKG on $(_PKG_DESC) = $(_PKG_NAME) ;
80   }
82   HDRS     = $(_PKG_ORG_HDRS) ;
83   DEFINES  = $(_PKG_ORG_DEFINES) ;
84   LINKLIBS = $(_PKG_ORG_LINKLIBS) ;
86   SUBDIRHDRS = $(_PKG_ORG_SUBDIRHDRS) ;
88   _PKG_NAME = ;
89   _PKG_DO_INSTALL = ;
94 rule _PkgReverse {
95   local p ;
97   result = $(1[1]) ;
99   for p in $(1[2-]) { result = $(p) $(result) ; }
100   return $(result) ;
104 # $(1) : package descriptor file path
106 rule _PkgGeneratePc {
107   MkDir $(PACKAGE_ROOT) ;
108   Depends $(1) : $(PACKAGE_ROOT) ;
109   Depends install : $(1) ;
110   Clean uninstall : $(1) ;
111   Always $(1) ;   # always re-install, overwrite old version
115 if $(UNIX) {
116   actions _PkgGeneratePc {
117     echo "# this file was generated automatically - do not edit" > $(1)
118     echo "pkg-$(PKG)-uses     = $(pkg-$(PKG)-uses) ;" >> $(1)
119     echo "pkg-$(PKG)-libs     = $(pkg-$(PKG)-libs:Q) ;" >> $(1)
120     echo "pkg-$(PKG)-defines  = $(pkg-$(PKG)-defines) ;" >> $(1)
121     echo "pkg-$(PKG)-includes = $(pkg-$(PKG)-includes:Q) ;" >> $(1)
122     echo "pkg-$(PKG)-ok       = 1 ;" >> $(1)
123   }
124 } else {
125   actions _PkgGeneratePc {
126     echo # this file was generated automatically - do not edit > $(1)
127     echo pkg-$(PKG)-uses     = $(pkg-$(PKG)-uses) ; >> $(1)
128     echo pkg-$(PKG)-libs     = $(pkg-$(PKG)-libs:Q) ; >> $(1)
129     echo pkg-$(PKG)-defines  = $(pkg-$(PKG)-defines) ; >> $(1)
130     echo pkg-$(PKG)-includes = $(pkg-$(PKG)-includes:Q) ; >> $(1)
131     echo pkg-$(PKG)-ok       = 1 ; >> $(1)
132   }
136 rule PkgInstallPc {
137   # nothing, this is now handled automatically by PkgEnd
141 # recomputes current package's settings whenever needed
143 # no arguments
145 rule _PkgUpdate {
146   local p z ;
148   _PKG_ALL_DEFINES  = ;
149   _PKG_ALL_INCLUDES = ;
150   _PKG_ALL_LIBS     = ;
151   _PKG_USE_LIBS     = ;
153   for p in $(_PKG_ALL_USES)
154   {
155     _PkgAppend  _PKG_ALL_DEFINES  : $(pkg-$(p)-defines) ;
156     _PkgAppend  _PKG_ALL_INCLUDES : $(pkg-$(p)-includes)    ;
157   }
159   for p in [ _PkgReverse  $(_PKG_ALL_USES) ]
160   {
161     local  thelibs = $(pkg-$(p)-libs) ;
163     _PKG_ALL_LIBS += $(thelibs) ;
164     _PKG_USE_LIBS += $(thelibs[1]) ;
165   }
167   _PkgAppend _PKG_ALL_DEFINES  : $(_PKG_DEFINES) ;
168   _PkgAppend _PKG_ALL_INCLUDES : $(_PKG_INCLUDES) ;
170   HDRS     = $(_PKG_ORG_HDRS)     $(_PKG_ALL_INCLUDES) ;
171   DEFINES  = $(_PKG_ORG_DEFINES)  $(_PKG_ALL_DEFINES) ;
172   LINKLIBS = $(_PKG_ORG_LINKLIBS) $(_PKG_ALL_LIBS) ;
174   pkg-$(_PKG_NAME)-includes = $(_PKG_INCLUDES) ;
175   pkg-$(_PKG_NAME)-defines  = $(_PKG_DEFINES) ;
176   pkg-$(_PKG_NAME)-uses     = $(_PKG_USES) ;
177   pkg-$(_PKG_NAME)-libs     = $(_PKG_LIBS) ;
181 # $(1) : list of packages to use
182 # $(2) : name of missing packages variable
184 rule _PkgUses {
185   local p ;
187   for p in $(1)
188   {
189     if ! $(p) in $(_PKG_ALL_USES)
190     {
191       local  pcfile = [ FDirName $(PACKAGE_ROOT) $(p).pc ] ;
193       NoCare $(pcfile) ;
194       include $(pcfile) ;
196       if ! $(pkg-$(p)-ok)
197       {
198         $(2) += $(p) ;
199       }
200       else if $(pkg-$(p)-uses)
201       {
202         _PkgUses $(pkg-$(p)-uses) ;
203       }
204       _PKG_ALL_USES  +=  $(p) ;
205     }
206   }
210 # $(1) : Package name list
212 rule PkgUses {
213   local  pkg-missing = ;
215   _PkgUses $(1) : pkg-missing ;
217   if $(pkg-missing)
218   {
219     Exit "Please install the following required packages:" $(pkg-missing) ;
220   }
222   _PkgPrepend _PKG_USES : $(1) ;
224   _PkgUpdate ;
228 # $(1) : target directory
229 # $(2) : list of sources relative to $(3)
230 # $(3) : top source directory
232 rule _PkgMakeLocate {
233   local  top = $(3:E=$(DOT)) ;
234   local  dir file ss ;
235   local  dirs ;
237     for ss in $(2)
238     {
239     file = [ FDirName $(top) $(ss:G="") ] ;
240     dir  = $(1) ;
242     if $(ss:D)
243     {
244       dir = [ FDirName $(dir) $(ss:D) ] ;
245     }
247       LOCATE on $(ss) = $(1) ;
248       Depends $(ss) : $(dir) ;
250     if ! $(dir) in $(dirs)
251     {
252       dirs += $(dir) ;
253     }
254   }
256   MkDir $(dirs) ;
259 # $(1) : target directory
260 # $(2) : list of source files relative to $(3)
261 # $(3) : top source directory
263 rule _PkgInstallInto {
264   # InstallInto dir : sources ;
265   local sources = $(2) ;
266   local targets = $(sources:G=$(INSTALLGRIST)) ;
268   # Arrange for jam install
269   # Arrange for jam uninstall
270   # sources are in SEARCH_SOURCE
271   # targets are in dir
273   Depends  install : $(targets) ;
274   Clean uninstall : $(targets) ;
276   _PkgMakeLocate $(1) : $(targets) : $(3) ;
278   # For each source, make gristed target name
279   # and Install, Chmod, Chown, and Chgrp
281   for s in $(sources)
282   {
283     local t = $(s:G=$(INSTALLGRIST)) ;
285     Depends $(t) : $(s) ;
287     SEARCH on $(s) = $(3) ;
289     Install $(t) : $(s) ;
290     Chmod $(t) ;
292     if $(OWNER) && $(CHOWN)
293     {
294       Chown $(t) ;
295       OWNER on $(t) = $(OWNER) ;
296     }
298     if $(GROUP) && $(CHGRP)
299     {
300       Chgrp $(t) ;
301       GROUP on $(t) = $(GROUP) ;
302     }
303   }
306 # $(1) : target directory
307 # $(2) : list of source binaries
308 # $(3) : top source directory
310 rule _PkgInstallBin {
311   local _t = [ FAppendSuffix $(>) : $(SUFEXE) ] ;
313   _PkgInstallInto $(<) : $(_t) : $(3) ;
314   MODE on $(_t:G=$(INSTALLGRIST)) = $(EXEMODE) ;
318 # $(1) : target directory
319 # $(2) : list of source shells
320 # $(3) : top source directory
322 rule _PkgInstallShell {
323   _PkgInstallInto $(1) : $(2) : $(3) ;
324   MODE on $(2:G=$(INSTALLGRIST)) = $(SHELLMODE) ;
328 # $(1) : target directory
329 # $(2) : list of source files
330 # $(3) : top source directory
332 rule _PkgInstallFile {
333   _PkgInstallInto $(1) : $(2) : $(3) ;
334   MODE on $(2:G=$(INSTALLGRIST)) = $(FILEMODE) ;
337 # $(1) : list of include paths
339 rule PkgIncludes {
340   _PKG_INCLUDES += $(1) ;
341   _PkgUpdate ;
344 rule PkgDefines {
345   _PKG_DEFINES += $(1) ;
346   _PkgUpdate ;
349 # $(1) : list of header files
350 # $(2) : top-level source directory
351 # $(3) : optional directory suffix
353 rule PkgInstallHeader {
354   local  dir = [ FDirName $(_PKG_TOP) include ] ;
356   _PKG_DO_INSTALL = 1 ;
358   _PkgInstallFile  [ FDirName $(dir) $(3) ] : $(1) : $(2)   ;
359   _PkgAppend _PKG_INCLUDES : $(dir) ;
360   _PkgUpdate ;
363 # $(1) : library name
365 rule PkgInstallLib {
366   local  lib = $(1:S=$(SUFLIB)) ;
367   local  dir = [ FDirName $(_PKG_TOP) lib ] ;
369   _PKG_DO_INSTALL = 1 ;
371   _PkgInstallFile  $(dir) : $(lib) : $(DOT) ;
372   _PkgPrepend _PKG_LIBS : [ FDirName $(dir) $(lib) ] ;
373   _PkgUpdate ;
377 # $(1) : required library names or link flags
379 rule PkgNeedLib {
380   _PkgAppend _PKG_LIBS : $(1) ;
381   _PkgUpdate ;
385 rule PkgMain {
386     MainFromObjects $(<) : $(>:S=$(SUFOBJ)) ;
387     Objects $(>) ;
388     LINKLIBS on $(<:S=$(SUFEXE)) += $(LINKLIBS) ;
389     Depends $(<:S=$(SUFEXE)) : $(_PKG_USE_LIBS) ;
393 # $(1) : list of directories relative to $(2)
394 # $(2) : top search directory
395 # $(3) : pattern
397 rule PkgGlob {
398   local files dir ;
399   files = [ GLOB [ FDirName $(2) $(1) ] : $(3) ] ;
400   dir   = [ FDirName $(1) ] ;
402   return  $(files:D=$(dir)) ;