make/common/Library.gmk

Sun, 21 Jun 2009 23:50:28 -0700

author
tbell
date
Sun, 21 Jun 2009 23:50:28 -0700
changeset 85
65b66117dbd7
parent 1
55540e827aef
child 88
ffb590b42ed1
permissions
-rw-r--r--

Merge

     1 #
     2 # Copyright 1995-2007 Sun Microsystems, Inc.  All Rights Reserved.
     3 # DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
     4 #
     5 # This code is free software; you can redistribute it and/or modify it
     6 # under the terms of the GNU General Public License version 2 only, as
     7 # published by the Free Software Foundation.  Sun designates this
     8 # particular file as subject to the "Classpath" exception as provided
     9 # by Sun in the LICENSE file that accompanied this code.
    10 #
    11 # This code is distributed in the hope that it will be useful, but WITHOUT
    12 # ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
    13 # FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
    14 # version 2 for more details (a copy is included in the LICENSE file that
    15 # accompanied this code).
    16 #
    17 # You should have received a copy of the GNU General Public License version
    18 # 2 along with this work; if not, write to the Free Software Foundation,
    19 # Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
    20 #
    21 # Please contact Sun Microsystems, Inc., 4150 Network Circle, Santa Clara,
    22 # CA 95054 USA or visit www.sun.com if you need additional information or
    23 # have any questions.
    24 #
    26 #
    27 # Generic makefile for building shared libraries.
    28 #
    30 include $(TOPDIR)/make/common/Classes.gmk
    32 #
    33 # It is important to define these *after* including Classes.gmk
    34 # in order to override the values defined inthat makefile.
    35 #
    37 ACTUAL_LIBRARY_NAME = $(LIB_PREFIX)$(LIBRARY).$(LIBRARY_SUFFIX)
    38 ACTUAL_LIBRARY_DIR = $(LIB_LOCATION)
    39 ACTUAL_LIBRARY = $(ACTUAL_LIBRARY_DIR)/$(ACTUAL_LIBRARY_NAME)
    41 library:: $(ACTUAL_LIBRARY)
    43 FILES_o   = $(patsubst %.c,   %.$(OBJECT_SUFFIX), $(addprefix $(OBJDIR)/, $(notdir $(FILES_c))))
    44 FILES_o  += $(patsubst %.s,   %.$(OBJECT_SUFFIX), $(addprefix $(OBJDIR)/, $(notdir $(FILES_s))))
    45 FILES_o  += $(patsubst %.cpp, %.$(OBJECT_SUFFIX), $(addprefix $(OBJDIR)/, $(notdir $(FILES_cpp))))
    47 ifeq ($(INCREMENTAL_BUILD),true)
    48 FILES_d   = $(patsubst %.c,   %.$(DEPEND_SUFFIX), $(addprefix $(OBJDIR)/, $(notdir $(FILES_c))))
    49 FILES_d  += $(patsubst %.cpp, %.$(DEPEND_SUFFIX), $(addprefix $(OBJDIR)/, $(notdir $(FILES_cpp))))
    50 endif # INCREMENTAL_BUILD
    52 ifeq ($(PLATFORM),solaris)
    53 # List of all lint files, one for each .c file (only for C)
    54 FILES_ln   = $(patsubst %.c,   %.$(LINT_SUFFIX), $(addprefix $(OBJDIR)/, $(notdir $(FILES_c))))
    55 endif
    57 #
    58 # C++ libraries must be linked with CC.
    59 #
    60 ifdef CPLUSPLUSLIBRARY
    61 LINKER=$(LINK.cc)
    62 else
    63 LINKER=$(LINK.c)
    64 endif
    66 # We either need to import (copy) libraries in, or build them
    67 $(ACTUAL_LIBRARY):: $(INIT) $(TEMPDIR) $(LIBDIR) $(BINDIR) $(EXTDIR) classheaders
    69 #
    70 # COMPILE_APPROACH: Different approaches to compile up the native object
    71 #   files as quickly as possible.
    72 #   The setting of parallel works best on Unix, batch on Windows.
    73 #
    75 COMPILE_FILES_o = $(OBJDIR)/.files_compiled
    76 $(COMPILE_FILES_o): $(FILES_d) $(FILES_o)
    77 	@$(ECHO) "$<" >> $@
    78 clean::
    79 	$(RM) $(COMPILE_FILES_o)
    81 #
    82 # COMPILE_APPROACH=parallel: Will trigger compilations (just compilations) to
    83 #   happen in parallel. Greatly decreases Unix build time, even on single CPU
    84 #   machines, more so on multiple CPU machines. Default is 2 compiles
    85 #   at a time, but can be adjusted with ALT_PARALLEL_COMPILE_JOBS.
    86 #   Note that each .d file will also be dependent on it's .o file, see
    87 #   Rules.gmk.
    88 #   Note this does not depend on Rules.gmk to work like batch (below)
    89 #   and this technique doesn't seem to help Windows build time nor does
    90 #   it work very well, it's possible the Windows Visual Studio compilers
    91 #   don't work well in a parallel situation, this needs investigation.
    92 #
    94 ifeq ($(COMPILE_APPROACH),parallel)
    96 .PHONY: library_parallel_compile
    98 library_parallel_compile:
    99 	@$(ECHO) "Begin parallel compiles: $(shell $(PWD))"
   100 	@$(MAKE) -j $(PARALLEL_COMPILE_JOBS) $(COMPILE_FILES_o)
   101 	@$(ECHO) "Done with parallel compiles: $(shell $(PWD))"
   103 $(ACTUAL_LIBRARY):: library_parallel_compile
   105 endif
   107 #
   108 # COMPILE_APPROACH=batch: Will trigger compilations (just compilations) to
   109 #   happen in batch mode. Greatly decreases Windows build time.
   110 #   See logic in Rules.gmk for how compiles happen, the $(MAKE) in
   111 #   library_batch_compile below triggers the actions in Rules.gmk.
   112 #   Note that each .d file will also be dependent on it's .o file, see
   113 #   Rules.gmk.
   114 #
   115 ifeq ($(COMPILE_APPROACH),batch)
   117 .PHONY: library_batch_compile
   119 library_batch_compile:
   120 	@$(ECHO) "Begin BATCH compiles: $(shell $(PWD))"
   121 	$(MAKE) $(COMPILE_FILES_o)
   122 	$(MAKE) batch_compile
   123 	@$(ECHO) "Done with BATCH compiles: $(shell $(PWD))"
   124 	$(MAKE) COMPILE_APPROACH=normal $(COMPILE_FILES_o)
   126 $(ACTUAL_LIBRARY):: library_batch_compile
   128 endif
   130 ifeq ($(PLATFORM), windows)
   132 #
   133 # Library building rules.
   134 #
   136 $(LIBRARY).lib:: $(OBJDIR)
   138 # build it into $(OBJDIR) so that the other generated files get put 
   139 # there, then copy just the DLL (and MAP file) to the requested directory.
   140 #
   141 $(ACTUAL_LIBRARY):: $(OBJDIR)/$(LIBRARY).lcf
   142 	@$(prep-target)
   143 	@$(MKDIR) -p $(OBJDIR)
   144 	$(LINK) -dll -out:$(OBJDIR)/$(@F) \
   145 	  -map:$(OBJDIR)/$(LIBRARY).map \
   146 	  $(LFLAGS) @$(OBJDIR)/$(LIBRARY).lcf \
   147 	  $(OTHER_LCF) $(JAVALIB) $(LDLIBS)
   148 	$(CP) $(OBJDIR)/$(@F) $@
   149 	$(CP) $(OBJDIR)/$(LIBRARY).map $(@D)
   150 	$(CP) $(OBJDIR)/$(LIBRARY).pdb $(@D)
   152 $(OBJDIR)/$(LIBRARY).lcf: $(OBJDIR)/$(LIBRARY).res $(COMPILE_FILES_o) $(FILES_m)
   153 	@$(prep-target)
   154 	@$(MKDIR) -p $(TEMPDIR)
   155 	@$(ECHO) $(FILES_o) > $@ 
   156 ifndef LOCAL_RESOURCE_FILE
   157 	@$(ECHO) $(OBJDIR)/$(LIBRARY).res >> $@
   158 endif
   159 	@$(ECHO) Created $@ 
   161 RC_FLAGS += /D "J2SE_FNAME=$(LIBRARY).dll" \
   162             /D "J2SE_INTERNAL_NAME=$(LIBRARY)" \
   163             /D "J2SE_FTYPE=0x2L"
   165 $(OBJDIR)/$(LIBRARY).res: $(VERSIONINFO_RESOURCE)
   166 ifndef LOCAL_RESOURCE_FILE
   167 	@$(prep-target)
   168 	$(RC) $(RC_FLAGS) $(CC_OBJECT_OUTPUT_FLAG)$(@) $(VERSIONINFO_RESOURCE)
   169 endif
   171 #
   172 # Install a .lib file if required.
   173 #
   174 ifeq ($(INSTALL_DOT_LIB), true)
   175 $(ACTUAL_LIBRARY):: $(LIBDIR)/$(LIBRARY).lib
   177 clean:: 
   178 	-$(RM) $(LIBDIR)/$(LIBRARY).lib
   180 $(LIBDIR)/$(LIBRARY).lib:: $(OBJDIR)/$(LIBRARY).lib
   181 	$(install-file)
   183 $(LIBDIR)/$(LIBRARY).dll:: $(OBJDIR)/$(LIBRARY).dll
   184 	$(install-file)
   186 endif # INSTALL_DOT_LIB
   188 else # PLATFORM
   190 #
   191 # On Solaris, use mcs to write the version into the comment section of
   192 # the shared library.  On other platforms set this to false at the
   193 # make command line.
   194 #
   195 $(ACTUAL_LIBRARY):: $(COMPILE_FILES_o) $(FILES_m) $(FILES_reorder)
   196 	@$(prep-target)
   197 	@$(ECHO) "STATS: LIBRARY=$(LIBRARY), PRODUCT=$(PRODUCT), _OPT=$(_OPT)"
   198 	@$(ECHO) "Rebuilding $@ because of $?"
   199 	$(LINKER) $(SHARED_LIBRARY_FLAG) -o $@ $(FILES_o) $(LDLIBS)
   200 ifeq ($(WRITE_LIBVERSION),true)
   201 	$(MCS) -d -a "$(FULL_VERSION)" $@
   202 endif # WRITE_LIBVERSION
   204 endif # PLATFORM
   206 #
   207 # Cross check all linted files against each other
   208 #
   209 ifeq ($(PLATFORM),solaris)
   210 lint.errors : $(FILES_ln)
   211 	$(LINT.c) $(FILES_ln) $(LDLIBS) 
   212 endif
   214 #
   215 # Class libraries with JNI native methods get a include to the package.
   216 #
   217 ifdef PACKAGE
   218 vpath %.c $(PLATFORM_SRC)/native/$(PKGDIR)
   219 vpath %.c $(SHARE_SRC)/native/$(PKGDIR)
   220 OTHER_INCLUDES += -I$(SHARE_SRC)/native/common -I$(PLATFORM_SRC)/native/common
   221 OTHER_INCLUDES += -I$(SHARE_SRC)/native/$(PKGDIR) \
   222 		  -I$(PLATFORM_SRC)/native/$(PKGDIR)
   223 endif
   225 #
   226 # Clean/clobber rules
   227 #
   228 clean::
   229 	$(RM) -r $(ACTUAL_LIBRARY)
   231 clobber:: clean
   233 #
   234 # INCREMENTAL_BUILD means that this workspace will be built over and over
   235 #   possibly incrementally. This means tracking the object file dependencies
   236 #   on include files so that sources get re-compiled when the include files
   237 #   change. When building from scratch and doing a one time build (like
   238 #   release engineering or nightly builds) set INCREMENTAL_BUILD=false.
   239 #
   241 ifeq ($(INCREMENTAL_BUILD),true)
   243 #
   244 # Workaround: gnumake sometimes says files is empty when it shouldn't
   245 #    was:  files := $(foreach file, $(wildcard $(OBJDIR)/*.$(DEPEND_SUFFIX)), $(file))
   246 #
   247 files := $(shell $(LS) $(OBJDIR)/*.$(DEPEND_SUFFIX) 2>/dev/null)
   249 #
   250 # Only include these files if we have any.
   251 #
   252 ifneq ($(strip $(files)),)
   254 include $(files)
   256 endif # files
   258 endif # INCREMENTAL_BUILD
   260 #
   261 # Default dependencies
   262 #
   264 all: build
   266 build: library
   268 debug:
   269 	$(MAKE) VARIANT=DBG build
   271 fastdebug:
   272 	$(MAKE) VARIANT=DBG FASTDEBUG=true build
   274 .PHONY: all build debug fastdebug

mercurial