Skip to content

Commit

Permalink
Clean up exporters, specifically those we have for pkg-config
Browse files Browse the repository at this point in the history
The pkg-config exporters were a special hack, all in
Configurations/unix-Makefile.tmpl, and this was well and good as long
as that was the only main package interface configuration system that we
cared about.

Things have changed, though, so we move the pkg-config production to be
templatable in a more flexible manner.  Additional templates for other
interface configuration systems can then be added fairly easily.

Two variants of the .pc files are produced:

- Those in 'exporters/' are installed in the location that 'pkg-config'
  itself prefers for installed packages.
- Those in the top directory are to be used when it's desirable to build
  directly against an OpenSSL build tree.

Reviewed-by: Paul Dale <pauli@openssl.org>
Reviewed-by: Tomas Mraz <tomas@openssl.org>
(Merged from #20878)
  • Loading branch information
levitte committed Nov 15, 2023
1 parent fe48760 commit 2ac569a
Show file tree
Hide file tree
Showing 8 changed files with 150 additions and 70 deletions.
7 changes: 6 additions & 1 deletion .gitignore
Original file line number Diff line number Diff line change
Expand Up @@ -6,13 +6,18 @@
/Makefile
/MINFO
/TABLE
/*.pc
/rehash.time
/inc.*
/makefile.*
/out.*
/tmp.*
/configdata.pm
/builddata.pm
/installdata.pm

# Exporters
/*.pc
/exporters/*.pc

# Links under apps
/apps/CA.pl
Expand Down
90 changes: 21 additions & 69 deletions Configurations/unix-Makefile.tmpl
Original file line number Diff line number Diff line change
Expand Up @@ -199,6 +199,12 @@ INSTALL_PROGRAMS={-
grep { !$unified_info{attributes}->{programs}->{$_}->{noinst} }
@{$unified_info{programs}}))
-}
INSTALL_EXPORTERS_PKGCONFIG={-
join(" \\\n" . ' ' x 28,
fill_lines(" ", $COLUMNS - 28,
grep { $unified_info{attributes}->{generate}->{$_}->{exporter} eq 'pkg-config'}
sort keys %{$unified_info{generate}}))
-}
BIN_SCRIPTS={-
join(" \\\n" . ' ' x 12,
fill_lines(" ", $COLUMNS - 12,
Expand Down Expand Up @@ -320,6 +326,8 @@ BINDIR={- our $bindir = $config{bindir};
bindir={- file_name_is_absolute($bindir)
? $bindir : '$(INSTALLTOP)/$(BINDIR)' -}

PKGCONFIGDIR=$(libdir)/pkgconfig

MANDIR=$(INSTALLTOP)/share/man
DOCDIR=$(INSTALLTOP)/share/doc/$(BASENAME)
HTMLDIR=$(DOCDIR)/html
Expand Down Expand Up @@ -521,7 +529,7 @@ build_man_docs: $(MANDOCS1) $(MANDOCS3) $(MANDOCS5) $(MANDOCS7) ## Create manpag
build_html_docs: $(HTMLDOCS1) $(HTMLDOCS3) $(HTMLDOCS5) $(HTMLDOCS7) ## Create HTML documentation

build_generated: $(GENERATED_MANDATORY)
build_libs_nodep: libcrypto.pc libssl.pc openssl.pc
build_libs_nodep: $(LIBS) {- join(" ",map { platform->sharedlib_simple($_) // platform->sharedlib_import($_) // platform->sharedlib($_) // () } @{$unified_info{libraries}}) -}
build_modules_nodep: $(MODULES)
build_programs_nodep: $(PROGRAMS) $(SCRIPTS)

Expand Down Expand Up @@ -606,7 +614,6 @@ clean: libclean ## Clean the workspace, keep the configuration
$(RM) tags TAGS doc-nits md-nits
$(RM) -r test/test-runs
$(RM) providers/fips*.new
$(RM) openssl.pc libcrypto.pc libssl.pc
-find . -type l \! -name '.*' -exec $(RM) {} \;

distclean: clean ## Clean and remove the configuration
Expand Down Expand Up @@ -776,16 +783,13 @@ install_dev: install_runtime_libs
: {- output_off() if sharedaix(); output_on(); "" -}; \
done
@ : {- output_on() if $disabled{shared}; "" -}
@$(PERL) $(SRCDIR)/util/mkdir-p.pl "$(DESTDIR)$(libdir)/pkgconfig"
@$(ECHO) "install libcrypto.pc -> $(DESTDIR)$(libdir)/pkgconfig/libcrypto.pc"
@cp libcrypto.pc "$(DESTDIR)$(libdir)/pkgconfig"
@chmod 644 "$(DESTDIR)$(libdir)/pkgconfig/libcrypto.pc"
@$(ECHO) "install libssl.pc -> $(DESTDIR)$(libdir)/pkgconfig/libssl.pc"
@cp libssl.pc "$(DESTDIR)$(libdir)/pkgconfig"
@chmod 644 "$(DESTDIR)$(libdir)/pkgconfig/libssl.pc"
@$(ECHO) "install openssl.pc -> $(DESTDIR)$(libdir)/pkgconfig/openssl.pc"
@cp openssl.pc "$(DESTDIR)$(libdir)/pkgconfig"
@chmod 644 "$(DESTDIR)$(libdir)/pkgconfig/openssl.pc"
@$(PERL) $(SRCDIR)/util/mkdir-p.pl "$(DESTDIR)$(PKGCONFIGDIR)"
@for e in $(INSTALL_EXPORTERS_PKGCONFIG); do \
fn=`basename $$e`; \
$(ECHO) "install $$e -> $(DESTDIR)$(PKGCONFIGDIR)/$$fn"; \
cp $$e "$(DESTDIR)$(PKGCONFIGDIR)/$$fn"; \
chmod 644 "$(DESTDIR)$(PKGCONFIGDIR)/$$fn"; \
done

uninstall_dev: uninstall_runtime_libs
@$(ECHO) "*** Uninstalling development files"
Expand Down Expand Up @@ -829,10 +833,11 @@ uninstall_dev: uninstall_runtime_libs
: {- output_on() unless windowsdll(); "" -}; \
done
@ : {- output_on() if $disabled{shared}; "" -}
$(RM) "$(DESTDIR)$(libdir)/pkgconfig/libcrypto.pc"
$(RM) "$(DESTDIR)$(libdir)/pkgconfig/libssl.pc"
$(RM) "$(DESTDIR)$(libdir)/pkgconfig/openssl.pc"
-$(RMDIR) "$(DESTDIR)$(libdir)/pkgconfig"
@for e in $(INSTALL_EXPORTERS_PKGCONFIG); do \
fn=`basename "$$e"`; \
$(RM) "$(DESTDIR)$(PKGCONFIGDIR)/$$fn"; \
done
-$(RMDIR) "$(DESTDIR)$(PKGCONFIGDIR)"
-$(RMDIR) "$(DESTDIR)$(libdir)"

_install_modules_deps: install_runtime_libs build_modules
Expand Down Expand Up @@ -1435,59 +1440,6 @@ FORCE:

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

libcrypto.pc libssl.pc openssl.pc: Makefile $(LIBS) {- join(" ",map { platform->sharedlib_simple($_) // platform->sharedlib_import($_) // platform->sharedlib($_) // () } @{$unified_info{libraries}}) -}

libcrypto.pc:
@ ( echo 'prefix=$(INSTALLTOP)'; \
echo 'exec_prefix=$${prefix}'; \
if [ -n "$(LIBDIR)" ]; then \
echo 'libdir=$${exec_prefix}/$(LIBDIR)'; \
else \
echo 'libdir=$(libdir)'; \
fi; \
echo 'includedir=$${prefix}/include'; \
echo 'enginesdir=$${libdir}/engines-{- $sover_dirname -}'; \
echo 'modulesdir=$${libdir}/ossl-modules'; \
echo ''; \
echo 'Name: OpenSSL-libcrypto'; \
echo 'Description: OpenSSL cryptography library'; \
echo 'Version: '$(VERSION); \
echo 'Libs: -L$${libdir} -lcrypto'; \
echo 'Libs.private: $(LIB_EX_LIBS)'; \
echo 'Cflags: -I$${includedir}' ) > libcrypto.pc

libssl.pc:
@ ( echo 'prefix=$(INSTALLTOP)'; \
echo 'exec_prefix=$${prefix}'; \
if [ -n "$(LIBDIR)" ]; then \
echo 'libdir=$${exec_prefix}/$(LIBDIR)'; \
else \
echo 'libdir=$(libdir)'; \
fi; \
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 'Cflags: -I$${includedir}' ) > libssl.pc

openssl.pc:
@ ( echo 'prefix=$(INSTALLTOP)'; \
echo 'exec_prefix=$${prefix}'; \
if [ -n "$(LIBDIR)" ]; then \
echo 'libdir=$${exec_prefix}/$(LIBDIR)'; \
else \
echo 'libdir=$(libdir)'; \
fi; \
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

Makefile: configdata.pm \
{- join(" \\\n" . ' ' x 10,
fill_lines(" ", $COLUMNS - 10,
Expand Down
17 changes: 17 additions & 0 deletions build.info
Original file line number Diff line number Diff line change
Expand Up @@ -8,6 +8,7 @@ ENDIF
IF[{- !$disabled{'deprecated-3.0'} -}]
SUBDIRS=engines
ENDIF
SUBDIRS=exporters

LIBS=libcrypto libssl
INCLUDE[libcrypto]=. include
Expand Down Expand Up @@ -99,3 +100,19 @@ IF[{- $config{target} =~ /^(?:Cygwin|mingw|VC-|BC-)/ -}]
SHARED_SOURCE[libcrypto]=libcrypto.rc
SHARED_SOURCE[libssl]=libssl.rc
ENDIF

# This file sets the build directory up for pkg-config
GENERATE[libcrypto.pc]=exporters/pkg-config/libcrypto.pc.in
DEPEND[libcrypto.pc]=builddata.pm
GENERATE[libssl.pc]=exporters/pkg-config/libssl.pc.in
DEPEND[libssl.pc]=builddata.pm
GENERATE[openssl.pc]=exporters/pkg-config/openssl.pc.in
DEPEND[openssl.pc]=builddata.pm
DEPEND[openssl.pc]=libcrypto.pc libssl.pc

GENERATE[builddata.pm]=util/mkinstallvars.pl \
PREFIX=. BINDIR=apps LIBDIR= INCLUDEDIR=include APPLINKDIR=ms \
ENGINESDIR=engines MODULESDIR=providers \
"VERSION=$(VERSION)" "LDLIBS=$(LIB_EX_LIBS)"

DEPEND[""]=openssl.pc
16 changes: 16 additions & 0 deletions exporters/build.info
Original file line number Diff line number Diff line change
@@ -0,0 +1,16 @@
# For installation: libcrypto.pc, libssl.pc, and openssl.pc
GENERATE[libcrypto.pc]{exporter=pkg-config}=pkg-config/libcrypto.pc.in
DEPEND[libcrypto.pc]=../installdata.pm
GENERATE[libssl.pc]{exporter=pkg-config}=pkg-config/libssl.pc.in
DEPEND[libssl.pc]=../installdata.pm
GENERATE[openssl.pc]{exporter=pkg-config}=pkg-config/openssl.pc.in
DEPEND[openssl.pc]=../installdata.pm
DEPEND[openssl.pc]=libcrypto.pc libssl.pc

DEPEND[""]=openssl.pc

GENERATE[../installdata.pm]=../util/mkinstallvars.pl \
"PREFIX=$(INSTALLTOP)" BINDIR=bin "LIBDIR=$(LIBDIR)" \
INCLUDEDIR=include APPLINKDIR=include/openssl \
"ENGINESDIR=$(ENGINESDIR)" "MODULESDIR=$(MODULESDIR)" \
"VERSION=$(VERSION)" "LDLIBS=$(LIB_EX_LIBS)"
11 changes: 11 additions & 0 deletions exporters/pkg-config/libcrypto.pc.in
Original file line number Diff line number Diff line change
@@ -0,0 +1,11 @@
libdir={- $OpenSSL::safe::installdata::LIBDIR -}
includedir={- $OpenSSL::safe::installdata::INCLUDEDIR -}
enginesdir={- $OpenSSL::safe::installdata::ENGINESDIR -}
modulesdir={- $OpenSSL::safe::installdata::MODULESDIR -}

Name: OpenSSL-libcrypto
Description: OpenSSL cryptography library
Version: {- $OpenSSL::safe::installdata::VERSION -}
Libs: -L${libdir} -lcrypto
Libs.private: {- join(' ', @OpenSSL::safe::installdata::LDLIBS) -}
Cflags: -I${includedir}
9 changes: 9 additions & 0 deletions exporters/pkg-config/libssl.pc.in
Original file line number Diff line number Diff line change
@@ -0,0 +1,9 @@
libdir={- $OpenSSL::safe::installdata::LIBDIR -}
includedir={- $OpenSSL::safe::installdata::INCLUDEDIR -}

Name: OpenSSL-libssl
Description: Secure Sockets Layer and cryptography libraries
Version: {- $OpenSSL::safe::installdata::VERSION -}
Requires.private: libcrypto
Libs: -L${libdir} -lssl
Cflags: -I${includedir}
7 changes: 7 additions & 0 deletions exporters/pkg-config/openssl.pc.in
Original file line number Diff line number Diff line change
@@ -0,0 +1,7 @@
libdir={- $OpenSSL::safe::installdata::LIBDIR -}
includedir={- $OpenSSL::safe::installdata::INCLUDEDIR -}

Name: OpenSSL
Description: Secure Sockets Layer and cryptography libraries and tools
Version: {- $OpenSSL::safe::installdata::VERSION -}
Requires: libssl libcrypto
63 changes: 63 additions & 0 deletions util/mkinstallvars.pl
Original file line number Diff line number Diff line change
@@ -0,0 +1,63 @@
#! /usr/bin/env perl
# Copyright 2021 The OpenSSL Project Authors. All Rights Reserved.
#
# Licensed under the Apache License 2.0 (the "License"). You may not use
# this file except in compliance with the License. You can obtain a copy
# in the file LICENSE in the source distribution or at
# https://www.openssl.org/source/license.html

# All variables are supposed to come from Makefile, in environment variable
# form, or passed as variable assignments on the command line.
# The result is a Perl module creating the package OpenSSL::safe::installdata.

use File::Spec;

# These are expected to be set up as absolute directories
my @absolutes = qw(PREFIX);
# These may be absolute directories, and if not, they are expected to be set up
# as subdirectories to PREFIX
my @subdirs = qw(BINDIR LIBDIR INCLUDEDIR ENGINESDIR MODULESDIR APPLINKDIR);

my %keys = ();
foreach (@ARGV) {
(my $k, my $v) = m|^([^=]*)=(.*)$|;
$keys{$k} = 1;
$ENV{$k} = $v;
}
foreach my $k (sort keys %keys) {
my $v = $ENV{$k};
$v = File::Spec->rel2abs($v) if $v && grep { $k eq $_ } @absolutes;
$ENV{$k} = $v;
}
foreach my $k (sort keys %keys) {
my $v = $ENV{$k} || '.';
$v = File::Spec->rel2abs($v, $ENV{PREFIX})
if ($v && !File::Spec->file_name_is_absolute($v)
&& grep { $k eq $_ } @subdirs);
$ENV{$k} = $v;
}

print <<_____;
package OpenSSL::safe::installdata;
use strict;
use warnings;
use Exporter;
our \@ISA = qw(Exporter);
our \@EXPORT = qw(\$PREFIX \$BINDIR \$LIBDIR \$INCLUDEDIR \$APPLINKDIR
\$ENGINESDIR \$MODULESDIR \$VERSION \$LDLIBS);
our \$PREFIX = '$ENV{PREFIX}';
our \$BINDIR = '$ENV{BINDIR}';
our \$LIBDIR = '$ENV{LIBDIR}';
our \$INCLUDEDIR = '$ENV{INCLUDEDIR}';
our \$ENGINESDIR = '$ENV{ENGINESDIR}';
our \$MODULESDIR = '$ENV{MODULESDIR}';
our \$APPLINKDIR = '$ENV{APPLINKDIR}';
our \$VERSION = '$ENV{VERSION}';
our \@LDLIBS =
# Unix and Windows use space separation, VMS uses comma separation
split(/ +| *, */, '$ENV{LDLIBS}');
1;
_____

0 comments on commit 2ac569a

Please sign in to comment.