make-rules/shared-macros.mk
changeset 5682 94c0ca64c022
parent 5678 5b527c1e97be
child 5751 30cf2c0cfebc
--- a/make-rules/shared-macros.mk	Wed Mar 30 10:16:56 2016 -0700
+++ b/make-rules/shared-macros.mk	Wed Mar 30 13:33:31 2016 -0700
@@ -18,6 +18,8 @@
 #
 # CDDL HEADER END
 #
+
+#
 # Copyright (c) 2010, 2016, Oracle and/or its affiliates. All rights reserved.
 #
 
@@ -123,13 +125,45 @@
 include $(WS_MAKE_RULES)/ips-buildinfo.mk
 
 COMPILER ?=		studio
-BITS ?=			32
 
 # The values of BITS changes during the build process for components that
 # are built 32-bit and 64-bit.  This macro makes it possible to determine
 # which components are only built 64-bit and allow other make-rules files
-# to adjust accordingly.
-INITIAL_BITS=		$(BITS)
+# to adjust accordingly.  Possible values are: '32', '64', '32_and_64',
+# '64_and_32', and 'NO_ARCH' (the orderings specify build preference).
+BUILD_BITS ?=$(BITS)
+ifeq ($(strip $(BUILD_BITS)),64)
+BITS ?=			64
+else
+BITS ?=			32
+endif
+
+# Based on BUILD_BITS, determine which binaries are preferred for a build.
+# This macro is for the convenience of other make-rules files and should not be
+# overridden by developers.
+ifeq ($(strip $(BUILD_BITS)),64)
+PREFERRED_BITS=64
+endif
+ifeq ($(strip $(BUILD_BITS)),64_and_32)
+PREFERRED_BITS=64
+endif
+PREFERRED_BITS ?= 32
+
+# Map target build to macro/variable naming conventions.  This macro is for the
+# convenience of other make-rules files and should not be overridden by
+# developers.
+ifeq ($(BUILD_BITS),64_and_32)
+MK_BITS=32_and_64
+else
+MK_BITS=$(strip $(BUILD_BITS))
+endif
+
+# Do not assume a default build style for compatibility with older component
+# Makefiles.  If explicitly set, common.mk will automatically include relevant
+# make-rules files.  Possible values are: 'ant', 'archive', 'attpackagemake',
+# 'cmake', 'configure', 'gnu-component', 'justmake', 'pkg', and 'setup.py'. See
+# corresponding file in make-rules for details.
+# BUILD_STYLE=
 
 # The default version should go last.
 PYTHON_VERSION =	2.7
@@ -146,6 +180,10 @@
 PKG_REPO =	file:$(WS_REPO)
 
 COMPONENT_SRC_NAME =	$(COMPONENT_NAME)
+COMPONENT_SRC=		$(COMPONENT_SRC_NAME)-$(COMPONENT_VERSION)
+COMPONENT_ARCHIVE=	$(COMPONENT_SRC).tar.gz
+# Assume a component is categorized as a utility by default.
+COMPONENT_BUGDB=	utility/$(COMPONENT_NAME)
 
 COMPONENT_DIR :=	$(shell pwd)
 SOURCE_DIR =	$(COMPONENT_DIR)/$(COMPONENT_SRC)
@@ -154,6 +192,7 @@
 
 ETCDIR =	/etc
 USRDIR =	/usr
+USRGNUDIR =	$(USRDIR)/gnu
 BINDIR =	/bin
 SBINDIR =	/sbin
 LIBDIR =	/lib
@@ -175,60 +214,46 @@
 USRSHAREMAN3DIR =	$(USRSHAREMANDIR)/man3
 USRSHAREMAN4DIR =	$(USRSHAREMANDIR)/man4
 USRSHAREMAN5DIR =	$(USRSHAREMANDIR)/man5
+USRSHAREMAN8DIR =	$(USRSHAREMANDIR)/man8
 USRLIBDIR64 =	$(USRDIR)/lib/$(MACH64)
-PROTOBINDIR =	$(PROTO_DIR)/$(BINDIR)
-PROTOETCDIR =	$(PROTO_DIR)/$(ETCDIR)
-PROTOETCSECDIR = $(PROTO_DIR)/$(ETCDIR)/security
-PROTOUSRDIR =	$(PROTO_DIR)/$(USRDIR)
-PROTOLIBDIR =	$(PROTO_DIR)/$(LIBDIR)
+PROTOBINDIR =	$(PROTO_DIR)$(BINDIR)
+PROTOETCDIR =	$(PROTO_DIR)$(ETCDIR)
+PROTOETCSECDIR = $(PROTO_DIR)$(ETCDIR)/security
+PROTOUSRDIR =	$(PROTO_DIR)$(USRDIR)
+PROTOLIBDIR =	$(PROTO_DIR)$(LIBDIR)
 PROTOSVCMANIFESTDIR =	$(PROTOLIBDIR)/svc/manifest
 PROTOSVCMETHODDIR =	$(PROTOLIBDIR)/svc/method
