unix-Makefile.tmpl 33.9 KB
Newer Older
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44
##
## Makefile for OpenSSL
##
## {- join("\n## ", @autowarntext) -}
{-
     sub windowsdll { $config{target} =~ /^(?:Cygwin|mingw)/ }
     sub shlib_ext { $target{shared_extension} || ".so" }
     sub shlib_ext_simple { (my $x = $target{shared_extension})
                                =~ s/\.\$\(SHLIB_MAJOR\)\.\$\(SHLIB_MINOR\)//;
                            $x }
-}
PLATFORM={- $config{target} -}
OPTIONS={- $config{options} -}
CONFIGURE_ARGS=({- join(", ",quotify_l(@{$config{perlargv}})) -})
SRCDIR={- $config{sourcedir} -}
BLDDIR={- $config{builddir} -}

VERSION={- $config{version} -}
MAJOR={- $config{major} -}
MINOR={- $config{minor} -}
SHLIB_VERSION_NUMBER={- $config{shlib_version_number} -}
SHLIB_VERSION_HISTORY={- $config{shlib_version_history} -}
SHLIB_MAJOR={- $config{shlib_major} -}
SHLIB_MINOR={- $config{shlib_minor} -}
SHLIB_TARGET={- $target{shared_target} -}

EXE_EXT={- $target{exe_extension} || "" -}
LIB_EXT={- $target{lib_extension} || ".a" -}
SHLIB_EXT={- shlib_ext() -}
SHLIB_EXT_SIMPLE={- shlib_ext_simple() -}
OBJ_EXT={- $target{obj_extension} || ".o" -}
DEP_EXT={- $target{dep_extension} || ".d" -}

LIBS={- join(" ", map { $_."\$(LIB_EXT)" } @{$unified_info{libraries}}) -}
SHLIBS={- join(" ", map { $_."\$(SHLIB_EXT)" } map { $unified_info{sharednames}->{$_} || () } @{$unified_info{libraries}}) -}
ENGINES={- join(" ", map { $_."\$(SHLIB_EXT_SIMPLE)" } @{$unified_info{engines}}) -}
PROGRAMS={- join(" ", map { $_."\$(EXE_EXT)" } grep { !m|^test/| } @{$unified_info{programs}}) -}
TESTPROGS={- join(" ", map { $_."\$(EXE_EXT)" } grep { m|^test/| } @{$unified_info{programs}}) -}
SCRIPTS={- join(" ", @{$unified_info{scripts}}) -}
BIN_SCRIPTS=$(BLDDIR)/tools/c_rehash
MISC_SCRIPTS=$(SRCDIR)/tools/c_hash $(SRCDIR)/tools/c_info \
	     $(SRCDIR)/tools/c_issuer $(SRCDIR)/tools/c_name \
	     $(BLDDIR)/apps/CA.pl $(SRCDIR)/apps/tsget

45 46
# DESTDIR is for package builders so that they can configure for, say,
# /usr/ and yet have everything installed to /tmp/somedir/usr/.
47
# Normally it is left empty.
48
DESTDIR=
49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84

# Do not edit these manually. Use Configure with --prefix or --openssldir
# to change this!  Short explanation in the top comment in Configure
INSTALLTOP={- # $prefix is used in the OPENSSLDIR perl snippet
	      #
	      our $prefix = $config{prefix} || "/usr/local";
              $prefix -}
OPENSSLDIR={- #
	      # The logic here is that if no --openssldir was given,
	      # OPENSSLDIR will get the value from $prefix plus "/ssl".
	      # If --openssldir was given and the value is an absolute
	      # path, OPENSSLDIR will get its value without change.
	      # If the value from --openssldir is a relative path,
	      # OPENSSLDIR will get $prefix with the --openssldir
	      # value appended as a subdirectory.
	      #
              use File::Spec::Functions;
              our $openssldir =
                  $config{openssldir} ?
                      (file_name_is_absolute($config{openssldir}) ?
                           $config{openssldir}
                           : catdir($prefix, $config{openssldir}))
                      : catdir($prefix, "ssl");
              $openssldir -}
LIBDIR={- #
          # if $prefix/lib$target{multilib} is not an existing
          # directory, then assume that it's not searched by linker
          # automatically, in which case adding $target{multilib} suffix
          # causes more grief than we're ready to tolerate, so don't...
          our $multilib =
              -d "$prefix/lib$target{multilib}" ? $target{multilib} : "";
          our $libdir = $config{libdir} || "lib$multilib";
          $libdir -}
ENGINESDIR={- use File::Spec::Functions;
              catdir($prefix,$libdir,"engines") -}

85 86
MANDIR=$(INSTALLTOP)/share/man
HTMLDIR=$(INSTALLTOP)/share/doc/$(BASENAME)/html
87

R
Richard Levitte 已提交
88 89 90 91
# MANSUFFIX is for the benefit of anyone who may want to have a suffix
# appended after the manpage file section number.  "ssl" is popular,
# resulting in files such as config.5ssl rather than config.5.
MANSUFFIX=
92 93 94 95 96 97
HTMLSUFFIX=html



