unix-Makefile.tmpl 34.4 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
##
## 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}}) -}
40 41 42 43
DEPS={- join(" ", map { (my $x = $_) =~ s|\.o$|\$(DEP_EXT)|; $x; }
                  grep { $unified_info{sources}->{$_}->[0] =~ /\.c$/ }
                  keys %{$unified_info{sources}}); -}

44 45 46 47 48
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

49 50
# DESTDIR is for package builders so that they can configure for, say,
# /usr/ and yet have everything installed to /tmp/somedir/usr/.
51
# Normally it is left empty.
52
DESTDIR=
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 85 86 87 88

# 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") -}

89
MANDIR=$(INSTALLTOP)/share/man
90 91
DOCDIR=$(INSTALLTOP)/share/doc/$(BASENAME)
HTMLDIR=$(DOCDIR)/html
92

R
Richard Levitte 已提交
93 94 95 96
# 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=
97 98 99 100 101 102
HTMLSUFFIX=html



CROSS_COMPILE= {- $config{cross_compile_prefix} -}
CC= $(CROSS_COMPILE){- $target{cc} -}
103 104
CFLAGS={- our $cflags2 = join(" ",(map { "-D".$_} @{$config{defines}}),"-DOPENSSLDIR=\"\\\"\$(OPENSSLDIR)\\\"\"","-DENGINESDIR=\"\\\"\$(ENGINESDIR)\\\"\"") -} {- $config{cflags} -}
CFLAGS_Q={- $cflags2 =~ s|([\\"])|\\$1|g; $cflags2 -} {- $config{cflags} -}
105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121
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)" : "") -}
122
SHARED_RCFLAGS={- $target{shared_rcflag} -}
123 124 125 126 127 128 129 130 131 132

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} -}
133
MAKEDEPEND=$(CROSS_COMPILE){- $config{makedepprog} -}
134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153

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 ###################################################

154
all: configdata.pm build_libs_nodep build_engines_nodep build_apps_nodep \
155
     depend link-utils
156

157
build_libs: configdata.pm build_libs_nodep depend
158
build_libs_nodep: libcrypto.pc libssl.pc openssl.pc
159
build_engines: configdata.pm build_engines_nodep depend
160
build_engines_nodep: $(ENGINES)
161
build_apps: configdata.pm build_apps_nodep depend
162
build_apps_nodep: $(PROGRAMS) $(SCRIPTS)
163
build_tests: configdata.pm build_tests_nodep depend
164
build_tests_nodep: $(TESTPROGS)
165

166
test tests: build_tests_nodep build_apps_nodep build_engines_nodep depend rehash
167 168 169
	( cd test; \
	  SRCTOP=../$(SRCDIR) \
	  BLDTOP=../$(BLDDIR) \
170
	  EXE_EXT=$(EXE_EXT) \
171 172 173 174 175 176 177 178
	    $(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)'`

179
install: install_sw install_ssldirs install_docs
180 181 182 183 184 185 186 187 188 189 190 191 192

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)

193 194 195 196
# This exists solely for those who still type 'make depend'
depend: Makefile
Makefile: FORCE
	@( sed -e '/^# DO NOT DELETE THIS LINE.*/,$$d' < Makefile; \
197 198
	  echo '# DO NOT DELETE THIS LINE -- make depend depends on it.'; \
	  echo; \
199 200 201 202 203 204
	  for d in $(DEPS); do \
	    if [ -f $$d ]; then cat $$d; fi; \
	  done ) > Makefile.new
	@if ! cmp Makefile.new Makefile >/dev/null 2>&1; then \
		mv -f Makefile.new Makefile; \
	fi
205 206 207 208 209 210 211 212 213 214

# 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
215
	$(RM) -r -v $(DESTDIR)$(DOCDIR)
216

217 218 219 220
install_ssldirs:
	@$(PERL) $(SRCDIR)/util/mkdir-p.pl $(DESTDIR)$(OPENSSLDIR)/certs
	@$(PERL) $(SRCDIR)/util/mkdir-p.pl $(DESTDIR)$(OPENSSLDIR)/private

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