-PROTOUSRBINDIR =	$(PROTO_DIR)/$(USRBINDIR)
-PROTOUSRBINDIR64 =	$(PROTO_DIR)/$(USRBINDIR64)
-PROTOUSRSBINDIR =	$(PROTO_DIR)/$(USRSBINDIR)
-PROTOUSRLIBDIR =	$(PROTO_DIR)/$(USRLIBDIR)
-PROTOUSRLIBDIR64 =	$(PROTO_DIR)/$(USRLIBDIR64)
+PROTOUSRBINDIR =	$(PROTO_DIR)$(USRBINDIR)
+PROTOUSRBINDIR64 =	$(PROTO_DIR)$(USRBINDIR64)
+PROTOUSRSBINDIR =	$(PROTO_DIR)$(USRSBINDIR)
+PROTOUSRLIBDIR =	$(PROTO_DIR)$(USRLIBDIR)
+PROTOUSRLIBDIR64 =	$(PROTO_DIR)$(USRLIBDIR64)
 PROTOPKGCONFIGDIR = 	$(PROTOUSRLIBDIR)/pkgconfig
 PROTOPKGCONFIGDIR64 =	$(PROTOUSRLIBDIR64)/pkgconfig
-PROTOUSRINCDIR =	$(PROTO_DIR)/$(USRINCDIR)
-PROTOUSRSHAREDIR =	$(PROTO_DIR)/$(USRSHAREDIR)
-PROTOUSRSHARELIBDIR =	$(PROTO_DIR)/$(USRSHARELIBDIR)
-PROTOUSRSHAREDOCDIR =	$(PROTO_DIR)/$(USRSHAREDOCDIR)
+PROTOUSRINCDIR =	$(PROTO_DIR)$(USRINCDIR)
+PROTOUSRSHAREDIR =	$(PROTO_DIR)$(USRSHAREDIR)
+PROTOUSRSHARELIBDIR =	$(PROTO_DIR)$(USRSHARELIBDIR)
+PROTOUSRSHAREDOCDIR =	$(PROTO_DIR)$(USRSHAREDOCDIR)
 PROTOUSRSHAREINFODIR =	$(PROTOUSRSHAREDIR)/info
-PROTOUSRSHAREMANDIR =	$(PROTO_DIR)/$(USRSHAREMANDIR)
-PROTOUSRSHAREMAN1DIR =	$(PROTO_DIR)/$(USRSHAREMAN1DIR)
-PROTOUSRSHAREMAN1MDIR =	$(PROTO_DIR)/$(USRSHAREMAN1MDIR)
-PROTOUSRSHAREMAN3DIR =	$(PROTO_DIR)/$(USRSHAREMAN3DIR)
-PROTOUSRSHAREMAN4DIR =	$(PROTO_DIR)/$(USRSHAREMAN4DIR)
-PROTOUSRSHAREMAN5DIR =	$(PROTO_DIR)/$(USRSHAREMAN5DIR)
-PROTOUSRSHARELOCALEDIR =	$(PROTO_DIR)/$(USRSHARELOCALEDIR)
-
+PROTOUSRSHAREMANDIR =	$(PROTO_DIR)$(USRSHAREMANDIR)
+PROTOUSRSHAREMAN1DIR =	$(PROTO_DIR)$(USRSHAREMAN1DIR)
+PROTOUSRSHAREMAN1MDIR =	$(PROTO_DIR)$(USRSHAREMAN1MDIR)
+PROTOUSRSHAREMAN3DIR =	$(PROTO_DIR)$(USRSHAREMAN3DIR)
+PROTOUSRSHAREMAN4DIR =	$(PROTO_DIR)$(USRSHAREMAN4DIR)
+PROTOUSRSHAREMAN5DIR =	$(PROTO_DIR)$(USRSHAREMAN5DIR)
+PROTOUSRSHAREMAN8DIR =	$(PROTO_DIR)$(USRSHAREMAN8DIR)
+PROTOUSRSHARELOCALEDIR =	$(PROTO_DIR)$(USRSHARELOCALEDIR)
 