CROSS_COMPILE= {- $config{cross_compile_prefix} -}
CC= $(CROSS_COMPILE){- $target{cc} -}
98 99
CFLAGS={- our $cflags2 = join(" ",(map { "-D".$_} @{$config{defines}}),"-DOPENSSLDIR=\"\\\"\$(OPENSSLDIR)\\\"\"","-DENGINESDIR=\"\\\"\$(ENGINESDIR)\\\"\"") -} {- $config{cflags} -}
CFLAGS_Q={- $cflags2 =~ s|([\\"])|\\$1|g; $cflags2 -} {- $config{cflags} -}
100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117
DEPFLAGS= {- join(" ",map { "-D".$_} @{$config{depdefines}}) -}
LDFLAGS= {- $config{lflags} -}
PLIB_LDFLAGS= {- $config{plib_lflags} -}
EX_LIBS= {- $config{ex_libs} -}
SHARED_LDFLAGS={- $target{shared_ldflag}
                  # Unlike other OSes (like Solaris, Linux, Tru64,
                  # IRIX) BSD run-time linkers (tested OpenBSD, NetBSD
                  # and FreeBSD) "demand" RPATH set on .so objects.
                  # Apparently application RPATH is not global and
                  # does not apply to .so linked with other .so.
                  # Problem manifests itself when libssl.so fails to
                  # load libcrypto.so. One can argue that we should
                  # engrave this into Makefile.shared rules or into
                  # BSD-* config lines above. Meanwhile let's try to
                  # be cautious and pass -rpath to linker only when
                  # $prefix is not /usr.
                  . ($config{target} =~ m|^BSD-| && $prefix !~ m|^/usr/.*$|
                     ? " -Wl,-rpath,\$\$(LIBRPATH)" : "") -}
118
SHARED_RCFLAGS={- $target{shared_rcflag} -}
119 120 121 122 123 124 125 126 127 128

PERL={- $config{perl} -}

ARFLAGS= {- $target{arflags} -}
AR=$(CROSS_COMPILE){- $target{ar} || "ar" -} $(ARFLAGS) r
RANLIB= {- $target{ranlib} -}
NM= $(CROSS_COMPILE){- $target{nm} || "nm" -}
RM= rm -f
TAR= {- $target{tar} || "tar" -}
TARFLAGS= {- $target{tarflags} -}
129
MAKEDEPEND=$(CROSS_COMPILE){- $config{makedepprog} -}
130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149

BASENAME=       openssl
NAME=           $(BASENAME)-$(VERSION)
TARFILE=        ../$(NAME).tar

# We let the C compiler driver to take care of .s files. This is done in
# order to be excused from maintaining a separate set of architecture
# dependent assembler flags. E.g. if you throw -mcpu=ultrasparc at SPARC
# gcc, then the driver will automatically translate it to -xarch=v8plus
# and pass it down to assembler.
AS=$(CC) -c
ASFLAG=$(CFLAGS)
PERLASM_SCHEME= {- $target{perlasm_scheme} -}

# For x86 assembler: Set PROCESSOR to 386 if you want to support
# the 80386.
PROCESSOR= {- $config{processor} -}

# The main targets ###################################################

150
all: build_libs build_engines build_apps link-utils
151

152 153 154 155 156 157
# The pkg-config files depend on the libraries as well as Makefile
build_libs: libcrypto.pc libssl.pc openssl.pc
build_engines: $(ENGINES)
build_apps: $(PROGRAMS) $(SCRIPTS)
build_tests: $(TESTPROGS)

B
Ben Laurie 已提交
158
test tests: build_tests build_apps build_engines rehash
159 160 161 162 163 164 165 166 167 168 169
	( cd test; \
	  SRCTOP=../$(SRCDIR) \
	  BLDTOP=../$(BLDDIR) \
	    $(PERL) ../$(SRCDIR)/test/run_tests.pl $(TESTS) )

list-tests:
	@TOP=$(SRCDIR) PERL=$(PERL) $(PERL) $(SRCDIR)/test/run_tests.pl list

libclean:
	-rm -f `find $(BLDDIR) -name '*$(LIB_EXT)' -o -name '*$(SHLIB_EXT)'`

170
install: install_sw install_ssldirs install_docs
171 172 173 174 175 176 177 178 179 180 181 182 183

uninstall: uninstall_docs uninstall_sw

clean: libclean
	rm -f $(PROGRAMS) $(TESTPROGS)
	rm -f `find $(BLDDIR) -name '*$(DEP_EXT)'`
	rm -f `find $(BLDDIR) -name '*$(OBJ_EXT)'`
	rm -f $(BLDDIR)/core $(BLDDIR)/rehash.time
	rm -f $(BLDDIR)/tags $(BLDDIR)/TAGS
	rm -f $(BLDDIR)/openssl.pc $(BLDDIR)/libcrypto.pc $(BLDDIR)/libssl.pc
	-rm -f `find $(BLDDIR) -type l`
	rm -f $(TARFILE)

184
DCLEAN_CMD=sed -e '/^. DO NOT DELETE.*/,$$d'
185 186 187 188 189 190 191 192 193 194 195 196 197 198 199 200 201 202 203 204 205 206 207 208
dclean:
	$(DCLEAN_CMD) < Makefile >Makefile.new
	mv -f Makefile.new Makefile

DEPS={- join(" ", map { (my $x = $_) =~ s|\.o$|\$(DEP_EXT)|; $x; }
                  grep { $unified_info{sources}->{$_}->[0] =~ /\.c$/ }
                  keys %{$unified_info{sources}}); -}
depend: $(DEPS)
	( $(DCLEAN_CMD) < Makefile; \
	  echo '# DO NOT DELETE THIS LINE -- make depend depends on it.'; \
	  echo; \
	  cat `find . -name '*$(DEP_EXT)'` ) > Makefile.new
	mv -f Makefile.new Makefile

# Install helper targets #############################################

install_sw: all install_dev install_engines install_runtime

uninstall_sw: uninstall_dev uninstall_engines uninstall_runtime

install_docs: install_man_docs install_html_docs

uninstall_docs: uninstall_man_docs uninstall_html_docs

209 210 211 212
install_ssldirs:
	@$(PERL) $(SRCDIR)/util/mkdir-p.pl $(DESTDIR)$(OPENSSLDIR)/certs
	@$(PERL) $(SRCDIR)/util/mkdir-p.pl $(DESTDIR)$(OPENSSLDIR)/private

213 214 215
install_dev:
	@[ -n "$(INSTALLTOP)" ] || (echo INSTALLTOP should not be empty; exit 1)
	@echo "*** Installing development files"
216
	@$(PERL) $(SRCDIR)/util/mkdir-p.pl $(DESTDIR)$(INSTALLTOP)/include/openssl
217 218 219
	@set -e; for i in $(SRCDIR)/include/openssl/*.h \
			  $(BLDDIR)/include/openssl/*.h; do \
		fn=`basename $$i`; \
220 221 222
		echo "install $$i -> $(DESTDIR)$(INSTALLTOP)/include/openssl/$$fn"; \
		cp $$i $(DESTDIR)$(INSTALLTOP)/include/openssl/$$fn; \
		chmod 644 $(DESTDIR)$(INSTALLTOP)/include/openssl/$$fn; \
223
	done
224
	@$(PERL) $(SRCDIR)/util/mkdir-p.pl $(DESTDIR)$(INSTALLTOP)/$(LIBDIR)
225 226
	@set -e; for l in $(LIBS); do \
		fn=`basename $$l`; \
227 228 229 230 231 232
		echo "install $$l -> $(DESTDIR)$(INSTALLTOP)/$(LIBDIR)/$$fn"; \
		cp $$l $(DESTDIR)$(INSTALLTOP)/$(LIBDIR)/$$fn.new; \
		$(RANLIB) $(DESTDIR)$(INSTALLTOP)/$(LIBDIR)/$$fn.new; \
		chmod 644 $(DESTDIR)$(INSTALLTOP)/$(LIBDIR)/$$fn.new; \
		mv -f $(DESTDIR)$(INSTALLTOP)/$(LIBDIR)/$$fn.new \
		      $(DESTDIR)$(INSTALLTOP)/$(LIBDIR)/$$fn; \
233 234 235 236
	done
	@ : {- output_off() if $config{no_shared}; "" -}
	@set -e; for s in $(SHLIBS); do \
		fn=`basename $$s`; \
237 238 239 240 241
		echo "install $$s -> $(DESTDIR)$(INSTALLTOP)/$(LIBDIR)/$$fn"; \
		cp $$s $(DESTDIR)$(INSTALLTOP)/$(LIBDIR)/$$fn.new; \
		chmod 644 $(DESTDIR)$(INSTALLTOP)/$(LIBDIR)/$$fn.new; \
		mv -f $(DESTDIR)$(INSTALLTOP)/$(LIBDIR)/$$fn.new \
		      $(DESTDIR)$(INSTALLTOP)/$(LIBDIR)/$$fn; \
242
		if [ "$(SHLIB_EXT)" != "$(SHLIB_EXT_SIMPLE)" ]; then \
243
			echo "link $(DESTDIR)$(INSTALLTOP)/$(LIBDIR)/$$fn2 -> $(DESTDIR)$(INSTALLTOP)/$(LIBDIR)/$$fn"; \
244
			fn2=`basename $$fn $(SHLIB_EXT)`$(SHLIB_EXT_SIMPLE); \
245
			ln -sf $$fn $(DESTDIR)$(INSTALLTOP)/$(LIBDIR)/$$fn2; \
246
		fi; \
247
		: {- output_off() unless windowsdll(); "" -}; \
248 249 250 251 252
		echo "install $$s.a -> $(DESTDIR)$(INSTALLTOP)/$(LIBDIR)/$$fn.a"; \
		cp $$s.a $(DESTDIR)$(INSTALLTOP)/$(LIBDIR)/$$fn.a.new; \
		chmod 644 $(DESTDIR)$(INSTALLTOP)/$(LIBDIR)/$$fn.a.new; \
		mv -f $(DESTDIR)$(INSTALLTOP)/$(LIBDIR)/$$fn.a.new \
		      $(DESTDIR)$(INSTALLTOP)/$(LIBDIR)/$$fn.a; \
253
		: {- output_on() unless windowsdll(); "" -}; \
254
	done
255
	@ : {- output_on() if $config{no_shared}; "" -}
256 257 258 259 260 261 262 263 264 265
	@$(PERL) $(SRCDIR)/util/mkdir-p.pl $(DESTDIR)$(INSTALLTOP)/$(LIBDIR)/pkgconfig
	@echo "install libcrypto.pc -> $(DESTDIR)$(INSTALLTOP)/$(LIBDIR)/pkgconfig/libcrypto.pc"
	@cp libcrypto.pc $(DESTDIR)$(INSTALLTOP)/$(LIBDIR)/pkgconfig
	@chmod 644 $(DESTDIR)$(INSTALLTOP)/$(LIBDIR)/pkgconfig/libcrypto.pc
	@echo "install libssl.pc -> $(DESTDIR)$(INSTALLTOP)/$(LIBDIR)/pkgconfig/libssl.pc"
	@cp libssl.pc $(DESTDIR)$(INSTALLTOP)/$(LIBDIR)/pkgconfig
	@chmod 644 $(DESTDIR)$(INSTALLTOP)/$(LIBDIR)/pkgconfig/libssl.pc
	@echo "install openssl.pc -> $(DESTDIR)$(INSTALLTOP)/$(LIBDIR)/pkgconfig/openssl.pc"
	@cp openssl.pc $(DESTDIR)$(INSTALLTOP)/$(LIBDIR)/pkgconfig
	@chmod 644 $(DESTDIR)$(INSTALLTOP)/$(LIBDIR)/pkgconfig/openssl.pc
266 267 268 269 270 271

uninstall_dev:
	@echo "*** Uninstalling development files"
	@set -e; for i in $(SRCDIR)/include/openssl/*.h \
			  $(BLDDIR)/include/openssl/*.h; do \
		fn=`basename $$i`; \
272 273
		echo "$(RM) $(DESTDIR)$(INSTALLTOP)/include/openssl/$$fn"; \
		$(RM) $(DESTDIR)$(INSTALLTOP)/include/openssl/$$fn; \
274 275 276
	done
	@set -e; for l in $(LIBS); do \
		fn=`basename $$l`; \
277 278
		echo "$(RM) $(DESTDIR)$(INSTALLTOP)/$(LIBDIR)/$$fn"; \
		$(RM) $(DESTDIR)$(INSTALLTOP)/$(LIBDIR)/$$fn; \
279 280 281 282 283
	done
	@set -e; for s in $(SHLIBS); do \
		fn=`basename $$s`; \
		if [ "$(SHLIB_EXT)" != "$(SHLIB_EXT_SIMPLE)" ]; then \
			fn2=`basename $$fn $(SHLIB_EXT)`$(SHLIB_EXT_SIMPLE); \
284 285
			echo "$(RM) $(DESTDIR)$(INSTALLTOP)/$(LIBDIR)/$$fn2"; \
			$(RM) $(DESTDIR)$(INSTALLTOP)/$(LIBDIR)/$$fn2; \
286
		fi; \
287 288
		echo "$(RM) $(DESTDIR)$(INSTALLTOP)/$(LIBDIR)/$$fn"; \
		$(RM) $(DESTDIR)$(INSTALLTOP)/$(LIBDIR)/$$fn; \
289
		: {- output_off() unless windowsdll(); "" -}; \
290 291
		echo "$(RM) $(DESTDIR)$(INSTALLTOP)/$(LIBDIR)/$$fn.a"; \
		$(RM) $(DESTDIR)$(INSTALLTOP)/$(LIBDIR)/$$fn.a; \
292
		: {- output_on() unless windowsdll(); "" -}; \
293
	done
294 295 296 297 298 299
	@echo "$(RM) $(DESTDIR)$(INSTALLTOP)/$(LIBDIR)/pkgconfig/libcrypto.pc"
	@$(RM) $(DESTDIR)$(INSTALLTOP)/$(LIBDIR)/pkgconfig/libcrypto.pc
	@echo "$(RM) $(DESTDIR)$(INSTALLTOP)/$(LIBDIR)/pkgconfig/libssl.pc"
	@$(RM) $(DESTDIR)$(INSTALLTOP)/$(LIBDIR)/pkgconfig/libssl.pc
	@echo "$(RM) $(DESTDIR)$(INSTALLTOP)/$(LIBDIR)/pkgconfig/openssl.pc"
	@$(RM) $(DESTDIR)$(INSTALLTOP)/$(LIBDIR)/pkgconfig/openssl.pc
300 301 302

install_engines:
	@[ -n "$(INSTALLTOP)" ] || (echo INSTALLTOP should not be empty; exit 1)
303
	@$(PERL) $(SRCDIR)/util/mkdir-p.pl $(DESTDIR)$(INSTALLTOP)/$(LIBDIR)/engines/
304 305 306
	@echo "*** Installing engines"
	@set -e; for e in $(ENGINES); do \
		fn=`basename $$e`; \
307 308 309 310 311
		echo "install $$e -> $(DESTDIR)$(INSTALLTOP)/bin/$$fn"; \
		cp $$e $(DESTDIR)$(INSTALLTOP)/$(LIBDIR)/engines/$$fn.new; \
		chmod 755 $(DESTDIR)$(INSTALLTOP)/$(LIBDIR)/engines/$$fn.new; \
		mv -f $(DESTDIR)$(INSTALLTOP)/$(LIBDIR)/engines/$$fn.new \
		      $(DESTDIR)$(INSTALLTOP)/$(LIBDIR)/engines/$$fn; \
312 313 314 315 316 317
	done

uninstall_engines:
	@echo "*** Uninstalling engines"
	@set -e; for e in $(ENGINES); do \
		fn=`basename $$e`; \
318 319
		echo "$(RM) $(DESTDIR)$(INSTALLTOP)/bin/$$fn"; \
		$(RM) $(DESTDIR)$(INSTALLTOP)/$(LIBDIR)/engines/$$fn; \
320 321 322 323
	done

install_runtime:
	@[ -n "$(INSTALLTOP)" ] || (echo INSTALLTOP should not be empty; exit 1)
324 325
	@$(PERL) $(SRCDIR)/util/mkdir-p.pl $(DESTDIR)$(INSTALLTOP)/bin
	@$(PERL) $(SRCDIR)/util/mkdir-p.pl $(DESTDIR)$(OPENSSLDIR)/misc
326
	@echo "*** Installing runtime files"
327 328 329
	: {- output_off() unless windowsdll(); "" -};
	@set -e; for s in $(SHLIBS); do \
		fn=`basename $$i`; \
330 331 332 333 334
		echo "install $$s -> $(DESTDIR)$(INSTALLTOP)/bin/$$fn"; \
		cp $$s $(DESTDIR)$(INSTALLTOP)/bin/$$fn.new; \
		chmod 644 $(DESTDIR)$(INSTALLTOP)/bin/$$fn.new; \
		mv -f $(DESTDIR)$(INSTALLTOP)/bin/$$fn.new \
		      $(DESTDIR)$(INSTALLTOP)/bin/$$fn; \
335
	done
336
	: {- output_on() unless windowsdll(); "" -};
337 338
	@set -e; for x in $(PROGRAMS); do \
		fn=`basename $$x`; \
339 340 341 342 343
		echo "install $$x -> $(DESTDIR)$(INSTALLTOP)/bin/$$fn"; \
		cp $$x $(DESTDIR)$(INSTALLTOP)/bin/$$fn.new; \
		chmod 755 $(DESTDIR)$(INSTALLTOP)/bin/$$fn.new; \
		mv -f $(DESTDIR)$(INSTALLTOP)/bin/$$fn.new \
		      $(DESTDIR)$(INSTALLTOP)/bin/$$fn; \
344 345 346
	done
	@set -e; for x in $(BIN_SCRIPTS); do \
		fn=`basename $$x`; \
347 348 349 350 351
		echo "install $$x -> $(DESTDIR)$(INSTALLTOP)/bin/$$fn"; \
		cp $$x $(DESTDIR)$(INSTALLTOP)/bin/$$fn.new; \
		chmod 755 $(DESTDIR)$(INSTALLTOP)/bin/$$fn.new; \
		mv -f $(DESTDIR)$(INSTALLTOP)/bin/$$fn.new \
		      $(DESTDIR)$(INSTALLTOP)/bin/$$fn; \
352 353 354
	done
	@set -e; for x in $(MISC_SCRIPTS); do \
		fn=`basename $$x`; \
355 356 357 358 359
		echo "install $$x -> $(DESTDIR)$(OPENSSLDIR)/misc/$$fn"; \
		cp $$x $(DESTDIR)$(OPENSSLDIR)/misc/$$fn.new; \
		chmod 755 $(DESTDIR)$(OPENSSLDIR)/misc/$$fn.new; \
		mv -f $(DESTDIR)$(OPENSSLDIR)/misc/$$fn.new \
		      $(DESTDIR)$(OPENSSLDIR)/misc/$$fn; \
360
	done
361 362 363 364
	@echo "install $(SRCDIR)/apps/openssl.cnf -> $(DESTDIR)$(OPENSSLDIR)/openssl.cnf"
	@cp $(SRCDIR)/apps/openssl.cnf $(DESTDIR)$(OPENSSLDIR)/openssl.cnf.new
	@chmod 644 $(DESTDIR)$(OPENSSLDIR)/openssl.cnf.new
	@mv -f  $(DESTDIR)$(OPENSSLDIR)/openssl.cnf.new $(DESTDIR)$(OPENSSLDIR)/openssl.cnf
365 366 367 368 369 370

uninstall_runtime:
	@echo "*** Uninstalling runtime files"
	@set -e; for x in $(PROGRAMS); \
	do  \
		fn=`basename $$x`; \
371 372
		echo "$(RM) $(DESTDIR)$(INSTALLTOP)/bin/$$fn"; \
		$(RM) $(DESTDIR)$(INSTALLTOP)/bin/$$fn; \
373 374 375 376
	done;
	@set -e; for x in $(BIN_SCRIPTS); \
	do  \
		fn=`basename $$x`; \
377 378
		echo "$(RM) $(DESTDIR)$(INSTALLTOP)/bin/$$fn"; \
		$(RM) $(DESTDIR)$(INSTALLTOP)/bin/$$fn; \
379 380 381 382
	done
	@set -e; for x in $(MISC_SCRIPTS); \
	do  \
		fn=`basename $$x`; \
383 384
		echo "$(RM) $(DESTDIR)$(OPENSSLDIR)/misc/$$fn"; \
		$(RM) $(DESTDIR)$(OPENSSLDIR)/misc/$$fn; \
385
	done
386 387 388
	: {- output_off() unless windowsdll(); "" -};
	@set -e; for s in $(SHLIBS); do \
		fn=`basename $$i`; \
389 390
		echo "$(RM) $(DESTDIR)$(INSTALLTOP)/bin/$$fn"; \
		$(RM) $(DESTDIR)$(INSTALLTOP)/bin/$$fn; \
391
	done
392
	: {- output_on() unless windowsdll(); "" -};
393
	$(RM) $(DESTDIR)$(OPENSSLDIR)/openssl.cnf
394 395 396 397 398 399 400 401 402 403 404 405 406 407 408 409 410 411 412 413 414 415 416 417 418 419 420 421 422 423

# A method to extract all names from a .pod file
# The first sed extracts everything between "=head1 NAME" and the next =head1
# The second sed joins all the lines into one
# The third sed removes the description and turns all commas into spaces
# Voilà, you have a space separated list of names!
EXTRACT_NAMES=sed -e '1,/^=head1  *NAME *$$/d;/^=head1/,$$d' | \
              sed -e ':a;{N;s/\n/ /;ba}' | \
              sed -e 's/ - .*$$//;s/,/ /g'
PROCESS_PODS=\
	set -e; \
	here=`cd $(SRCDIR); pwd`; \
	point=$$here/util/point.sh; \
	for ds in apps:1 crypto:3 ssl:3; do \
	    defdir=`echo $$ds | cut -f1 -d:`; \
	    defsec=`echo $$ds | cut -f2 -d:`; \
	    for p in $(SRCDIR)/doc/$$defdir/*.pod; do \
		SEC=`sed -ne 's/^=for  *comment  *openssl_manual_section: *\([0-9]\) *$$/\1/p' $$p`; \
		[ -z "$$SEC" ] && SEC=$$defsec; \
		fn=`basename $$p .pod`; \
		NAME=`echo $$fn | tr [a-z] [A-Z]`; \
		suf=`eval "echo $$OUTSUFFIX"`; \
		top=`eval "echo $$OUTTOP"`; \
		$(PERL) $(SRCDIR)/util/mkdir-p.pl $$top/man$$SEC; \
		echo "install $$p -> $$top/man$$SEC/$$fn$$suf"; \
		cat $$p | eval "$$GENERATE" \
			>  $$top/man$$SEC/$$fn$$suf; \
		names=`cat $$p | $(EXTRACT_NAMES)`; \
		( cd $$top/man$$SEC; \
		  for n in $$names; do \
424 425 426 427 428 429 430 431
		      comp_n="$$n"; \
		      comp_fn="$$fn"; \
		      case "$(PLATFORM)" in DJGPP|Cygwin*|mingw*|darwin*-*-cc) \
			  comp_n=`echo "$$n" | tr [A-Z] [a-z]`; \
			  comp_fn=`echo "$$fn" | tr [A-Z] [a-z]`; \
			  ;; \
		      esac; \
		      if [ "$$comp_n" != "$$comp_fn" ]; then \
432 433 434 435 436 437 438 439 440 441 442 443 444 445 446 447 448 449 450 451 452 453
			  echo "link $$top/man$$SEC/$$n$$suf -> $$top/man$$SEC/$$fn$$suf"; \
			  PLATFORM=$(PLATFORM) $$point $$fn$$suf $$n$$suf; \
		      fi; \
		  done ); \
	    done; \
	done
UNINSTALL_DOCS=\
	set -e; \
	here=`cd $(SRCDIR); pwd`; \
	for ds in apps:1 crypto:3 ssl:3; do \
	    defdir=`echo $$ds | cut -f1 -d:`; \
	    defsec=`echo $$ds | cut -f2 -d:`; \
	    for p in $(SRCDIR)/doc/$$defdir/*.pod; do \
		SEC=`sed -ne 's/^=for  *comment  *openssl_manual_section: *\([0-9]\) *$$/\1/p' $$p`; \
		[ -z "$$SEC" ] && SEC=$$defsec; \
		fn=`basename $$p .pod`; \
		suf=`eval "echo $$OUTSUFFIX"`; \
		top=`eval "echo $$OUTTOP"`; \
		echo "$(RM) $$top/man$$SEC/$$fn$$suf"; \
	        $(RM) $$top/man$$SEC/$$fn$$suf; \
		names=`cat $$p | $(EXTRACT_NAMES)`; \
		for n in $$names; do \
454 455 456 457 458 459 460 461
		    comp_n="$$n"; \
		    comp_fn="$$fn"; \
		    case "$(PLATFORM)" in DJGPP|Cygwin*|mingw*|darwin*-*-cc) \
			comp_n=`echo "$$n" | tr [A-Z] [a-z]`; \
			comp_fn=`echo "$$fn" | tr [A-Z] [a-z]`; \
			;; \
		    esac; \
		    if [ "$$comp_n" != "$$comp_fn" ]; then \
462 463 464 465 466 467 468 469 470 471 472 473
			echo "$(RM) $$top/man$$SEC/$$n$$suf"; \
			$(RM) $$top/man$$SEC/$$n$$suf; \
		    fi; \
		done; \
	    done; \
	done

install_man_docs:
	@[ -n "$(INSTALLTOP)" ] || (echo INSTALLTOP should not be empty; exit 1)
	@echo "*** Installing manpages"
	@\
	OUTSUFFIX='.$${SEC}$(MANSUFFIX)'; \
474
	OUTTOP="$(DESTDIR)$(MANDIR)"; \
475 476 477 478 479 480 481
	GENERATE='pod2man --name=$$NAME --section=$$SEC --center=OpenSSL --release=$(VERSION)'; \
	$(PROCESS_PODS)

uninstall_man_docs:
	@echo "*** Uninstalling manpages"
	@\
	OUTSUFFIX='.$${SEC}$(MANSUFFIX)'; \
482
	OUTTOP="$(DESTDIR)$(MANDIR)"; \
483 484 485 486 487 488 489
	$(UNINSTALL_DOCS)

install_html_docs:
	@[ -n "$(INSTALLTOP)" ] || (echo INSTALLTOP should not be empty; exit 1)
	@echo "*** Installing HTML manpages"
	@\
	OUTSUFFIX='.$(HTMLSUFFIX)'; \
490
	OUTTOP="$(DESTDIR)$(HTMLDIR)"; \
491 492 493 494 495 496 497 498 499
	GENERATE="pod2html --podroot=$(SRCDIR)/doc --htmldir=.. \
			   --podpath=apps:crypto:ssl \
		  | sed -e 's|href=\"http://man.he.net/man|href=\"../man|g'"; \
	$(PROCESS_PODS)

uninstall_html_docs:
	@echo "*** Uninstalling manpages"
	@\
	OUTSUFFIX='.$(HTMLSUFFIX)'; \
500
	OUTTOP="$(DESTDIR)$(HTMLDIR)"; \
501 502 503 504 505
	$(UNINSTALL_DOCS)


# Developer targets (note: these are only available on Unix) #########

506 507 508
update: generate errors ordinals

generate: generate_apps generate_crypto_bn generate_crypto_objects
509 510 511 512 513 514 515 516 517 518 519 520

# Test coverage is a good idea for the future
#coverage: $(PROGRAMS) $(TESTPROGRAMS)
#	...

# Currently disabled, util/selftest.pl needs a rewrite
#report:
#	SRCDIR=$(SRCDIR) @$(PERL) util/selftest.pl

lint:
	lint -DLINT $(INCLUDES) $(SRCS)

521
generate_apps: $(SRCDIR)/apps/openssl-vms.cnf $(SRCDIR)/apps/progs.h
522 523 524 525 526 527 528

generate_crypto_bn: $(SRCDIR)/crypto/bn/bn_prime.h

generate_crypto_objects: $(SRCDIR)/crypto/objects/obj_dat.h \
                         $(SRCDIR)/include/openssl/obj_mac.h \
                         $(SRCDIR)/crypto/objects/obj_xref.h

529 530 531 532 533 534 535 536 537 538 539 540 541 542 543 544 545 546 547 548 549 550 551 552 553 554 555 556 557 558 559 560 561 562 563 564 565 566 567 568 569 570 571 572 573 574 575 576 577 578 579 580 581
errors:
	( cd $(SRCDIR); $(PERL) util/ck_errf.pl -strict */*.c */*/*.c )
	( cd $(SRCDIR); $(PERL) util/mkerr.pl -recurse -write )
	( cd $(SRCDIR)/engines; \
	  for e in *.ec; do \
	      $(PERL) ../util/mkerr.pl -conf $$e \
		      -nostatic -staticloader -write *.c; \
	  done )
	( cd $(SRCDIR)/crypto/ct; \
	  $(PERL) ../../util/mkerr.pl -conf ct.ec -hprefix internal/ -write *.c )

ordinals:
	( b=`pwd`; cd $(SRCDIR); $(PERL) -I$$b util/mkdef.pl crypto update )
	( b=`pwd`; cd $(SRCDIR); $(PERL) -I$$b util/mkdef.pl ssl update )

test_ordinals:
	( cd test; \
	  SRCTOP=../$(SRCDIR) \
	  BLDTOP=../$(BLDDIR) \
	    $(PERL) ../$(SRCDIR)/test/run_tests.pl test_ordinals )

tags TAGS: FORCE
	rm -f TAGS tags
	-ctags -R .
	-etags `find . -name '*.[ch]' -o -name '*.pm'`

# Release targets (note: only available on Unix) #####################

tar:
	TMPDIR=/var/tmp/openssl-copy.$$$$; \
	DISTDIR=openssl-$(VERSION); \
	mkdir -p $$TMPDIR/$$DISTDIR; \
	(cd $(SRCDIR); \
	 git ls-tree -r --name-only --full-tree HEAD \
	 | while read F; do \
	       mkdir -p $$TMPDIR/$$DISTDIR/`dirname $$F`; \
	       cp $$F $$TMPDIR/$$DISTDIR/$$F; \
	   done); \
	(cd $$TMPDIR; \
	 [ -n "$(PREPARE_CMD)" ] && $(PREPARE_CMD); \
	 find $$TMPDIR/$$DISTDIR -type d -print | xargs chmod 755; \
	 find $$TMPDIR/$$DISTDIR -type f -print | xargs chmod a+r; \
	 find $$TMPDIR/$$DISTDIR -type f -perm -0100 -print | xargs chmod a+x; \
	 $(TAR) $(TARFLAGS) --owner 0 --group 0 -cvf - $$DISTDIR) \
	| (cd $(SRCDIR); gzip --best > $(TARFILE).gz); \
	rm -rf $$TMPDIR
	cd $(SRCDIR); ls -l $(TARFILE).gz

dist:
	@$(MAKE) PREPARE_CMD='./Configure dist' tar

# Helper targets #####################################################

B
Ben Laurie 已提交
582
rehash: link-utils copy-certs build_apps
583 584 585 586 587 588 589 590 591 592 593 594 595 596 597 598 599 600 601 602 603 604 605 606 607 608 609 610
	@if [ -z "$(CROSS_COMPILE)" ]; then \
		(OPENSSL="$(BLDDIR)/util/shlib_wrap.sh apps/openssl"; \
		[ -x "$(BLDDIR)/openssl.exe" ] && OPENSSL="$(BLDDIR)/openssl.exe" || :; \
		OPENSSL_DEBUG_MEMORY=on; OPENSSL_CONF=/dev/null ; \
		export OPENSSL OPENSSL_DEBUG_MEMORY OPENSSL_CONF; \
		$$OPENSSL rehash certs/demo \
		|| $(PERL) tools/c_rehash certs/demo) && \
		touch rehash.time; \
	else :; fi

link-utils: $(BLDDIR)/util/opensslwrap.sh $(BLDDIR)/util/shlib_wrap.sh

$(BLDDIR)/util/opensslwrap.sh: Makefile
	@if [ "$(SRCDIR)" != "$(BLDDIR)" ]; then \
	    mkdir -p "$(BLDDIR)/util"; \
	    ln -sf "../$(SRCDIR)/util/opensslwrap.sh" "$(BLDDIR)/util"; \
	fi
$(BLDDIR)/util/shlib_wrap.sh: Makefile
	@if [ "$(SRCDIR)" != "$(BLDDIR)" ]; then \
	    mkdir -p "$(BLDDIR)/util"; \
	    ln -sf "../$(SRCDIR)/util/shlib_wrap.sh" "$(BLDDIR)/util"; \
	fi

copy-certs: FORCE
	@if [ "$(SRCDIR)" != "$(BLDDIR)" ]; then \
	    cp -R "$(SRCDIR)/certs" "$(BLDDIR)/"; \
	fi

611 612 613 614
$(SRCDIR)/apps/openssl-vms.cnf: $(SRCDIR)/apps/openssl.cnf
	$(PERL) $(SRCDIR)/VMS/VMSify-conf.pl \
                < $(SRCDIR)/apps/openssl.cnf > $(SRCDIR)/apps/openssl-vms.cnf

615 616 617 618 619 620 621 622 623 624 625
{- # because the program apps/openssl has object files as sources, and
   # they then have the corresponding C files as source, we need to chain
   # the lookups in %unified_info
   my $apps_openssl = catfile("apps","openssl");
   our @openssl_source = map { @{$unified_info{sources}->{$_}} }
                         @{$unified_info{sources}->{$apps_openssl}};
   ""; -}
$(SRCDIR)/apps/progs.h:
	$(RM) $@
	$(PERL) $(SRCDIR)/apps/progs.pl {- join(" ", @openssl_source) -} > $@

626 627 628 629 630 631 632 633 634 635 636 637 638 639 640 641 642 643 644 645 646 647 648 649 650 651 652 653
$(SRCDIR)/crypto/bn/bn_prime.h: $(SRCDIR)/crypto/bn/bn_prime.pl
	$(PERL) $(SRCDIR)/crypto/bn/bn_prime.pl > $(SRCDIR)/crypto/bn/bn_prime.h

$(SRCDIR)/crypto/objects/obj_dat.h: $(SRCDIR)/crypto/objects/obj_dat.pl \
                                    $(SRCDIR)/include/openssl/obj_mac.h
	$(PERL) $(SRCDIR)/crypto/objects/obj_dat.pl \
                $(SRCDIR)/include/openssl/obj_mac.h \
                $(SRCDIR)/crypto/objects/obj_dat.h

# objects.pl both reads and writes obj_mac.num
$(SRCDIR)/include/openssl/obj_mac.h: $(SRCDIR)/crypto/objects/objects.pl \
                                     $(SRCDIR)/crypto/objects/objects.txt \
                                     $(SRCDIR)/crypto/objects/obj_mac.num
	$(PERL) $(SRCDIR)/crypto/objects/objects.pl \
                $(SRCDIR)/crypto/objects/objects.txt \
                $(SRCDIR)/crypto/objects/obj_mac.num \
                $(SRCDIR)/include/openssl/obj_mac.h
	@sleep 1; touch $(SRCDIR)/include/openssl/obj_mac.h; sleep 1

$(SRCDIR)/crypto/objects/obj_xref.h: $(SRCDIR)/crypto/objects/objxref.pl \
                                     $(SRCDIR)/crypto/objects/obj_xref.txt \
                                     $(SRCDIR)/crypto/objects/obj_mac.num
	$(PERL) $(SRCDIR)/crypto/objects/objxref.pl \
                $(SRCDIR)/crypto/objects/obj_mac.num \
                $(SRCDIR)/crypto/objects/obj_xref.txt \
                > $(SRCDIR)/crypto/objects/obj_xref.h
	@sleep 1; touch $(SRCDIR)/crypto/objects/obj_xref.h; sleep 1

654 655 656 657 658 659 660 661 662 663 664 665 666 667 668 669 670 671 672 673 674 675 676 677 678 679 680 681 682 683 684 685 686 687 688 689 690 691 692 693 694 695 696 697 698 699 700 701 702 703 704 705 706 707 708 709 710 711 712 713 714
FORCE :

# Building targets ###################################################

libcrypto.pc libssl.pc openssl.pc: Makefile $(LIBS)
libcrypto.pc:
	@ ( echo 'prefix=$(INSTALLTOP)'; \
	    echo 'exec_prefix=$${prefix}'; \
	    echo 'libdir=$${exec_prefix}/$(LIBDIR)'; \
	    echo 'includedir=$${prefix}/include'; \
	    echo ''; \
	    echo 'Name: OpenSSL-libcrypto'; \
	    echo 'Description: OpenSSL cryptography library'; \
	    echo 'Version: '$(VERSION); \
	    echo 'Libs: -L$${libdir} -lcrypto'; \
	    echo 'Libs.private: $(EX_LIBS)'; \
	    echo 'Cflags: -I$${includedir}' ) > libcrypto.pc

libssl.pc:
	@ ( echo 'prefix=$(INSTALLTOP)'; \
	    echo 'exec_prefix=$${prefix}'; \
	    echo 'libdir=$${exec_prefix}/$(LIBDIR)'; \
	    echo 'includedir=$${prefix}/include'; \
	    echo ''; \
	    echo 'Name: OpenSSL-libssl'; \
	    echo 'Description: Secure Sockets Layer and cryptography libraries'; \
	    echo 'Version: '$(VERSION); \
	    echo 'Requires.private: libcrypto'; \
	    echo 'Libs: -L$${libdir} -lssl'; \
	    echo 'Libs.private: $(EX_LIBS)'; \
	    echo 'Cflags: -I$${includedir}' ) > libssl.pc

openssl.pc:
	@ ( echo 'prefix=$(INSTALLTOP)'; \
	    echo 'exec_prefix=$${prefix}'; \
	    echo 'libdir=$${exec_prefix}/$(LIBDIR)'; \
	    echo 'includedir=$${prefix}/include'; \
	    echo ''; \
	    echo 'Name: OpenSSL'; \
	    echo 'Description: Secure Sockets Layer and cryptography libraries and tools'; \
	    echo 'Version: '$(VERSION); \
	    echo 'Requires: libssl libcrypto' ) > openssl.pc

# Note on the use of $(MFLAGS): this was an older variant of MAKEFLAGS which
# wasn't passed down automatically.  It's quite safe to use it like we do
# below; if it doesn't exist, the result will be empty and 'make' will pick
# up $(MAKEFLAGS) which is passed down as an environment variable.
Makefile: {- $config{build_file_template} -} $(SRCDIR)/Configure $(SRCDIR)/config
	@echo "Makefile is older than {- $config{build_file_template} -}, $(SRCDIR)/Configure or $(SRCDIR)/config."
	@echo "Reconfiguring..."
	$(SRCDIR)/Configure reconf
	@echo "**************************************************"
	@echo "***                                            ***"
	@echo "***   Please run the same make command again   ***"
	@echo "***                                            ***"
	@echo "**************************************************"
	@false

{-
  use File::Basename;
  use File::Spec::Functions qw/:DEFAULT abs2rel rel2abs/;
715 716 717 718 719 720 721 722 723 724 725 726 727 728 729 730 731 732 733 734

  # Helper function to figure out dependencies on libraries
  # It takes a list of library names and outputs a list of dependencies
  sub compute_lib_depends {
      if ($config{no_shared}) {
          return map { $_."\$(LIB_EXT)" } @_;
      }

      # Depending on shared libraries:
      # On Windows POSIX layers, we depend on {libname}.dll.a
      # On Unix platforms, we depend on {shlibname}.so
      return map { if (windowsdll()) {
                       "$_\$(SHLIB_EXT_SIMPLE).a"
		   } else {
		       my $libname =
		           $unified_info{sharednames}->{$_} || $_;
		       "$libname\$(SHLIB_EXT_SIMPLE)"
		   } } @_;
  }

735
  sub src2obj {
736
      my %args = @_;
737
      my $obj = $args{obj};
738
      my $srcs = join(" ", @{$args{srcs}});
739
      my $deps = join(" ", @{$args{srcs}}, @{$args{deps}});
740 741 742 743
      my $incs = join(" ", map { " -I".$_ } @{$args{incs}});
      my $makedepprog = $config{makedepprog};
      if ($makedepprog eq "makedepend") {
          return <<"EOF";
744
$obj\$(DEP_EXT): $deps
745
	rm -f \$\@.tmp; touch \$\@.tmp
746 747 748 749 750
	\$(MAKEDEPEND) -f\$\@.tmp -o"|$obj" \\
	    -- -DOPENSSL_DOING_MAKEDEPEND \$(DEPFLAGS)$incs \\
	    -- $srcs \\
	    2>/dev/null
	sed -e 's/^.*|//' -e 's/ \\/\\(\\\\.\\|[^ ]\\)*//g' -e '/: *\$\$/d' -e '/^\\(#.*\\| *\\)\$\$/d' \$\@.tmp > \$\@
751
	rm \$\@.tmp
752 753
$obj\$(OBJ_EXT): $obj\$(DEP_EXT)
	\$(CC) \$(CFLAGS)$incs -c -o \$\@ $srcs
754 755 756
EOF
      }
      return <<"EOF";
757
$obj\$(DEP_EXT): $deps
758
	\$(CC) -DOPENSSL_DOING_MAKEDEPEND \$(DEPFLAGS)$incs -MM -MF \$\@ -MQ $obj $srcs
759
$obj\$(OBJ_EXT): $obj\$(DEP_EXT)
760 761 762 763 764 765 766 767 768 769 770 771 772
	\$(CC) \$(CFLAGS)$incs -c -o \$\@ $srcs
EOF
  }
  # On Unix, we build shlibs from static libs, so we're ignoring the
  # object file array.  We *know* this routine is only called when we've
  # configure 'shared'.
  sub libobj2shlib {
      my %args = @_;
      my $lib = $args{lib};
      my $shlib = $args{shlib};
      my $libd = dirname($lib);
      my $libn = basename($lib);
      (my $libname = $libn) =~ s/^lib//;
773 774 775 776 777
      my $linklibs = join("", map { my $d = dirname($_);
                                    my $f = basename($_);
                                    (my $l = $f) =~ s/^lib//;
                                    " -L$d -l$l" } @{$args{deps}});
      my $deps = join(" ",compute_lib_depends(@{$args{deps}}));
778 779
      my $shlib_target = $target{shared_target};
      my $ordinalsfile = defined($args{ordinals}) ? $args{ordinals}->[1] : "";
780 781
      my $shlibtarget = windowsdll() ?
	  "$lib\$(SHLIB_EXT_SIMPLE).a" : "$shlib\$(SHLIB_EXT_SIMPLE)";
782
      return <<"EOF"
783 784 785 786 787 788 789
# With a build on a Windows POSIX layer (Cygwin or Mingw), we know for a fact
# that two files get produced, {shlibname}.dll and {libname}.dll.a.
# With all other Unix platforms, we often build a shared library with the
# SO version built into the file name and a symlink without the SO version
# It's not necessary to have both as targets.  The choice falls on the
# simplest, {libname}\$(SHLIB_EXT_SIMPLE).a for Windows POSIX layers and
# {libname}\$(SHLIB_EXT_SIMPLE) for the Unix platforms.
790
$shlibtarget: $lib\$(LIB_EXT) $deps $ordinalsfile
791
	\$(MAKE) -f \$(SRCDIR)/Makefile.shared -e \\
792
		PLATFORM=\$(PLATFORM) \\
793
		PERL=\$(PERL) SRCDIR="\$(SRCDIR)" DSTDIR="$libd" \\
794 795 796 797 798 799 800
		INSTALLTOP="\$(INSTALLTOP)" LIBDIR="\$(LIBDIR)" \\
		LIBDEPS="\$(PLIB_LDFLAGS) $linklibs \$(EX_LIBS)" \\
		LIBNAME=$libname LIBVERSION=\$(SHLIB_MAJOR).\$(SHLIB_MINOR) \\
		LIBCOMPATVERSIONS=";\$(SHLIB_VERSION_HISTORY)" \\
		CC="\$(CC)" CFLAGS="\$(CFLAGS)" LDFLAGS="\$(LDFLAGS)" \\
		CROSS_COMPILE="\$(CROSS_COMPILE)" \\
		SHARED_LDFLAGS="\$(SHARED_LDFLAGS)" SHLIB_EXT=\$(SHLIB_EXT) \\
801
		SHARED_RCFLAGS="\$(SHARED_RCFLAGS)" \\
802
		link_a.$shlib_target
803 804 805 806 807 808
EOF
	  . (windowsdll() ? <<"EOF" : "");
	rm -f apps/$shlib\$(SHLIB_EXT)
	rm -f test/$shlib\$(SHLIB_EXT)
	cp -p $shlib\$(SHLIB_EXT) apps/
	cp -p $shlib\$(SHLIB_EXT) test/
809 810 811 812 813 814 815 816 817 818 819 820
EOF
  }
  sub obj2dynlib {
      my %args = @_;
      my $lib = $args{lib};
      my $libd = dirname($lib);
      my $libn = basename($lib);
      (my $libname = $libn) =~ s/^lib//;
      my $shlibdeps = join("", map { my $d = dirname($_);
                                     my $f = basename($_);
                                     (my $l = $f) =~ s/^lib//;
                                     " -L$d -l$l" } @{$args{deps}});
821
      my $deps = join(" ",compute_lib_depends(@{$args{deps}}));
822 823 824 825 826
      my $shlib_target = $target{shared_target};
      my $objs = join(" ", map { $_."\$(OBJ_EXT)" } @{$args{objs}});
      return <<"EOF";
$lib\$(SHLIB_EXT_SIMPLE): $objs $deps
	\$(MAKE) -f \$(SRCDIR)/Makefile.shared -e \\
827 828 829 830 831 832
		PLATFORM=\$(PLATFORM) \\
		PERL=\$(PERL) SRCDIR="\$(SRCDIR)" DSTDIR="$libd" \\
		LIBDEPS="\$(PLIB_LDFLAGS) $shlibdeps \$(EX_LIBS)" \\
		LIBNAME=$libname LDFLAGS="\$(LDFLAGS)" \\
		CC="\$(CC)" CFLAGS="\$(CFLAGS)" \\
		SHARED_LDFLAGS="\$(SHARED_LDFLAGS)" \\
833 834
		SHLIB_EXT=\$(SHLIB_EXT_SIMPLE) \\
		LIBEXTRAS="$objs" \\
835
		link_o.$shlib_target
836 837 838 839 840 841 842
EOF
  }
  sub obj2lib {
      my %args = @_;
      my $lib = $args{lib};
      my $objs = join(" ", map { $_."\$(OBJ_EXT)" } @{$args{objs}});
      return <<"EOF";
843
$lib\$(LIB_EXT): $objs
844 845 846 847 848 849 850 851 852 853
	\$(AR) \$\@ $objs
	\$(RANLIB) \$\@ || echo Never mind.
EOF
  }
  sub obj2bin {
      my %args = @_;
      my $bin = $args{bin};
      my $bind = dirname($bin);
      my $binn = basename($bin);
      my $objs = join(" ", map { $_."\$(OBJ_EXT)" } @{$args{objs}});
854 855 856 857 858 859
      my $deps = join(" ",compute_lib_depends(@{$args{deps}}));
      my $linklibs = join("", map { my $d = dirname($_);
                                    my $f = basename($_);
                                    $d = "." if $d eq $f;
                                    (my $l = $f) =~ s/^lib//;
                                    " -L$d -l$l" } @{$args{deps}});
860 861
      my $shlib_target = $config{no_shared} ? "" : $target{shared_target};
      return <<"EOF";
862
$bin\$(EXE_EXT): $objs $deps
863 864
	\$(RM) $bin\$(EXE_EXT)
	\$(MAKE) -f \$(SRCDIR)/Makefile.shared -e \\
865
		PERL=\$(PERL) SRCDIR=\$(SRCDIR) \\
866
		APPNAME=$bin OBJECTS="$objs" \\
867
		LIBDEPS="\$(PLIB_LDFLAGS) $linklibs \$(EX_LIBS)" \\
868 869
		CC="\$(CC)" CFLAGS="\$(CFLAGS)" LDFLAGS="\$(LDFLAGS)" \\
		LIBRPATH="\$(INSTALLTOP)/\$(LIBDIR)" \\
870 871 872 873 874 875 876 877 878 879 880
		link_app.$shlib_target
EOF
  }
  sub in2script {
      my %args = @_;
      my $script = $args{script};
      my $sources = join(" ", @{$args{sources}});
      my $dofile = abs2rel(rel2abs(catfile($config{sourcedir},
                                           "util", "dofile.pl")),
                           rel2abs($config{builddir}));
      return <<"EOF";
881
$script: $sources
882
	\$(PERL) "-I\$(BLDDIR)" -Mconfigdata "$dofile" \\
883
	    "-o$target{build_file}" $sources > "$script"
884 885 886 887 888
	chmod a+x $script
EOF
  }
  ""    # Important!  This becomes part of the template result.
-}