Skip to content
forked from servo/nss

Network Security Services - UNMAINTAINED - DO NOT USE

License

Notifications You must be signed in to change notification settings

onebeer4eachand/nss

 
 

Folders and files

NameName
Last commit message
Last commit date

Latest commit

 

History

14 Commits
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 

Repository files navigation

nss

Network Security Services - UNMAINTAINED - DO NOT USE This README file is an attempt to provide the reader with a simple synopsis of the "ns/coreconf" build system which was originally fundamentally designed and built to accomodate Netscape's binary release model. Wherever possible, an attempt has been made to comply with the NSPR 2.0 build system, including mimicing the compiler/linker flags, and directory naming structure. The reader should keep in mind that the system builds binary releases of header files, class files, libraries, and executables on numerous flavors of UNIX and Windows operating systems. Unfortunately, no serious attempt has ever been made to incorporate an ability to generate cross-platform binaries on an Apple MacIntosh platform.

Note that this file will not attempt to redefine or document the
architecture of this system.  However, documents on this subject
are available at the following URL:

    http://warp/hardcore/prj-ttools/specs/release/index.html

DEPENDENCIES of "ns/coreconf":

The "ns/coreconf" build system requires the specified versions of
the following platform-dependent tools:

    UNIX Platforms:
    --------------
    gmake (version 3.74 or later)
    perl 4.0 (NOTE:  perl 5.003 or later recommended)
    uname

    Windows Platforms:
    -----------------
    gmake 3.74 (must use hacked Netscape version)
    shmsdos.exe (contained in Netscape gmake.exe)
    nsinstall.exe (contained in Netscape gmake.exe)
    perl.exe (version 4.0 for everything except testing;
              NOTE:  MKS toolkit perl 5.002 is broken)
    perl5.exe (for testing;
               NOTE:  perl 5.003 or later recommended;
                      MKS toolkit perl 5.002 is broken)
    uname.exe (use nstools version)

ENHANCEMENTS to "ns/coreconf":

With the advent of Certificate Server 4.0 using the ns/coreconf
build system, several changes had to be made to enhance
ns/coreconf support for building Java/JNI classes/programs, as
well as libraries slated to be released as binaries.  While the
following may not represent an exhaustive list of these changes,
it does attempt to be at least somewhat comprehensive:

    (1) During the course of these enhancements, a total of
        four files have been modified, and four new files have
        been added.

        The following files have been modified:

            - command.mk:    removed old definition of JAR

            - config.mk:     added include statement of new
                             "jdk.mk" file

            - ruleset.mk:    allowed the $(MKPROG) variable to be
                             overridden by supplying it with a
                             default value of $(CC); augmented
                             numerous definitions to enhance
                             ability of ns/coreconf to produce
                             a more robust set of libraries;
                             added some JNI definitions; PACKAGE
                             definition may be overridden by new
                             "jdk.mk" file

            - rules.mk:      separated the compile phase of a
                             program from the link phase of a
                             program such that a developer can
                             now strictly override program linkage
                             by simply supplying a $(MKPROG)
                             variable; augmented NETLIBDEPTH
                             to use CORE_DEPTH but retain backward
                             compatibility; added JNI section;
                             modified .PRECIOUS rule;

        The following files have been added:

            - README:        this file; an ASCII-based text
                             document used to summarize the
                             ns/coreconf build system and
                             suitable (paginated) for printing

            - jdk.mk:        a file comprising most (if not all)
                             of the default Java related build
                             information; the definitions in this
                             file are only included if NS_USE_JDK
                             has been defined

            - jniregen.pl:   a perl script used to create a
                             dependency for when JNI files should
                             be regenerated (based upon any change
                             to the ".class" file from which the
                             ".h" file was originally generated)

            - outofdate.pl:  a perl script used to create a
                             dependency for when ".class" files
                             should be regenerated (based upon
                             any change to the ".java" file
                             from which the ".class" file was
                             originally generated)