uninstall_dev:
	@echo "*** Uninstalling development files"
	@set -e; for i in $(SRCDIR)/include/openssl/*.h \
			  $(BLDDIR)/include/openssl/*.h; do \
		fn=`basename $$i`; \
280 281
		echo "$(RM) $(DESTDIR)$(INSTALLTOP)/include/openssl/$$fn"; \
		$(RM) $(DESTDIR)$(INSTALLTOP)/include/openssl/$$fn; \
282 283 284
	done
	@set -e; for l in $(LIBS); do \
		fn=`basename $$l`; \
285 286
		echo "$(RM) $(DESTDIR)$(INSTALLTOP)/$(LIBDIR)/$$fn"; \
		$(RM) $(DESTDIR)$(INSTALLTOP)/$(LIBDIR)/$$fn; \
287 288 289 290 291
	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); \
292 293
			echo "$(RM) $(DESTDIR)$(INSTALLTOP)/$(LIBDIR)/$$fn2"; \
			$(RM) $(DESTDIR)$(INSTALLTOP)/$(LIBDIR)/$$fn2; \
294
		fi; \
295 296
		echo "$(RM) $(DESTDIR)$(INSTALLTOP)/$(LIBDIR)/$$fn"; \
		$(RM) $(DESTDIR)$(INSTALLTOP)/$(LIBDIR)/$$fn; \
297
		: {- output_off() unless windowsdll(); "" -}; \
298 299
		echo "$(RM) $(DESTDIR)$(INSTALLTOP)/$(LIBDIR)/$$fn.a"; \
		$(RM) $(DESTDIR)$(INSTALLTOP)/$(LIBDIR)/$$fn.a; \
300
		: {- output_on() unless windowsdll(); "" -}; \
301
	done
302 303 304 305 306 307
	@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
308 309 310

install_engines:
	@[ -n "$(INSTALLTOP)" ] || (echo INSTALLTOP should not be empty; exit 1)
311
	@$(PERL) $(SRCDIR)/util/mkdir-p.pl $(DESTDIR)$(INSTALLTOP)/$(LIBDIR)/engines/
312 313 314
	@echo "*** Installing engines"
	@set -e; for e in $(ENGINES); do \
		fn=`basename $$e`; \
315 316 317 318
		if [ "$$fn" = '{- dso("ossltest") -}' ]; then \
			continue; \
		fi; \
		echo "install $$e -> $(DESTDIR)$(INSTALLTOP)/$(LIBDIR)/engines/$$fn"; \
319 320 321 322
		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; \
323 324 325 326 327 328
	done

uninstall_engines:
	@echo "*** Uninstalling engines"
	@set -e; for e in $(ENGINES); do \
		fn=`basename $$e`; \
329 330 331 332
		if [ "$$fn" = '{- dso("ossltest") -}' ]; then \
			continue; \
		fi; \
		echo "$(RM) $(DESTDIR)$(INSTALLTOP)/$(LIBDIR)/engines/$$fn"; \
333
		$(RM) $(DESTDIR)$(INSTALLTOP)/$(LIBDIR)/engines/$$fn; \
334 335 336 337
	done

install_runtime:
	@[ -n "$(INSTALLTOP)" ] || (echo INSTALLTOP should not be empty; exit 1)
338 339
	@$(PERL) $(SRCDIR)/util/mkdir-p.pl $(DESTDIR)$(INSTALLTOP)/bin
	@$(PERL) $(SRCDIR)/util/mkdir-p.pl $(DESTDIR)$(OPENSSLDIR)/misc
340
	@echo "*** Installing runtime files"
341 342 343
	: {- output_off() unless windowsdll(); "" -};
	@set -e; for s in $(SHLIBS); do \
		fn=`basename $$i`; \
344 345 346 347 348
		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; \
349
	done
350
	: {- output_on() unless windowsdll(); "" -};
351 352
	@set -e; for x in $(PROGRAMS); do \
		fn=`basename $$x`; \
353 354 355 356 357
		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; \
358 359 360
	done
	@set -e; for x in $(BIN_SCRIPTS); do \
		fn=`basename $$x`; \
361 362 363 364 365
		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; \
366 367 368
	done
	@set -e; for x in $(MISC_SCRIPTS); do \
		fn=`basename $$x`; \
369 370 371 372 373
		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; \
374
	done
375 376 377 378
	@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
379 380 381 382 383 384

uninstall_runtime:
	@echo "*** Uninstalling runtime files"
	@set -e; for x in $(PROGRAMS); \
	do  \
		fn=`basename $$x`; \
385 386
		echo "$(RM) $(DESTDIR)$(INSTALLTOP)/bin/$$fn"; \
		$(RM) $(DESTDIR)$(INSTALLTOP)/bin/$$fn; \
387 388 389 390
	done;
	@set -e; for x in $(BIN_SCRIPTS); \
	do  \
		fn=`basename $$x`; \
391 392
		echo "$(RM) $(DESTDIR)$(INSTALLTOP)/bin/$$fn"; \
		$(RM) $(DESTDIR)$(INSTALLTOP)/bin/$$fn; \
393 394 395 396
	done
	@set -e; for x in $(MISC_SCRIPTS); \
	do  \
		fn=`basename $$x`; \
397 398
		echo "$(RM) $(DESTDIR)$(OPENSSLDIR)/misc/$$fn"; \
		$(RM) $(DESTDIR)$(OPENSSLDIR)/misc/$$fn; \
399
	done
400 401 402
	: {- output_off() unless windowsdll(); "" -};
	@set -e; for s in $(SHLIBS); do \
		fn=`basename $$i`; \
403 404
		echo "$(RM) $(DESTDIR)$(INSTALLTOP)/bin/$$fn"; \
		$(RM) $(DESTDIR)$(INSTALLTOP)/bin/$$fn; \
405
	done
406
	: {- output_on() unless windowsdll(); "" -};
407
	$(RM) $(DESTDIR)$(OPENSSLDIR)/openssl.cnf
408 409 410 411 412 413 414 415 416 417 418 419 420 421 422 423 424 425 426 427 428 429 430 431 432 433 434 435 436 437

# 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 \
438 439 440 441 442 443 444 445
		      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 \
446 447 448 449 450 451 452 453 454 455 456 457 458 459 460 461 462 463 464 465 466 467
			  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 \
468 469 470 471 472 473 474 475
		    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 \
476 477 478 479
			echo "$(RM) $$top/man$$SEC/$$n$$suf"; \
			$(RM) $$top/man$$SEC/$$n$$suf; \
		    fi; \
		done; \
480
		( $(RMDIR) $$top/man$$SEC 2>/dev/null || exit 0 ); \
481 482 483 484 485 486 487 488
	    done; \
	done

install_man_docs:
	@[ -n "$(INSTALLTOP)" ] || (echo INSTALLTOP should not be empty; exit 1)
	@echo "*** Installing manpages"
	@\
	OUTSUFFIX='.$${SEC}$(MANSUFFIX)'; \
489
	OUTTOP="$(DESTDIR)$(MANDIR)"; \
490 491 492 493 494 495 496
	GENERATE='pod2man --name=$$NAME --section=$$SEC --center=OpenSSL --release=$(VERSION)'; \
	$(PROCESS_PODS)

uninstall_man_docs:
	@echo "*** Uninstalling manpages"
	@\
	OUTSUFFIX='.$${SEC}$(MANSUFFIX)'; \
497
	OUTTOP="$(DESTDIR)$(MANDIR)"; \
498 499 500 501 502 503 504
	$(UNINSTALL_DOCS)

install_html_docs:
	@[ -n "$(INSTALLTOP)" ] || (echo INSTALLTOP should not be empty; exit 1)
	@echo "*** Installing HTML manpages"
	@\
	OUTSUFFIX='.$(HTMLSUFFIX)'; \
505
	OUTTOP="$(DESTDIR)$(HTMLDIR)"; \
506 507 508 509 510 511 512 513 514
	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)'; \
515
	OUTTOP="$(DESTDIR)$(HTMLDIR)"; \
516 517 518 519 520
	$(UNINSTALL_DOCS)


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

521 522 523
update: generate errors ordinals

generate: generate_apps generate_crypto_bn generate_crypto_objects
524 525 526 527 528 529 530 531 532 533 534 535

# 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)

536
generate_apps: $(SRCDIR)/apps/openssl-vms.cnf $(SRCDIR)/apps/progs.h
537 538 539 540 541 542 543

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

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 582 583 584 585 586 587 588 589 590 591 592 593 594 595 596
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 #####################################################

597
rehash: link-utils copy-certs build_apps_nodep
598 599 600 601 602 603 604 605 606 607 608 609
	@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

610
$(BLDDIR)/util/opensslwrap.sh: configdata.pm
611 612 613 614
	@if [ "$(SRCDIR)" != "$(BLDDIR)" ]; then \
	    mkdir -p "$(BLDDIR)/util"; \
	    ln -sf "../$(SRCDIR)/util/opensslwrap.sh" "$(BLDDIR)/util"; \
	fi
615
$(BLDDIR)/util/shlib_wrap.sh: configdata.pm
616 617 618 619 620 621 622 623 624 625
	@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

626 627 628 629
$(SRCDIR)/apps/openssl-vms.cnf: $(SRCDIR)/apps/openssl.cnf
	$(PERL) $(SRCDIR)/VMS/VMSify-conf.pl \
                < $(SRCDIR)/apps/openssl.cnf > $(SRCDIR)/apps/openssl-vms.cnf

630 631 632 633 634 635 636 637 638 639 640
{- # 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) -} > $@

641 642 643 644 645 646 647 648 649 650 651 652 653 654 655 656 657 658 659 660 661 662 663 664 665 666 667 668
$(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

669
FORCE:
670 671 672

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

673
libcrypto.pc libssl.pc openssl.pc: configdata.pm $(LIBS)
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 715
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.
716 717
configdata.pm: {- $config{build_file_template} -} $(SRCDIR)/Configure $(SRCDIR)/config
	@echo "Detected changed: $?"
718 719 720 721 722 723 724 725 726 727 728 729
	@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/;
730 731 732 733 734 735 736 737 738 739 740 741 742 743 744 745 746 747 748 749

  # 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)"
		   } } @_;
  }

750
  sub src2obj {
751
      my %args = @_;
752
      my $obj = $args{obj};
753
      my $srcs = join(" ", @{$args{srcs}});
754
      my $deps = join(" ", @{$args{srcs}}, @{$args{deps}});
755 756 757 758
      my $incs = join(" ", map { " -I".$_ } @{$args{incs}});
      my $makedepprog = $config{makedepprog};
      if ($makedepprog eq "makedepend") {
          return <<"EOF";
759
$obj\$(DEP_EXT): $deps
760
	rm -f \$\@.tmp; touch \$\@.tmp
761
	\$(MAKEDEPEND) -f\$\@.tmp -o"|$obj" -- \$(CFLAGS)$incs -- $srcs \\
762 763
	    2>/dev/null
	sed -e 's/^.*|//' -e 's/ \\/\\(\\\\.\\|[^ ]\\)*//g' -e '/: *\$\$/d' -e '/^\\(#.*\\| *\\)\$\$/d' \$\@.tmp > \$\@
764
	rm \$\@.tmp
765 766
$obj\$(OBJ_EXT): $obj\$(DEP_EXT)
	\$(CC) \$(CFLAGS)$incs -c -o \$\@ $srcs
767 768 769
EOF
      }
      return <<"EOF";
