1.1 --- /dev/null Thu Jan 01 00:00:00 1970 +0000 1.2 +++ b/security/nss/coreconf/README Wed Dec 31 06:09:35 2014 +0100 1.3 @@ -0,0 +1,555 @@ 1.4 +OVERVIEW of "ns/coreconf": 1.5 + 1.6 + This README file is an attempt to provide the reader with a simple 1.7 + synopsis of the "ns/coreconf" build system which was originally 1.8 + fundamentally designed and built to accomodate Netscape's binary 1.9 + release model. Wherever possible, an attempt has been made to 1.10 + comply with the NSPR 2.0 build system, including mimicing the 1.11 + compiler/linker flags, and directory naming structure. The reader 1.12 + should keep in mind that the system builds binary releases of 1.13 + header files, class files, libraries, and executables on numerous 1.14 + flavors of UNIX and Windows operating systems. Unfortunately, 1.15 + no serious attempt has ever been made to incorporate an ability to 1.16 + generate cross-platform binaries on an Apple MacIntosh platform. 1.17 + 1.18 + Note that this file will not attempt to redefine or document the 1.19 + architecture of this system. However, documents on this subject 1.20 + are available at the following URL: 1.21 + 1.22 + http://warp/hardcore/prj-ttools/specs/release/index.html 1.23 + 1.24 + 1.25 + 1.26 +DEPENDENCIES of "ns/coreconf": 1.27 + 1.28 + The "ns/coreconf" build system requires the specified versions of 1.29 + the following platform-dependent tools: 1.30 + 1.31 + UNIX Platforms: 1.32 + -------------- 1.33 + gmake (version 3.74 or later) 1.34 + perl 4.0 (NOTE: perl 5.003 or later recommended) 1.35 + uname 1.36 + 1.37 + Windows Platforms: 1.38 + ----------------- 1.39 + gmake 3.74 (must use hacked Netscape version) 1.40 + shmsdos.exe (contained in Netscape gmake.exe) 1.41 + nsinstall.exe (contained in Netscape gmake.exe) 1.42 + perl.exe (version 4.0 for everything except testing; 1.43 + NOTE: MKS toolkit perl 5.002 is broken) 1.44 + perl5.exe (for testing; 1.45 + NOTE: perl 5.003 or later recommended; 1.46 + MKS toolkit perl 5.002 is broken) 1.47 + uname.exe (use nstools version) 1.48 + 1.49 +ENHANCEMENTS to "ns/coreconf": 1.50 + 1.51 + With the advent of Certificate Server 4.0 using the ns/coreconf 1.52 + build system, several changes had to be made to enhance 1.53 + ns/coreconf support for building Java/JNI classes/programs, as 1.54 + well as libraries slated to be released as binaries. While the 1.55 + following may not represent an exhaustive list of these changes, 1.56 + it does attempt to be at least somewhat comprehensive: 1.57 + 1.58 + (1) During the course of these enhancements, a total of 1.59 + four files have been modified, and four new files have 1.60 + been added. 1.61 + 1.62 + The following files have been modified: 1.63 + 1.64 + - command.mk: removed old definition of JAR 1.65 + 1.66 + - config.mk: added include statement of new 1.67 + "jdk.mk" file 1.68 + 1.69 + - ruleset.mk: allowed the $(MKPROG) variable to be 1.70 + overridden by supplying it with a 1.71 + default value of $(CC); augmented 1.72 + numerous definitions to enhance 1.73 + ability of ns/coreconf to produce 1.74 + a more robust set of libraries; 1.75 + added some JNI definitions; PACKAGE 1.76 + definition may be overridden by new 1.77 + "jdk.mk" file 1.78 + 1.79 + - rules.mk: separated the compile phase of a 1.80 + program from the link phase of a 1.81 + program such that a developer can 1.82 + now strictly override program linkage 1.83 + by simply supplying a $(MKPROG) 1.84 + variable; augmented NETLIBDEPTH 1.85 + to use CORE_DEPTH but retain backward 1.86 + compatibility; added JNI section; 1.87 + modified .PRECIOUS rule; 1.88 + 1.89 + The following files have been added: 1.90 + 1.91 + - README: this file; an ASCII-based text 1.92 + document used to summarize the 1.93 + ns/coreconf build system and 1.94 + suitable (paginated) for printing 1.95 + 1.96 + - jdk.mk: a file comprising most (if not all) 1.97 + of the default Java related build 1.98 + information; the definitions in this 1.99 + file are only included if NS_USE_JDK 1.100 + has been defined 1.101 + 1.102 + - jniregen.pl: a perl script used to create a 1.103 + dependency for when JNI files should 1.104 + be regenerated (based upon any change 1.105 + to the ".class" file from which the 1.106 + ".h" file was originally generated) 1.107 + 1.108 + - outofdate.pl: a perl script used to create a 1.109 + dependency for when ".class" files 1.110 + should be regenerated (based upon 1.111 + any change to the ".java" file 1.112 + from which the ".class" file was 1.113 + originally generated) 1.114 + 1.115 + (2) As stated above, the ns/coreconf build system now separates 1.116 + the link phase of a program from its compilation phase. 1.117 + While ns/coreconf still works exactly as it used to because 1.118 + the $(MKPROG) variable is assigned $(CC) by default, a developer 1.119 + may now override this behavior by simply supplying their 1.120 + own unique value for $(MKPROG) on every platform. This allows 1.121 + a program compiled with $(CC) to link with external libraries 1.122 + that may contain "C++" linkage. Before this change, a 1.123 + programmer would need to reference their own local copy of 1.124 + rules.mk (see the ns/sectools/cmd/pk12util program for 1.125 + an example of how this used to be accomplished). 1.126 + 1.127 + (3) Currently, the ns/coreconf build system differs from the 1.128 + NSPR 2.0 build system which utilizes an "_s" to denote 1.129 + static libraries from import libraries. In fact, the 1.130 + ns/coreconf build system adds no prefixes or suffixes to 1.131 + distinguish one version of static libraries from another. 1.132 + Note that both the ns/coreconf build system as well as the 1.133 + NSPR 2.0 build system do nothing to provide a method of 1.134 + distinguishing 16-bit from 32-bit static libraries on the 1.135 + same machine, either, since: 1.136 + 1.137 + a) this might only provide difficulty during 1.138 + development, since static libraries always 1.139 + need to be embedded within a program 1.140 + (note this is highly unlikely, since libraries 1.141 + for different platforms are subdivided via 1.142 + a well-known subdirectory structure, and 1.143 + a developer may use multiple trees for 1.144 + development), 1.145 + 1.146 + b) this maintains backwards compatibility, 1.147 + something very important since no legacy 1.148 + programs will need to change their link phase, and 1.149 + 1.150 + c) Netscape as a company has dropped any plans 1.151 + of future development of 16-bit products. 1.152 + 1.153 + (4) Since several members of the Hardcore Security group did 1.154 + not favor NSPR 2.0's solution of adding an "_s" to static 1.155 + libraries on Windows platforms as a method to distinguish 1.156 + them from their import library cousins, a different solution 1.157 + was proposed and has been recently implemented for ns/coreconf: 1.158 + 1.159 + - a 16 has been added as a suffix to both dynamic and 1.160 + import libraries built on 16-bit Windows platforms 1.161 + 1.162 + - a 32 has been added as a suffix to both dynamic and 1.163 + import libraries built on 32-bit Windows platforms 1.164 + 1.165 + Since the HCL release process currently only contains a 1.166 + single instance of building a dynamic library, 1.167 + ns/security/lib/fortcrypt/fort12.dll, the impact of this 1.168 + change should be relatively small. (Note: HCL was the 1.169 + old name of NSS.) 1.170 + 1.171 + It should be noted that although this would additionally 1.172 + limit the 8.3 namespace on 16-bit platforms, it is highly 1.173 + unlikely that any future development will be performed on 1.174 + this platform. 1.175 + 1.176 + (5) The $(LIBRARY_VERSION) tag has been added to all non-static 1.177 + libraries created on UNIX operating systems to alleviate 1.178 + any future confusion for binary releases which utilize this 1.179 + tag. Again, it should be noted that this tag is only 1.180 + utilized on non-static libraries, since more than one 1.181 + version of the library may need to exist simultaneously 1.182 + if multiple products are utilized. 1.183 + 1.184 + Currently, only one HCL released library utilizes this tag: 1.185 + 1.186 + ns/security/lib/fortcrypt/fort12.a 1.187 + (e. g. - in this library, the tag has been set to '12') 1.188 + 1.189 + Again, it should be noted that although this would 1.190 + additionally limit the 8.3 namespace on 16-bit platforms, 1.191 + it is highly unlikely that any future development will be 1.192 + performed on this platform. 1.193 + 1.194 + (6) The $(JDK_DEBUG_SUFFIX) extension has been added to all 1.195 + library and program names to support debug versions of 1.196 + Java programs (e. g. - java_g, javac_g, etc). 1.197 + 1.198 + Once again, it should be noted that although this would 1.199 + additionally limit the 8.3 namespace on 16-bit platforms, 1.200 + it is highly unlikely that any future Java development 1.201 + will be performed on this platform. 1.202 + 1.203 + (7) Most (if not all) default definitions for java have been 1.204 + encapsulated within their own file, jdk.mk, which is 1.205 + always included by default in ns/coreconf/config.mk. 1.206 + However, the definitions within this file are only ever 1.207 + activated if NS_USE_JDK has been set to be 1. 1.208 + 1.209 + 1.210 + (8) Two perl scripts (jniregen.pl and outofdate.pl) have been 1.211 + added to the system to foster a more robust development 1.212 + environment for composing Java and JNI programs 1.213 + utilizing the ns/coreconf build system. Both of these 1.214 + perl scripts are related to resolving dependencies which 1.215 + can not be accomplished through normal makefile dependencies. 1.216 + 1.217 + (9) This file, README, was created in an attempt to allow 1.218 + developers who have familiarity with ns/coreconf a simple 1.219 + roadmap for what has changed, as well as a top-level view of 1.220 + what comprises ns/coreconf. This file was written in 1.221 + ASCII (rather than HTML) primarily to promote simple 1.222 + paginated printing. 1.223 + 1.224 +OVERVIEW of "config.mk": 1.225 + 1.226 + This file contains the configuration information necessary to 1.227 + build each "Core Components" source module: 1.228 + 1.229 + include file name Purpose 1.230 + =================== ======================================= 1.231 + arch.mk source and release <architecture> tags 1.232 + 1.233 + command.mk default command macros 1.234 + (NOTE: may be overridden in $(OS_CONFIG).mk) 1.235 + 1.236 + $(OS_CONFIG).mk <architecture>-specific macros 1.237 + (dependent upon <architecture> tags) 1.238 + 1.239 + tree.mk release <tree> tags 1.240 + (dependent upon <architecture> tags) 1.241 + 1.242 + module.mk source and release <component> tags 1.243 + (NOTE: A component is also called a module 1.244 + or a subsystem. This file is dependent upon 1.245 + $(MODULE) being defined on the command 1.246 + line, as an environment variable, or in 1.247 + individual makefiles, or more 1.248 + appropriately, manifest.mn) 1.249 + 1.250 + version.mk release <version> tags 1.251 + (dependent upon $(MODULE) being defined on 1.252 + the command line, as an environment variable, 1.253 + or in individual makefiles, or more 1.254 + appropriately, manifest.mn) 1.255 + 1.256 + location.mk macros to figure out binary code location 1.257 + (dependent upon <platform> tags) 1.258 + 1.259 + source.mk <component>-specific source path 1.260 + (dependent upon <user_source_tree>, 1.261 + <source_component>, <version>, and 1.262 + <platform> tags) 1.263 + 1.264 + headers.mk include switch for support header files 1.265 + (dependent upon <tree>, <component>, <version>, 1.266 + and <platform> tags) 1.267 + 1.268 + prefix.mk compute program prefixes 1.269 + 1.270 + suffix.mk compute program suffixes 1.271 + (dependent upon <architecture> tags) 1.272 + 1.273 + jdk.mk define JDK 1.274 + (dependent upon <architecture>, 1.275 + <source>, and <suffix> tags) 1.276 + 1.277 + ruleset.mk Master "Core Components" rule set 1.278 + (should always be the last file 1.279 + included by config.mk) 1.280 + 1.281 + 1.282 + 1.283 +OVERVIEW of "rules.mk": 1.284 + 1.285 + The "rules.mk" file consists of four sections. The first section 1.286 + contains the "master" build rules for all binary releases. While 1.287 + this section can (and should) largely be thought of as "language" 1.288 + independent, it does utilize the "perl" scripting language to 1.289 + perform both the "import" and "release" of binary modules. 1.290 + 1.291 + The rules which dwell in this section and their purpose: 1.292 + 1.293 + 1.294 + CATEGORY/rule:: Purpose 1.295 + =================== ======================================= 1.296 + 1.297 + GENERAL 1.298 + ------- 1.299 + all:: "default" all-encompassing rule which 1.300 + performs "export libs program install" 1.301 + 1.302 + export:: recursively copy specified 1.303 + cross-platform header files to the 1.304 + $(SOURCE_XPHEADERS_DIR) directory; 1.305 + recursively copy specified 1.306 + machine-dependent header files to the 1.307 + $(SOURCE_MDHEADERS_DIR) directory; 1.308 + although all rules can be written to 1.309 + repetively "chain" into other sections, 1.310 + this rule is the most commonly used 1.311 + rule to "chain" into other sections 1.312 + such as Java providing a simple 1.313 + mechanism which allows no need for 1.314 + developers to memorize specialized 1.315 + rules 1.316 + 1.317 + libs:: recursively build 1.318 + static (archival) $(LIBRARY), shared 1.319 + (dynamic link) $(SHARED_LIBRARY), 1.320 + and/or import $(IMPORT_LIBRARY) 1.321 + libraries 1.322 + 1.323 + program:: recursively build $(PROGRAM) 1.324 + executable 1.325 + 1.326 + install:: recursively copy all libraries to 1.327 + $(SOURCE_LIB_DIR) directory; 1.328 + recursively copy all executables to 1.329 + $(SOURCE_BIN_DIR) directory 1.330 + 1.331 + clean:: remove all files specified in the 1.332 + $(ALL_TRASH) variable 1.333 + 1.334 + clobber:: synonym for "clean::" rule 1.335 + 1.336 + realclean:: remove all files specified by 1.337 + $(wildcard *.OBJ), dist, and in 1.338 + the $(ALL_TRASH) variable 1.339 + 1.340 + clobber_all:: synonym for "realclean::" rule 1.341 + 1.342 + private_export:: recursively copy specified 1.343 + cross-platform header files to the 1.344 + $(SOURCE_XPPRIVATE_DIR) directory 1.345 + 1.346 + 1.347 + IMPORT 1.348 + ------ 1.349 + import:: uses perl script to retrieve specified 1.350 + VERSION of the binary release from 1.351 + $(RELEASE_TREE) 1.352 + 1.353 + RELEASE 1.354 + ------- 1.355 + release_clean:: remove all files from the 1.356 + $(SOURCE_RELEASE_PREFIX) directory 1.357 + 1.358 + release:: place specified VERSION of the 1.359 + binary release in the appropriate 1.360 + $(RELEASE_TREE) directory 1.361 + 1.362 + release_export:: recursively copy specified 1.363 + cross-platform header files to the 1.364 + $(SOURCE_XPHEADERS_DIR)/include 1.365 + directory 1.366 + 1.367 + release_md:: recursively copy all libraries to 1.368 + $(SOURCE_RELEASE_PREFIX)/ 1.369 + $(SOURCE_RELEASE_LIB_DIR) directory; 1.370 + recursively copy all executables to 1.371 + $(SOURCE_RELEASE_PREFIX)/ 1.372 + $(SOURCE_RELEASE_BIN_DIR) directory 1.373 + 1.374 + release_jars:: use perl script to package appropriate 1.375 + files in the $(XPCLASS_JAR), 1.376 + $(XPHEADER_JAR), $(MDHEADER_JAR), and 1.377 + $(MDBINARY_JAR) jar files 1.378 + 1.379 + release_cpdistdir:: use perl script to copy the 1.380 + $(XPCLASS_JAR), $(XPHEADER_JAR), 1.381 + $(MDHEADER_JAR), and $(MDBINARY_JAR) 1.382 + jar files to the specified VERSION 1.383 + of the $(RELEASE_TREE) directory 1.384 + 1.385 + 1.386 + 1.387 + TOOLS and AUTOMATION 1.388 + -------------------- 1.389 + platform:: tool used to display the platform name 1.390 + as composed within the "arch.mk" file 1.391 + 1.392 + autobuild:: automation rule used by "Bonsai" and 1.393 + "Tinderbox" to automatically generate 1.394 + binary releases on various platforms 1.395 + 1.396 + tests:: automation tool used to run the 1.397 + "regress" and "reporter" tools 1.398 + on various regression test suites 1.399 + 1.400 + The second section of "rules.mk" primarily contains several 1.401 + "language" dependent build rules for binary releases. These are 1.402 + generally "computed" rules (created on the "fly"), and include 1.403 + rules used by "C", "C++", assembly, the preprocessor, perl, and 1.404 + the shell. 1.405 + 1.406 + The rules which dwell in this section and their purpose: 1.407 + 1.408 + 1.409 + CATEGORY/rule:: Purpose 1.410 + =================== ============================= 1.411 + 1.412 + LIBRARIES 1.413 + --------- 1.414 + $(LIBRARY): build the static library 1.415 + specified by the $(LIBRARY) 1.416 + variable 1.417 + 1.418 + $(IMPORT_LIBRARY): build the import library 1.419 + specified by the 1.420 + $(IMPORT_LIBRARY) variable 1.421 + 1.422 + $(SHARED_LIBRARY): build the shared 1.423 + (dynamic link) library 1.424 + specified by the 1.425 + $(SHARED_LIBRARY) variable 1.426 + 1.427 + 1.428 + PROGRAMS 1.429 + -------- 1.430 + $(PROGRAM): build the binary executable 1.431 + specified by the $(PROGRAM) 1.432 + rule 1.433 + 1.434 + $(OBJDIR)/ 1.435 + $(PROG_PREFIX)%.pure: build the "purified" binary 1.436 + executable specified by this 1.437 + rule 1.438 + 1.439 + 1.440 + OBJECTS 1.441 + ------- 1.442 + $(OBJDIR)/ 1.443 + $(PROG_PREFIX)%$(OBJ_SUFFIX): build the object file 1.444 + associated with the 1.445 + makefile rule dependency: 1.446 + 1.447 + %.c = C file 1.448 + %.cpp = C++ file 1.449 + %.cc = C++ file 1.450 + %.s = assembly file 1.451 + %.S = assembly file 1.452 + 1.453 + $(OBJDIR)/ 1.454 + $(PROG_PREFIX)%: (NOTE: deprecated rule) 1.455 + build the object file 1.456 + associated with the 1.457 + makefile rule dependency: 1.458 + 1.459 + %.cpp = C++ file 1.460 + 1.461 + MISCELLANEOUS 1.462 + ------------- 1.463 + %.i: build the preprocessor file 1.464 + associated with the 1.465 + makefile rule dependency: 1.466 + 1.467 + %.c = C file 1.468 + %.cpp = C++ file 1.469 + 1.470 + %: process the specified file 1.471 + using the method associated 1.472 + with the makefile rule 1.473 + dependency: 1.474 + 1.475 + %.pl = perl script 1.476 + %.sh = shell script 1.477 + 1.478 + alltags: tool used to recursively 1.479 + create a "ctags"-style 1.480 + file for reference 1.481 + 1.482 + The third section of "rules.mk' primarily contains several JAVA 1.483 + "language" build rules for binary releases. These are also 1.484 + generally "computed" rules (created on the "fly"). 1.485 + 1.486 + The rules which dwell in this section and their purpose: 1.487 + 1.488 + 1.489 + CATEGORY/rule:: Purpose 1.490 + =================== ============================= 1.491 + $(JAVA_DESTPATH):: create directory specified 1.492 + as the Java destination path 1.493 + for where classes are 1.494 + deposited 1.495 + 1.496 + $(JAVA_DESTPATH)/$(PACKAGE):: create directories specified 1.497 + within the $(PACKAGE) 1.498 + variable 1.499 + 1.500 + $(JMCSRCDIR):: create directory specified 1.501 + as the JMC destination path 1.502 + 1.503 + $(JRI_HEADER_CFILES): used to generate/regenerate 1.504 + JRI header files for "C" 1.505 + 1.506 + $(JRI_STUB_CFILES): used to generate/regenerate 1.507 + JRI stub files for "C" 1.508 + 1.509 + $(JNI_HEADERS): used to generate/regenerate 1.510 + JNI header files for "C" 1.511 + 1.512 + The fourth section of "rules.mk" primarily contains miscellaneous 1.513 + build rules for binary releases. Many of these rules are here to 1.514 + create new subdirectories, manage dependencies, and/or override 1.515 + standard gmake "Makefile" rules. 1.516 + 1.517 + The rules which dwell in this section and their purpose: 1.518 + 1.519 + 1.520 + CATEGORY/rule:: Purpose 1.521 + =================== ============================= 1.522 + 1.523 + $(PUBLIC_EXPORT_DIR):: create directory used to 1.524 + house public "C" header files 1.525 + 1.526 + $(PRIVATE_EXPORT_DIR):: create directory used to 1.527 + house private "C" header 1.528 + files 1.529 + 1.530 + $(SOURCE_XP_DIR)/ 1.531 + release/include:: create directory used to 1.532 + house "C" header files 1.533 + contained in a release 1.534 + 1.535 + $(MKDEPENDENCIES):: for UNIX systems, create 1.536 + a directory used to house 1.537 + dependencies and utilize 1.538 + the $(MKDEPEND) rule to 1.539 + create them 1.540 + 1.541 + $(MKDEPEND):: cd to the dependency 1.542 + directory and create them 1.543 + 1.544 + depend:: if $(OBJS) exist, perform the 1.545 + $(MKDEPEND) rule followed by 1.546 + the $(MKDEPENDENCIES) rule 1.547 + 1.548 + dependclean:: remove all files contained 1.549 + in the dependency repository 1.550 + 1.551 + .DEFAULT: standard gmake rule 1.552 + 1.553 + .SUFFIXES: standard gmake rule 1.554 + 1.555 + .PRECIOUS: standard gmake rule 1.556 + 1.557 + .PHONY: standard gmake rule 1.558 +