(2) As stated above, the ns/coreconf build system now separates the link phase of a program from its compilation phase. While ns/coreconf still works exactly as it used to because the $(MKPROG) variable is assigned $(CC) by default, a developer may now override this behavior by simply supplying their own unique value for $(MKPROG) on every platform. This allows a program compiled with $(CC) to link with external libraries that may contain "C++" linkage. Before this change, a programmer would need to reference their own local copy of rules.mk (see the ns/sectools/cmd/pk12util program for an example of how this used to be accomplished).

    (3) Currently, the ns/coreconf build system differs from the
        NSPR 2.0 build system which utilizes an "_s" to denote
        static libraries from import libraries.  In fact, the
        ns/coreconf build system adds no prefixes or suffixes to
        distinguish one version of static libraries from another.
        Note that both the ns/coreconf build system as well as the
        NSPR 2.0 build system do nothing to provide a method of
        distinguishing 16-bit from 32-bit static libraries on the
        same machine, either, since:

            a) this might only provide difficulty during
               development, since static libraries always
               need to be embedded within a program
               (note this is highly unlikely, since libraries
                for different platforms are subdivided via
                a well-known subdirectory structure, and
                a developer may use multiple trees for
                development),

            b) this maintains backwards compatibility,
               something very important since no legacy
               programs will need to change their link phase, and

            c) Netscape as a company has dropped any plans
               of future development of 16-bit products.

    (4) Since several members of the Hardcore Security group did
        not favor NSPR 2.0's solution of adding an "_s" to static
        libraries on Windows platforms as a method to distinguish
        them from their import library cousins, a different solution
        was proposed and has been recently implemented for ns/coreconf:

            - a 16 has been added as a suffix to both dynamic and
              import libraries built on 16-bit Windows platforms

            - a 32 has been added as a suffix to both dynamic and
              import libraries built on 32-bit Windows platforms

        Since, the HCL release process currently only contains a
        single instance of building a dynamic library,
        ns/security/lib/fortcrypt/fort12.dll, the impact of this
        change should be relatively small.

        It should be noted that although this would additionally
        limit the 8.3 namespace on 16-bit platforms, it is highly
        unlikely that any future development will be performed on
        this platform.

(5) The $(LIBRARY_VERSION) tag has been added to all non-static libraries created on UNIX operating systems to alleviate any future confusion for binary releases which utilize this tag. Again, it should be noted that this tag is only utilized on non-static libraries, since more than one version of the library may need to exist simultaneously if multiple products are utilized.

        Currently, only one HCL released library utilizes this tag:

            ns/security/lib/fortcrypt/fort12.a
            (e. g. - in this library, the tag has been set to '12')

        Again, it should be noted that although this would
        additionally limit the 8.3 namespace on 16-bit platforms,
        it is highly unlikely that any future development will be
        performed on this platform.

    (6) The $(JDK_DEBUG_SUFFIX) extension has been added to all
        library and program names to support debug versions of
        Java programs (e. g. - java_g, javac_g, etc).

        Once again, it should be noted that although this would
        additionally limit the 8.3 namespace on 16-bit platforms,
        it is highly unlikely that any future Java development
        will be performed on this platform.

    (7) Most (if not all) default definitions for java have been
        encapsulated within their own file, jdk.mk, which is
        always included by default in ns/coreconf/config.mk.
        However, the definitions within this file are only ever
        activated if NS_USE_JDK has been set to be 1.


    (8) Two perl scripts (jniregen.pl and outofdate.pl) have been
        added to the system to foster a more robust development
        environment for composing Java and JNI programs
        utilizing the ns/coreconf build system.  Both of these
        perl scripts are related to resolving dependencies which
        can not be accomplished through normal makefile dependencies.

    (9) This file, README, was created in an attempt to allow
        developers who have familiarity with ns/coreconf a simple
        roadmap for what has changed, as well as a top-level view of
        what comprises ns/coreconf.  This file was written in
        ASCII (rather than HTML) primarily to promote simple
        paginated printing.

OVERVIEW of "config.mk":

This file contains the configuration information necessary to
build each "Core Components" source module:

    include file name       Purpose
    ===================     =======================================
    arch.mk                 source and release <architecture> tags

    command.mk              default command macros 
			(NOTE: may be overridden in $(OS_CONFIG).mk)

    $(OS_CONFIG).mk         <architecture>-specific macros
                            (dependent upon <architecture> tags)

    tree.mk                 release <tree> tags 
			(dependent upon <architecture> tags)

    module.mk               source and release <component> tags 
			(NOTE:  A component is also called a module 
			or a subsystem.  This file is dependent upon
                            $(MODULE) being defined on the command
                            line, as an environment variable, or in
                            individual makefiles, or more
                            appropriately, manifest.mn)

    version.mk              release <version> tags 
			(dependent upon $(MODULE) being defined on 
			the command line, as an environment variable, 
			or in individual makefiles, or more
                            appropriately, manifest.mn)

    location.mk             macros to figure out binary code location
                            (dependent upon <platform> tags)

    source.mk               <component>-specific source path
                            (dependent upon <user_source_tree>,
                            <source_component>, <version>, and
                            <platform> tags)

    headers.mk              include switch for support header files 
			(dependent upon <tree>, <component>, <version>,
                            and <platform> tags)

    prefix.mk               compute program prefixes

    suffix.mk               compute program suffixes 
			(dependent upon <architecture> tags)

jdk.mk define JDK (dependent upon , , and tags)

    ruleset.mk              Master "Core Components" rule set
                            (should always be the last file
                            included by config.mk)

OVERVIEW of "rules.mk":

The "rules.mk" file consists of four sections.  The first section
contains the "master" build rules for all binary releases.  While
this section can (and should) largely be thought of as "language"
independent, it does utilize the "perl" scripting language to
perform both the "import" and "release" of binary modules.

The rules which dwell in this section and their purpose:


    CATEGORY/rule::         Purpose
    ===================     =======================================

    GENERAL
    -------
    all::                   "default" all-encompassing rule which
                            performs "export libs program install"

    export::                recursively copy specified
                            cross-platform header files to the
                            $(SOURCE_XPHEADERS_DIR) directory;
                            recursively copy specified
                            machine-dependent header files to the
                            $(SOURCE_MDHEADERS_DIR) directory;
                            although all rules can be written to
                            repetively "chain" into other sections,
                            this rule is the most commonly used
                            rule to "chain" into other sections
                            such as Java providing a simple
                            mechanism which allows no need for
                            developers to memorize specialized
                            rules

    libs::                  recursively build
                            static (archival) $(LIBRARY), shared
                            (dynamic link) $(SHARED_LIBRARY),
                            and/or import $(IMPORT_LIBRARY)
                            libraries

    program::               recursively build $(PROGRAM)
                            executable

    install::               recursively copy all libraries to
                            $(SOURCE_LIB_DIR) directory;
                            recursively copy all executables to
                            $(SOURCE_BIN_DIR) directory

    clean::                 remove all files specified in the
                            $(ALL_TRASH) variable

    clobber::               synonym for "clean::" rule

realclean:: remove all files specified by $(wildcard *.OBJ), dist, and in the $(ALL_TRASH) variable

    clobber_all::           synonym for "realclean::" rule

    private_export::        recursively copy specified
                            cross-platform header files to the
                            $(SOURCE_XPPRIVATE_DIR) directory


    IMPORT
    ------
    import::                uses perl script to retrieve specified
                            VERSION of the binary release from
                            $(RELEASE_TREE)

    RELEASE
    -------
    release_clean::         remove all files from the
                            $(SOURCE_RELEASE_PREFIX) directory

    release::               place specified VERSION of the
                            binary release in the appropriate
                            $(RELEASE_TREE) directory

    release_export::        recursively copy specified
                            cross-platform header files to the
                            $(SOURCE_XPHEADERS_DIR)/include
                            directory

    release_md::            recursively copy all libraries to
                            $(SOURCE_RELEASE_PREFIX)/
                            $(SOURCE_RELEASE_LIB_DIR) directory;
                            recursively copy all executables to
                            $(SOURCE_RELEASE_PREFIX)/
                            $(SOURCE_RELEASE_BIN_DIR) directory

    release_jars::          use perl script to package appropriate
                            files in the $(XPCLASS_JAR),
                            $(XPHEADER_JAR), $(MDHEADER_JAR), and
                            $(MDBINARY_JAR) jar files

    release_cpdistdir::     use perl script to copy the
                            $(XPCLASS_JAR), $(XPHEADER_JAR),
                            $(MDHEADER_JAR), and $(MDBINARY_JAR)
                            jar files to the specified VERSION
                            of the $(RELEASE_TREE) directory



    TOOLS and AUTOMATION
    --------------------
    platform::              tool used to display the platform name
                            as composed within the "arch.mk" file

    autobuild::             automation rule used by "Bonsai" and
                            "Tinderbox" to automatically generate
                            binary releases on various platforms

    tests::                 automation tool used to run the
                            "regress" and "reporter" tools 
                            on various regression test suites

The second section of "rules.mk" primarily contains several "language" dependent build rules for binary releases. These are generally "computed" rules (created on the "fly"), and include rules used by "C", "C++", assembly, the preprocessor, perl, and the shell.