770
$obj\$(DEP_EXT): $deps
771
	\$(CC) \$(CFLAGS)$incs -MM -MF \$\@ -MQ $obj $srcs
772
$obj\$(OBJ_EXT): $obj\$(DEP_EXT)
773 774 775 776 777 778 779 780 781 782 783 784 785
	\$(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//;
786 787 788 789 790
      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}}));
791 792
      my $shlib_target = $target{shared_target};
      my $ordinalsfile = defined($args{ordinals}) ? $args{ordinals}->[1] : "";
793 794
      my $shlibtarget = windowsdll() ?
	  "$lib\$(SHLIB_EXT_SIMPLE).a" : "$shlib\$(SHLIB_EXT_SIMPLE)";
795
      return <<"EOF"
796 797 798 799 800 801 802
# 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.
803
$shlibtarget: $lib\$(LIB_EXT) $deps $ordinalsfile
804
	\$(MAKE) -f \$(SRCDIR)/Makefile.shared -e \\
805
		PLATFORM=\$(PLATFORM) \\
806
		PERL=\$(PERL) SRCDIR="\$(SRCDIR)" DSTDIR="$libd" \\
807 808 809 810 811 812 813
		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) \\
814
		SHARED_RCFLAGS="\$(SHARED_RCFLAGS)" \\