-SFWBIN =	/usr/sfw/bin
-SFWINCLUDE =	/usr/sfw/include
-SFWLIB =	/usr/sfw/lib
-SFWLIB64 =	/usr/sfw/lib/$(MACH64)
-SFWSHARE =	/usr/sfw/share
-SFWSHAREMAN =	/usr/sfw/share/man
-SFWSHAREMAN1 =	/usr/sfw/share/man/man1
-PROTOSFWBIN =	$(PROTO_DIR)/$(SFWBIN)
-PROTOSFWLIB =	$(PROTO_DIR)/$(SFWLIB)
-PROTOSFWLIB64 =	$(PROTO_DIR)/$(SFWLIB64)
-PROTOSFWSHARE =	$(PROTO_DIR)/$(SFWSHARE)
-PROTOSFWSHAREMAN =	$(PROTO_DIR)/$(SFWSHAREMAN)
-PROTOSFWSHAREMAN1 =	$(PROTO_DIR)/$(SFWSHAREMAN1)
-PROTOSFWINCLUDE =	$(PROTO_DIR)/$(SFWINCLUDE)
-
-GNUBIN =	/usr/gnu/bin
-GNULIB =	/usr/gnu/lib
-GNULIB64 =	/usr/gnu/lib/$(MACH64)
-GNUSHARE =	/usr/gnu/share
-GNUSHAREMAN =	/usr/gnu/share/man
-GNUSHAREMAN1 =	/usr/gnu/share/man/man1
-PROTOGNUBIN =	$(PROTO_DIR)/$(GNUBIN)
-PROTOGNUSHARE =	$(PROTO_DIR)/$(GNUSHARE)
-PROTOGNUSHAREMAN =	$(PROTO_DIR)/$(GNUSHAREMAN)
-PROTOGNUSHAREMAN1 =	$(PROTO_DIR)/$(GNUSHAREMAN1)
+GNUBIN =	$(USRGNUDIR)/bin
+GNULIB =	$(USRGNUDIR)/lib
+GNULIB64 =	$(USRGNUDIR)/lib/$(MACH64)
+GNUSHARE =	$(USRGNUDIR)/share
+GNUSHAREMAN =	$(USRGNUDIR)/share/man
+GNUSHAREMAN1 =	$(USRGNUDIR)/share/man/man1
+PROTOGNUBIN =	$(PROTO_DIR)$(GNUBIN)
+PROTOGNUSHARE =	$(PROTO_DIR)$(GNUSHARE)
+PROTOGNUSHAREMAN =	$(PROTO_DIR)$(GNUSHAREMAN)
+PROTOGNUSHAREMAN1 =	$(PROTO_DIR)$(GNUSHAREMAN1)
 
 # work around _TIME, _DATE, embedded date chatter in component builds
 # to use, set TIME_CONSTANT in the component Makefile and add $(CONSTANT_TIME)
@@ -583,6 +608,8 @@
 TCLSH =		$(TCLSH.$(TCL_VERSION).$(MACH).$(BITS))
 
 CCSMAKE =	/usr/ccs/bin/make
+DOXYGEN =	/usr/bin/doxygen
+ELFEDIT =	/usr/bin/elfedit
 GMAKE =		/usr/gnu/bin/make
 GPATCH =	/usr/gnu/bin/patch
 PATCH_LEVEL =	1
@@ -615,10 +642,12 @@
 CAT =		/bin/cat
 SYMLINK =	/bin/ln -s
 ENV =		/usr/bin/env
+FIND =		/usr/bin/find
 INSTALL =	/usr/bin/ginstall
 GNU_GREP =	/usr/gnu/bin/grep
 CHMOD =		/usr/bin/chmod
 NAWK =		/usr/bin/nawk
+TAR =		/usr/bin/tar
 TEE =		/usr/bin/tee
 
 INS.dir=        $(INSTALL) -d $@
@@ -831,6 +860,8 @@
 # Add compiler-specific 'default' features
 CFLAGS +=	$(CFLAGS.$(COMPILER))
 CFLAGS +=	$(CFLAGS.$(COMPILER).$(BITS))
+CFLAGS +=	$(CFLAGS.$(COMPILER).$(MACH))
+CFLAGS +=	$(CFLAGS.$(COMPILER).$(MACH).$(BITS))
 
 # Studio C++ requires -norunpath to avoid adding its location into the RUNPATH
 # to C++ applications.
@@ -850,10 +881,6 @@
 # link C++ with the Studio  C++ Runtime and Apache Standard C++ library
 studio_CXXLIB_APACHE =	-library=stdcxx4,Crun
 
-# Add the C++ ABI compatibility flags for older ABI compatibility.  The default
-# is "standard mode" (-compat=5)
-studio_COMPAT_VERSION_4 =	-compat=4
-
 # Tell the compiler that we don't want the studio runpath added to the
 # linker flags.  We never want the Studio location added to the RUNPATH.
 CXXFLAGS +=	$($(COMPILER)_NORUNPATH)
@@ -864,6 +891,11 @@
 # Add compiler-specific 'default' features
 CXXFLAGS +=	$(CXXFLAGS.$(COMPILER))
 CXXFLAGS +=	$(CXXFLAGS.$(COMPILER).$(BITS))