The rules which dwell in this section and their purpose:


    CATEGORY/rule::                   Purpose
    ===================               =============================

    LIBRARIES
    ---------
    $(LIBRARY):                       build the static library
                                      specified by the $(LIBRARY)
                                      variable

    $(IMPORT_LIBRARY):                build the import library
                                      specified by the
                                      $(IMPORT_LIBRARY) variable

    $(SHARED_LIBRARY):                build the shared
                                      (dynamic link) library
                                      specified by the
                                      $(SHARED_LIBRARY) variable


    PROGRAMS
    --------
    $(PROGRAM):                       build the binary executable
                                      specified by the $(PROGRAM)
                                      rule

    $(OBJDIR)/
    $(PROG_PREFIX)%.pure:             build the "purified" binary
                                      executable specified by this
                                      rule


    OBJECTS
    -------
    $(OBJDIR)/
    $(PROG_PREFIX)%$(OBJ_SUFFIX):     build the object file
                                      associated with the
                                      makefile rule dependency:

                                          %.c   = C file
                                          %.cpp = C++ file
                                          %.cc  = C++ file
                                          %.s   = assembly file
                                          %.S   = assembly file

    $(OBJDIR)/
    $(PROG_PREFIX)%:                  (NOTE: deprecated rule)
                                      build the object file
                                      associated with the
                                      makefile rule dependency:

                                          %.cpp = C++ file

MISCELLANEOUS ------------- $(DIRS):: specifies a helper method used by $(LOOP_THROUGH_DIRS) to recursively change directories and invoke $(MAKE)

    %.i:                              build the preprocessor file
                                      associated with the
                                      makefile rule dependency:

                                          %.c   = C file
                                          %.cpp = C++ file

    %:                                process the specified file
                                      using the method associated
                                      with the makefile rule
                                      dependency:

                                          %.pl = perl script
                                          %.sh = shell script

    alltags:                          tool used to recursively
                                      create a "ctags"-style
                                      file for reference

The third section of "rules.mk' primarily contains several JAVA
"language" build rules for binary releases.  These are also
generally "computed" rules (created on the "fly").

The rules which dwell in this section and their purpose:


    CATEGORY/rule::                   Purpose
    ===================               =============================
    $(JAVA_DESTPATH)::                create directory specified
                                      as the Java destination path
                                      for where classes are
                                      deposited

    $(JAVA_DESTPATH)/$(PACKAGE)::     create directories specified
                                      within the $(PACKAGE)
                                      variable

    $(JMCSRCDIR)::                    create directory specified
                                      as the JMC destination path

    $(JRI_HEADER_CFILES):             used to generate/regenerate
                                      JRI header files for "C"

    $(JRI_STUB_CFILES):               used to generate/regenerate
                                      JRI stub files for "C"

    $(JNI_HEADERS):                   used to generate/regenerate
                                      JNI header files for "C"

The fourth section of "rules.mk" primarily contains miscellaneous build rules for binary releases. Many of these rules are here to create new subdirectories, manage dependencies, and/or override standard gmake "Makefile" rules.

The rules which dwell in this section and their purpose:


    CATEGORY/rule::                   Purpose
    ===================               =============================

    $(PUBLIC_EXPORT_DIR)::            create directory used to
                                      house public "C" header files

    $(PRIVATE_EXPORT_DIR)::           create directory used to
                                      house private "C" header
                                      files

    $(SOURCE_XP_DIR)/
    release/include::                 create directory used to
                                      house "C" header files
                                      contained in a release

    $(MKDEPENDENCIES)::               for UNIX systems, create
                                      a directory used to house
                                      dependencies and utilize
                                      the $(MKDEPEND) rule to
                                      create them

    $(MKDEPEND)::                     cd to the dependency
                                      directory and create them

    depend::                          if $(OBJS) exist, perform the
                                      $(MKDEPEND) rule followed by
                                      the $(MKDEPENDENCIES) rule

    dependclean::                     remove all files contained
                                      in the dependency repository

    .DEFAULT:                         standard gmake rule

    .SUFFIXES:                        standard gmake rule

    .PRECIOUS:                        standard gmake rule

    .PHONY:                           standard gmake rule

About

Network Security Services - UNMAINTAINED - DO NOT USE

Resources

License

Stars

Watchers

Forks

Releases

No releases published

Packages

No packages published

Languages

  • C 87.8%
  • Assembly 5.3%
  • Shell 3.0%
  • Makefile 2.0%
  • C++ 0.9%
  • HTML 0.4%
  • Other 0.6%