815
		link_a.$shlib_target
816 817 818 819 820 821
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/
822 823 824 825 826 827 828 829 830 831 832 833
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}});
834
      my $deps = join(" ",compute_lib_depends(@{$args{deps}}));
835 836 837 838 839
      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 \\
840 841 842 843 844 845
		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)" \\
846 847
		SHLIB_EXT=\$(SHLIB_EXT_SIMPLE) \\
		LIBEXTRAS="$objs" \\
848
		link_o.$shlib_target
849 850 851 852 853 854 855
EOF
  }
  sub obj2lib {
      my %args = @_;
      my $lib = $args{lib};
      my $objs = join(" ", map { $_."\$(OBJ_EXT)" } @{$args{objs}});
      return <<"EOF";
856
$lib\$(LIB_EXT): $objs
857 858 859 860 861 862 863 864 865 866
	\$(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}});
867 868 869 870 871 872
      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}});
873 874
      my $shlib_target = $config{no_shared} ? "" : $target{shared_target};
      return <<"EOF";
875
$bin\$(EXE_EXT): $objs $deps
876 877
	\$(RM) $bin\$(EXE_EXT)
	\$(MAKE) -f \$(SRCDIR)/Makefile.shared -e \\
878
		PERL=\$(PERL) SRCDIR=\$(SRCDIR) \\
879
		APPNAME=$bin OBJECTS="$objs" \\
880
		LIBDEPS="\$(PLIB_LDFLAGS) $linklibs \$(EX_LIBS)" \\
881 882
		CC="\$(CC)" CFLAGS="\$(CFLAGS)" LDFLAGS="\$(LDFLAGS)" \\
		LIBRPATH="\$(INSTALLTOP)/\$(LIBDIR)" \\
883 884 885 886 887 888 889 890 891 892 893
		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";
894
$script: $sources
895
	\$(PERL) "-I\$(BLDDIR)" -Mconfigdata "$dofile" \\
896
	    "-o$target{build_file}" $sources > "$script"
897 898 899 900 901
	chmod a+x $script
EOF
  }
  ""    # Important!  This becomes part of the template result.
-}