+CXXFLAGS +=	$(CXXFLAGS.$(COMPILER).$(MACH))
+CXXFLAGS +=	$(CXXFLAGS.$(COMPILER).$(MACH).$(BITS))
+
+# Add mach-specific 'default' features
+CXXFLAGS +=	$(CXXFLAGS.$(MACH))
 
 #
 # Solaris linker flag sets to ease feature selection.  Add the required
@@ -874,38 +906,47 @@
 # set the bittedness that we want to link
 LD_BITS =	-$(BITS)
 
+# Note that spaces are not used after the '-z' below so that these macros can
+# be used in arguments to the compiler of the form -Wl,$(LD_Z_*).
+
 # Reduce the symbol table size, effectively conflicting with -g.  We should
 # get linker guidance here.
-LD_Z_REDLOCSYM =	-z redlocsym
+LD_Z_REDLOCSYM =	-zredlocsym
 
 # Cause the linker to rescan archive libraries and resolve remaining unresolved
 # symbols recursively until all symbols are resolved.  Components should be
 # linking in the libraries they need, in the required order.  This should
 # only be required if the component's native build is horribly broken.
-LD_Z_RESCAN_NOW =	-z rescan-now
+LD_Z_RESCAN_NOW =	-zrescan-now
 
-LD_Z_TEXT =		-z text
+LD_Z_TEXT =		-ztext
 
 # make sure that -lc is always present when building shared objects.
 LD_DEF_LIBS +=		-lc
 
 # make sure all symbols are defined.
-LD_Z_DEFS =		-z defs
+LD_Z_DEFS =		-zdefs
 
 # eliminate unreferenced dynamic dependencies
-LD_Z_IGNORE =		-z ignore
+LD_Z_IGNORE =		-zignore
 
 # eliminate comments
-LD_Z_STRIP_CLASS =	-z strip-class=comment
+LD_Z_STRIP_CLASS =	-zstrip-class=comment
 
 # use direct binding
 LD_B_DIRECT =		-Bdirect
 
 # use generic macro names for enabling/disabling ASLR
-ASLR_ENABLE = 		-z aslr=enable
-ASLR_DISABLE = 		-z aslr=disable
-ASLR_NOT_APPLICABLE = 	-z aslr=disable
-ASLR_MODE = 		$(ASLR_DISABLE)
+ASLR_ENABLE = 		-zaslr=enable
+ASLR_DISABLE = 		-zaslr=disable
+ASLR_NOT_APPLICABLE = 	-zaslr=disable
+
+# Disable ASLR by default unless target build is NO_ARCH.
+ifeq ($(strip $(BUILD_BITS)),NO_ARCH)
+ASLR_MODE= $(ASLR_NOT_APPLICABLE)
+else
+ASLR_MODE= $(ASLR_DISABLE)
+endif
 
 # by default, turn off Address Space Layout Randomization for ELF executables;
 # to explicitly enable ASLR, set ASLR_MODE = $(ASLR_ENABLE)
@@ -924,13 +965,14 @@
 LD_MAP_NOEXSTK.sparc =	-M /usr/lib/ld/map.noexstk
 
 # Create a non-executable bss segment when linking.
-LD_MAP_NOEXBSS =	-M /usr/lib/ld/map.noexbss
+LD_MAP_NOEXBSS.i386 =	-M /usr/lib/ld/map.noexbss
+LD_MAP_NOEXBSS.sparc =	-M /usr/lib/ld/map.noexbss
 
 # Create a non-executable data segment when linking.  Due to PLT needs, the
 # data segment must be executable on sparc, but the bss does not.
 # see mapfile comments for more information
 LD_MAP_NOEXDATA.i386 =	-M /usr/lib/ld/map.noexdata
-LD_MAP_NOEXDATA.sparc =	$(LD_MAP_NOEXBSS)
+LD_MAP_NOEXDATA.sparc =	$(LD_MAP_NOEXBSS.$(MACH))
 
 # Page alignment
 LD_MAP_PAGEALIGN =	-M /usr/lib/ld/map.pagealign
@@ -964,7 +1006,7 @@
 COMPONENT_INSTALL_ARGS += $(COMPONENT_INSTALL_ARGS.$(BITS))
 
 # declare these phony so that we avoid filesystem conflicts.
-.PHONY:	prep build install publish test clean clobber parfait
+.PHONY:	prep build install publish test system-test clean clobber parfait
 
 # If there are no tests to execute
 NO_TESTS =	test-nothing
@@ -1024,6 +1066,11 @@
 REQUIRED_PACKAGES += developer/java/jdk-8
 REQUIRED_PACKAGES += security/sudo
 
+# Only a default dependency if component being built produces binaries.
+ifneq ($(strip $(BUILD_BITS)),NO_ARCH)
+REQUIRED_PACKAGES += system/library
+endif
+
 include $(WS_MAKE_RULES)/environment.mk
 
 # A simple rule to print the value of any macro.  Ex: