1# Copyright (c) 2015 Artur Shepilko 2# 3# Use, modification and distribution is subject to the Boost Software 4# License Version 1.0. (See accompanying file LICENSE_1_0.txt or 5# http://www.boost.org/LICENSE_1_0.txt) 6 7# Implements OpenVMS-based HP DECC/C++ toolset. 8# Relies on POSIX-style path handling bjam/B2 implementation for VMS. 9 10import "class" : new ; 11import property ; 12import generators ; 13import os ; 14import toolset : flags ; 15import feature ; 16import type ; 17import common ; 18import unix ; 19import path ; 20 21 22if [ MATCH (--debug-configuration) : [ modules.peek : ARGV ] ] 23{ 24 .debug-configuration = true ; 25} 26 27feature.extend toolset : vmsdecc ; 28 29toolset.inherit-generators vmsdecc : unix : unix.link unix.link.dll ; 30toolset.inherit-flags vmsdecc : unix ; 31toolset.inherit-rules vmsdecc : unix ; 32 33generators.override vmsdecc.archive-generator : builtin.archive-generator ; 34generators.override vmsdecc.prebuilt : builtin.prebuilt ; 35generators.override vmsdecc.searched-lib-generator : searched-lib-generator ; 36 37type.set-generated-target-suffix EXE : <toolset>vmsdecc <target-os>vms : exe ; 38type.set-generated-target-suffix OBJ : <toolset>vmsdecc <target-os>vms : obj ; 39type.set-generated-target-suffix PREPROCESSED_C : <toolset>vmsdecc <target-os>vms : i ; 40type.set-generated-target-suffix PREPROCESSED_CPP : <toolset>vmsdecc <target-os>vms : ixx ; 41type.set-generated-target-suffix STATIC_LIB : <toolset>vmsdecc <target-os>vms : olb ; ## xxx.olb 42 43type.register-suffixes exe : SHARED_LIB ; 44type.set-generated-target-prefix SHARED_LIB : <toolset>vmsdecc <target-os>vms : shr ; ## shrxxx.exe 45type.set-generated-target-suffix SHARED_LIB : <toolset>vmsdecc <target-os>vms : exe ; ## shrxxx.exe 46 47.OBJ = .obj ; ## suffix 48.nl = " 49" ; 50 51rule init ( version ? : command * : options * ) 52{ 53 local argv = [ modules.peek : ARGV ] ; 54 55 local condition = [ 56 common.check-init-parameters vmsdecc : version $(version) ] ; 57 58 # CC and CXX are CLI commands, so no need to search for the executables 59 command = CXX ; 60 toolset.flags vmsdecc .CXX $(condition) : CXX ; 61 common.handle-options vmsdecc : $(condition) : $(command) : $(options) ; 62 63 local command_c = $(command[1--2]) $(command[-1]:B=CC) ; 64 toolset.flags vmsdecc .CC $(condition) : $(command_c) ; 65 66 local linker = [ feature.get-values <linker> : $(options) ] ; 67 linker ?= CXXLINK ; 68 toolset.flags vmsdecc.link .LD $(condition) : $(linker) ; 69 if $(.debug-configuration) 70 { 71 ECHO notice\: using linker "::" $(condition) "::" $(linker[1]) ; 72 } 73 74 local archiver = LIB ; 75 toolset.flags vmsdecc.archive .AR $(condition) : $(archiver) ; 76 77 local b2 = $(argv[1]) ; 78 toolset.flags vmsdecc .B2 $(condition) : $(b2) ; 79} 80 81# Declare generators 82generators.register-c-compiler vmsdecc.compile.c++.preprocess : CPP : PREPROCESSED_CPP : <toolset>vmsdecc ; 83generators.register-c-compiler vmsdecc.compile.c.preprocess : C : PREPROCESSED_C : <toolset>vmsdecc ; 84generators.register-c-compiler vmsdecc.compile.c : C : OBJ : <toolset>vmsdecc ; 85generators.register-c-compiler vmsdecc.compile.c++ : CPP : OBJ : <toolset>vmsdecc ; 86 87# Declare flags and actions for compilation 88flags vmsdecc.compile OPTIONS <debug-symbols>on : /DEBUG ; 89flags vmsdecc.compile OPTIONS <profiling>on : /DEBUG ; ## needs PCA link options 90flags vmsdecc.compile OPTIONS <optimization>off : /NOOPT ; 91flags vmsdecc.compile OPTIONS <optimization>speed : /OPT=INLINE=SPEED/OPT=NOINLINE ; 92flags vmsdecc.compile OPTIONS <optimization>space : /OPT=INLINE=SIZE/OPT=NOINLINE ; 93flags vmsdecc.compile OPTIONS <warnings>off : /NOWARN ; 94flags vmsdecc.compile OPTIONS <warnings>on : /WARN ; 95flags vmsdecc.compile OPTIONS <warnings>all : /WARN=ENABLE=ALL ; 96flags vmsdecc.compile OPTIONS <warnings>extra : /WARN=ENABLE=ALL ; 97flags vmsdecc.compile OPTIONS <warnings>pedantic : /WARN=ENABLE=ALL ; 98 99flags vmsdecc.compile.c++ OPTIONS <inlining>off : /OPT=NOINLINE ; 100 101flags vmsdecc OPTIONS <address-model>32 : /POINTER=32 ; 102flags vmsdecc OPTIONS <address-model>64 : /POINTER=64 ; ## /POINTER=64=ARGV argv-64 103 104flags vmsdecc.compile OPTIONS <cflags> ; 105flags vmsdecc.compile.c++ OPTIONS <cxxflags> ; 106flags vmsdecc.compile DEFINES <define> ; 107flags vmsdecc.compile UNDEFS <undef> ; 108flags vmsdecc.compile INCLUDES <include> ; 109flags vmsdecc.compile.c++ TEMPLATE_DEPTH <c++-template-depth> ; 110 111feature.feature cxx-repository : : free path ; #order-sensitive ; 112flags vmsdecc CXX-REPOS <cxx-repository> ; 113 114 115local rule get-includes ( sources * : includes * ) 116{ 117 local result ; 118 119 ## Expect POSIX-style path, quote in double-quotes 120 for local d in $(sources:D) $(includes) 121 { 122 if $(d) 123 { 124 local QUOTE = \" ; 125 local SEP = / ; 126 127 local enquote = false ; 128 local addsep = false ; 129 130 s = [ SPLIT_BY_CHARACTERS $(d) : $(QUOTE) ] ; 131 132 if $(s) = $(d) { enquote = true ; } 133 if [ SPLIT_BY_CHARACTERS $(s) : $(SEP) ] = $(s) { addsep = true ; } 134 135 if $(addsep) 136 { 137 d = $(s)$(SEP) ; 138 enquote = true ; 139 } 140 141 if $(enquote) 142 { 143 d = $(QUOTE)$(d)$(QUOTE) ; 144 } 145 146 if ! $(d) in $(result) 147 { 148 result += $(d) ; 149 } 150 } 151 } 152 153 return $(result) ; 154} 155 156CXX-REPO-NAME = cxx_repository ; 157 158local rule get-target-cxx-repo ( target ) 159{ 160 return [ path.join $(target) $(CXX-REPO-NAME) ] ; 161} 162 163rule compile.c++ ( targets * : sources * : properties * ) 164{ 165 DEPENDS $(targets) : [ on $(targets) return $(SOURCE-INCLUDES) ] ; 166 DEPENDS $(targets) : [ on $(targets) return $(CXX-REPOS) ] ; 167 168 DEFINES on $(targets) = [ on $(targets) return "__USE_STD_IOSTREAM" $(DEFINES) ] ; 169 170 INCLUDES on $(targets) = [ on $(targets) get-includes $(sources) : $(INCLUDES) ] ; 171 172 TARGET-CXX-REPO on $(targets) = [ on $(targets[1]) get-target-cxx-repo $(LOCATE) ] ; 173 CXX-REPOS on $(targets) = [ on $(targets) return $(TARGET-CXX-REPO) $(CXX-REPOS) ] ; 174} 175 176 177rule compile.c ( targets * : sources * : properties * ) 178{ 179 DEPENDS $(targets) : [ on $(targets) return $(SOURCE-INCLUDES) ] ; 180 181 INCLUDES on $(targets) = [ on $(targets) get-includes $(sources) : $(INCLUDES) ] ; 182} 183 184actions compile.c 185{ 186 $(.CC) $(OPTIONS) /DEF=("$(DEFINES:J=",")") /UNDEF=("$(UNDEFS:J=",")") /INC=($(INCLUDES:J=,)) /OBJ=$(<:W) $(>:W) 187} 188 189actions compile.c++ 190{ 191 $(.CXX) $(OPTIONS) /DEF=("$(DEFINES:J=",")") /UNDEF=("$(UNDEFS:J=",")") /INC=($(INCLUDES:J=,)) /REPO=($(CXX-REPOS:WJ=,)) /OBJ=$(<:W) $(>:W) 192} 193 194 195 196# Custom linking generator to separate dependency libraries and optfiles from 197# the list of sources. The objfiles, libraries, and optfiles are then referenced 198# via properties. This allows separate qualification of object-files and libraries 199# on linker command line. 200# 201class vmsdecc-linking-generator : linking-generator 202{ 203 rule run ( project name ? : property-set : sources + ) 204 { 205 local result = [ linking-generator.run $(project) $(name) : $(property-set) 206 : $(sources) ] ; 207 208 return $(result) ; 209 } 210 211 rule generated-targets ( sources + : property-set : project name ? ) 212 { 213 local sources2 ; # Sources to pass to inherited rule. 214 local properties2 ; # Properties to pass to inherited rule. 215 local objfiles ; # Object files. 216 local libraries ; # Library sources. 217 218 properties2 = [ $(property-set).raw ] ; 219 220 for local s in $(sources) 221 { 222 if [ type.is-derived [ $(s).type ] OBJ ] 223 { 224 objfiles += $(s) ; 225 properties2 += <link-objfile>$(s) ; 226 } 227 else if [ type.is-derived [ $(s).type ] STATIC_LIB ] 228 { 229 libraries += $(s) ; 230 properties2 += <link-staticlib>$(s) ; 231 } 232 else if [ type.is-derived [ $(s).type ] SHARED_LIB ] 233 { 234 libraries += $(s) ; 235 properties2 += <link-sharedlib>$(s) ; 236 } 237 } 238 239 240 return [ linking-generator.generated-targets $(sources) 241 : [ property-set.create $(properties2) ] : $(project) $(name) ] ; 242 } 243} 244 245 246generators.register [ new vmsdecc-linking-generator vmsdecc.link : 247 OBJ SEARCHED_LIB STATIC_LIB SHARED_LIB : EXE : <toolset>vmsdecc ] ; 248 249generators.register [ new vmsdecc-linking-generator vmsdecc.link.dll : 250 OBJ SEARCHED_LIB STATIC_LIB SHARED_LIB : SHARED_LIB : <toolset>vmsdecc ] ; 251 252 253 254# Declare flags and actions for linking 255flags vmsdecc.link OPTIONS <debug-symbols>on : /DEBUG ; 256# Strip the binary when no debugging is needed 257flags vmsdecc.link OPTIONS <debug-symbols>off : /NODEBUG ; 258flags vmsdecc.link OPTIONS <profiling>on : /DEBUG ; ## need "DEFINE LIB$DEBUG PCA$COLLECTOR" 259flags vmsdecc.link OPTIONS <linkflags> ; 260flags vmsdecc.link LINKPATH <library-path> ; 261flags vmsdecc.link FINDLIBS-ST <find-static-library> ; 262flags vmsdecc.link FINDLIBS-SA <find-shared-library> ; 263flags vmsdecc.link LIBRARIES <library-file> ; 264flags vmsdecc.link LINK-RUNTIME <runtime-link>static : static ; 265flags vmsdecc.link LINK-RUNTIME <runtime-link>shared : dynamic ; 266flags vmsdecc.link RPATH <dll-path> ; 267flags vmsdecc.link FINDLIBS-SA ; 268 269feature.feature "link-objfile" : : free dependency path incidental ; 270flags vmsdecc.link LINK-OBJS <link-objfile> ; 271 272feature.feature "link-libmodule" : : free dependency incidental ; 273flags vmsdecc.link LINK-LIBMODULES <link-libmodule> ; 274 275feature.feature "link-staticlib" : : free dependency path incidental ; 276flags vmsdecc.link LINK-LIBS <link-staticlib> ; 277 278feature.feature "link-sharedlib" : : free dependency path incidental ; 279flags vmsdecc.link LINK-SHAREDLIBS <link-sharedlib> ; 280 281feature.feature "link-optfile" : : free dependency path incidental ; 282flags vmsdecc.link LINK-OPTS <link-optfile> ; 283 284 285local rule export-target-var-contents ( var-name : values * ) 286{ 287 local result ; 288 local nl = " 289" ; 290 local locate ; 291 292 if $(var-name) 293 { 294 result += 295 "$(nl)$(var-name) =" ; 296 for local f in $(values) 297 { 298 locate = [ on $(f) return $(LOCATE) ] ; 299 result += 300 "$(nl)\"$(f:TG=:R=$(locate))\"" ; 301 } 302 result += "$(nl) ;" ; 303 } 304 305 return $(result) ; 306} 307 308# VMS linker usually expects an explicit object module that contains main(). 309# Yet on *NIX, the main module can be automatically resolved from a library -- 310# this may arguably be convenient with dynamic linking, and is also used with 311# Boost.Test. 312# To handle such cases on VMS, one needs first to locate the library module 313# containing main(), then include it in sources for the link command. 314# GLOB_ARCHIVE built-in can locate the module name (globbing by symbol MAIN). 315# To be able to use its result during jam-parsing stage, we need to execute it 316# from a separate jam-file that produces a pre-defined option file for link. 317# 318 319actions write-jam-file-contents 320{ 321 SET FILE /VER=1 @($(<:W):E= $(>) ) 322} 323 324 325local rule mainmod-link-opt.generate ( jam-file : opt-file : objs * : libs * : sharedlibs * ) 326{ 327 local nl = " 328" ; 329 local $ = $ ; 330 local @ = @ ; 331 332 if $(jam-file) && $(opt-file) 333 { 334 local .contents on $(jam-file) = 335 "# This file was auto-generated by <toolset>$(__name__)." ; 336 337 .contents on $(jam-file) += 338 "$(nl)OPT-FILE = $(opt-file) ;" ; 339 340 .contents on $(jam-file) += [ on $(jam-file) 341 export-target-var-contents "OBJS" : $(objs) ] ; 342 343 .contents on $(jam-file) += [ on $(jam-file) 344 export-target-var-contents "LIBS" : $(libs) ] ; 345 346 .contents on $(jam-file) += [ on $(jam-file) 347 export-target-var-contents "SHAREDLIBS" : $(sharedlibs) ] ; 348 349 .contents on $(jam-file) += 350 "$(nl).nl = \"$(nl)\" ;" 351 ; 352 .contents on $(jam-file) += 353 "$(nl)local rule get-main-members ( libs * : symbol-main ? )" 354 "$(nl){" 355 "$(nl) local result ;" 356 "$(nl) symbol-main ?= \"MAIN\" ;" 357 "$(nl) for local libfile in $($)(libs)" 358 "$(nl) {" 359 "$(nl) local main = [ GLOB_ARCHIVE $($)(libfile) : : : $($)(symbol-main) ] ;" 360 "$(nl) if $($)(main)" 361 "$(nl) {" 362 "$(nl) result += $($)(main) ;" 363 "$(nl) }" 364 "$(nl) }" 365 "$(nl) return $($)(result) ;" 366 "$(nl)}" 367 ; 368 .contents on $(jam-file) += 369 "$(nl)local rule get-libmods ( members * )" 370 "$(nl){" 371 "$(nl) local result ;" 372 "$(nl) for local m in $($)(members)" 373 "$(nl) {" 374 "$(nl) local lib = $($)(m:WDBS) ;" 375 "$(nl) local mem = $($)(m:M) ;" 376 "$(nl) if $($)(mem)" 377 "$(nl) {" 378 "$(nl) local mod = [ SPLIT_BY_CHARACTERS $($)(mem) : \"()\" ] ;" 379 "$(nl) result += $($)(lib)/INC=($($)(mod:B))/LIB ;" 380 "$(nl) }" 381 "$(nl) }" 382 "$(nl) return $($)(result) ;" 383 "$(nl)}" 384 ; 385 .contents on $(jam-file) += 386 "$(nl)rule mainmod-link-opt ( opt-file : libs * : objs * )" 387 "$(nl){" 388 "$(nl) local main-members = [ on $($)(opt-file[1]) get-main-members $($)(libs) ] ;" 389 "$(nl) LIBMODULES on $($)(opt-file[1]) = [ on $($)(opt-file[1]) get-libmods $($)(main-members[1]) ] ;" 390 "$(nl)}" 391 ; 392 .contents on $(jam-file) += 393 "$(nl)actions mainmod-link-opt bind OBJS LIBMODULES" 394 "$(nl){" 395 "$(nl) SET FILE /VER=1 $(@)($($)(<:W):E= $($)(LIBMODULES:J=,-$($)(.nl))-$($)(.nl) )" 396 "$(nl)}" 397 ; 398 .contents on $(jam-file) += 399 "$(nl)local rule make" 400 "$(nl){" 401 "$(nl) if $($)(OPT-FILE)" 402 "$(nl) {" 403 "$(nl) DEPENDS all : $($)(OPT-FILE) ;" 404 "$(nl) DEPENDS $($)(OPT-FILE) : $($)(LIBS) $($)(OBJS) ;" 405 "$(nl) mainmod-link-opt $($)(OPT-FILE) : $($)(LIBS) : $($)(OBJS) ;" 406 "$(nl) }" 407 "$(nl)}" 408 "$(nl)make all ;" 409 ; 410 411 write-jam-file-contents $(jam-file) : [ on $(jam-file) return $(.contents) ] ; 412 413 } 414} 415 416 417rule link ( targets * : sources * : properties * ) 418{ 419 DEPENDS $(targets) : [ on $(targets) return $(CXX-REPOS) ] ; 420 DEPENDS $(targets) : [ on $(targets) return $(LINK-OBJS) ] ; 421 DEPENDS $(targets) : [ on $(targets) return $(LINK-LIBS) ] ; 422 DEPENDS $(targets) : [ on $(targets) return $(LINK-SHAREDLIBS) ] ; 423 DEPENDS $(targets) : [ on $(targets) return $(LINK-OPTS) ] ; 424 DEPENDS $(targets) : [ on $(targets) return $(LIBRARIES) ] ; 425 426 427 for local s in $(sources) 428 { 429 local r = [ on $(s) return $(TARGET-CXX-REPO) ] ; 430 431 if ! $(r) in [ on $(targets[1]) return $(CXX-REPOS) ] 432 { 433 CXX-REPOS on $(targets[1]) += $(r) ; 434 } 435 } 436 437 local locate = [ on $(targets[1]) return $(LOCATE) ] ; 438 LINK-MAINMOD-OPT on $(targets[1]) = $(targets[1]:TG=:R=$(locate):S=$MAINMOD.opt) ; 439 LINK-MAINMOD-JAM on $(targets[1]) = $(targets[1]:TG=:R=$(locate):S=$MAINMOD.jam) ; 440 #on $(targets[1]) TEMPORARY $(LINK-MAINMOD-JAM) ; 441 442 DEPENDS $(targets) : [ on $(targets) return $(LINK-MAINMOD-OPT) ] ; 443 DEPENDS $(targets) : [ on $(targets) return $(LINK-MAINMOD-JAM) ] ; 444 on $(targets[1]) DEPENDS $(LINK-MAINMOD-OPT) : $(LINK-MAINMOD-JAM) ; 445 446 on $(targets[1]) mainmod-link-opt.generate $(LINK-MAINMOD-JAM) 447 : $(LINK-MAINMOD-OPT) : $(LINK-OBJS) : $(LINK-LIBS) $(LIBRARIES) : $(LINK-SHAREDLIBS) ; 448 449 450} 451 452actions link bind LINK-OBJS LINK-MAINMOD-JAM LINK-MAINMOD-OPT LINK-LIBS LIBRARIES LINK-SHAREDLIBS LINK-OPTS CXX-REPOS 453{ 454 CXX_REPOS = "" +"$(CXX-REPOS:WJ=,)" 455 IF (CXX_REPOS .EQS. "") THEN CXX_REPOS = "NL:" 456 DEF /NOLOG REPOS 'CXX_REPOS' 457 SET FILE /VER=1 @($(<:WS=$INPUT.opt):E= $(LINK-OBJS:WJ=,-$(.nl))-$(.nl) ,$(LINK-LIBS:WJ=/LIB,-$(.nl))/LIB-$(.nl) ,$(LIBRARIES:WJ=/LIB,-$(.nl))/LIB-$(.nl) ,$(LINK-SHAREDLIBS:WJ=/SHARE,-$(.nl))/SHARE-$(.nl) ) 458 MC $(.B2) -f $(LINK-MAINMOD-JAM:W) 459 $(.LD) $(OPTIONS) /REPO=(REPOS:) /EXE=$(<:W) $(LINK-MAINMOD-OPT:W)/OPT, $(<:WS=$INPUT.opt)/OPT ,$(LINK-OPTS:WJ=/OPT,)/OPT 460} 461 462# Slight mods for dlls 463rule link.dll ( targets * : sources * : properties * ) 464{ 465 DEPENDS $(targets) : [ on $(targets) return $(CXX-REPOS) ] ; 466 DEPENDS $(targets) : [ on $(targets) return $(LINK-OBJS) ] ; 467 DEPENDS $(targets) : [ on $(targets) return $(LINK-LIBS) ] ; 468 DEPENDS $(targets) : [ on $(targets) return $(LINK-SHAREDLIBS) ] ; 469 DEPENDS $(targets) : [ on $(targets) return $(LINK-OPTS) ] ; 470 DEPENDS $(targets) : [ on $(targets) return $(LIBRARIES) ] ; 471 472 for local s in $(sources) 473 { 474 local r = [ on $(s) return $(TARGET-CXX-REPO) ] ; 475 476 if ! $(r) in [ on $(targets[1]) return $(CXX-REPOS) ] 477 { 478 CXX-REPOS on $(targets[1]) += $(r) ; 479 } 480 } 481 482 483 local locate = [ on $(targets[1]) return $(LOCATE) ] ; 484 LINK-MAINMOD-OPT on $(targets[1]) = $(targets[1]:TG=:R=$(locate):S=$MAINMOD.opt) ; 485 LINK-MAINMOD-JAM on $(targets[1]) = $(targets[1]:TG=:R=$(locate):S=$MAINMOD.jam) ; 486 #on $(targets[1]) TEMPORARY $(LINK-MAINMOD-JAM) ; 487 488 DEPENDS $(targets) : [ on $(targets) return $(LINK-MAINMOD-OPT) ] ; 489 DEPENDS $(targets) : [ on $(targets) return $(LINK-MAINMOD-JAM) ] ; 490 on $(targets[1]) DEPENDS $(LINK-MAINMOD-OPT) : $(LINK-MAINMOD-JAM) ; 491 492 on $(targets[1]) mainmod-link-opt.generate $(LINK-MAINMOD-JAM) 493 : $(LINK-MAINMOD-OPT) : $(LINK-OBJS) : $(LINK-LIBS) $(LIBRARIES) : $(LINK-SHAREDLIBS) ; 494 495} 496 497actions link.dll bind LINK-OBJS LINK-MAINMOD-JAM LINK-MAINMOD-OPT LINK-LIB LINK-LIBS LIBRARIES LINK-SHAREDLIBS LINK-OPTS CXX-REPOS 498{ 499 CXX_REPOS = "" +"$(CXX-REPOS:WJ=,)" 500 IF (CXX_REPOS .EQS. "") THEN CXX_REPOS = "NL:" 501 DEF /NOLOG REPOS 'CXX_REPOS' 502 SET FILE /VER=1 @($(<:WS=$INPUT.opt):E= $(LINK-OBJS:WJ=,-$(.nl))-$(.nl) ,$(LINK-LIBS:WJ=/LIB,-$(.nl))/LIB-$(.nl) ,$(LIBRARIES:WJ=/LIB,-$(.nl))/LIB-$(.nl) ,$(LINK-SHAREDLIBS:WJ=/SHARE,-$(.nl))/SHARE-$(.nl) ) 503 MC $(.B2) -f $(LINK-MAINMOD-JAM:W) 504 $(.LD) $(OPTIONS) /REPO=(REPOS:) /SHARE=$(<:W) $(LINK-MAINMOD-OPT:W)/OPT, $(<:WS=$INPUT.opt)/OPT ,$(LINK-OPTS:WJ=/OPT,)/OPT 505} 506 507 508 509flags vmsdecc.archive AROPTIONS <archiveflags> ; 510 511 512local rule vms-join-wildcard-name ( path * : name ) 513{ 514 local files ; 515 516 if $(name) 517 { 518 for local d in $(path) 519 { 520 files += $(d)$(name) ; 521 } 522 523 files ?= $(name) ; 524 525 } 526 527 return $(files) ; 528} 529 530 531rule archive ( targets + : sources * : properties * ) 532{ 533 local clean.a = $(targets[1])(clean) ; 534 TEMPORARY $(clean.a) ; 535 NOCARE $(clean.a) ; 536 LOCATE on $(clean.a) = [ on $(targets[1]) return $(LOCATE) ] ; 537 DEPENDS $(clean.a) : $(sources) ; 538 DEPENDS $(targets) : $(clean.a) ; 539 common.RmTemps $(clean.a) : $(targets) ; 540 541 542 #CXX-REPOS on $(targets[1]) = null ; ## reset 543 544 for local s in $(sources) 545 { 546 local r = [ on $(s) return $(TARGET-CXX-REPO) ] ; 547 548 if ! $(r) in [ on $(targets[1]) return $(CXX-REPOS) ] 549 { 550 CXX-REPOS on $(targets[1]) += $(r) ; 551 } 552 } 553 554 if [ on $(targets[1]) return $(CXX-REPOS) ] 555 { 556 CXX-REPO-OBJS on $(targets[1]) = [ on $(targets[1]) return [ vms-join-wildcard-name $(CXX-REPOS:W) : *$(.OBJ) ] ] ; 557 558 #DEPENDS $(targets) : [ on $(targets[1]) return $(CXX-REPO-OBJS) ] ; 559 } 560} 561 562# Declare action for creating static libraries 563actions piecemeal archive 564{ 565 HAVE_REPO_OBJS = "F" 566 IF ("" +"$(CXX-REPO-OBJS[1])" .NES. "") 567 THEN 568 IF ( "" +F$SEARCH("$(CXX-REPO-OBJS[1])") .NES. "") 569 THEN 570 HAVE_REPO_OBJS = "T" 571 ENDIF 572 ENDIF 573 $(.AR) /CREATE /REPL $(AROPTIONS) $(<:W) $(>:WJ=,) 574 IF (HAVE_REPO_OBJS) 575 THEN 576 $(.AR) /REPL $(AROPTIONS) $(<:W) $(CXX-REPO-OBJS:J=,) 577 PIPE DEL /NOLOG /NOCONF $(CXX-REPO-OBJS:J=;*,);* 2>NL: >NL: 578 ENDIF 579} 580 581