Skip to content

Commit

Permalink
Makefile_v1,README.md: major update with improved diagnostics
Browse files Browse the repository at this point in the history
  • Loading branch information
DDvO committed Oct 21, 2024
1 parent ca6a334 commit 8b38d7a
Show file tree
Hide file tree
Showing 2 changed files with 121 additions and 32 deletions.
146 changes: 116 additions & 30 deletions Makefile_v1
Original file line number Diff line number Diff line change
Expand Up @@ -12,58 +12,111 @@
#
# SPDX-License-Identifier: Apache-2.0

# Optional OPENSSL_DIR defines absolute or relative (to ../) path to OpenSSL installation
# Optional OPENSSL_LIB defines where to find the OpenSSL library installation (default: OPENSSL_DIR/lib).
# Optional OPENSSL_DIR defines where to find the OpenSSL installation
# with header files at include/openssl (default: will try, e.g., /usr).
# Optional OPENSSL_LIB defines where to find the OpenSSL libraries
# (default: will try, e.g., OPENSSL_DIR/lib).
# Optional CFLAGS and LDFLAGS are appended by local settings.
# Optional DEBUG_FLAGS may set to prepend to local CFLAGS and LDFLAGS (default see below).
# Builds are done in release mode if optional NDEBUG is defined.
# Optional OUT_DIR defines absolute or relative (to ./) path where to place the library.
# Optional OUT_DIR defines where to place the resulting library (default: '.').
# Optional DESTDIR defines a prefix for the installation target directories.
# All paths may be absolute or relative to the directory containing this Makefile.

SHELL=bash # This is needed for supporting extended file name globbing

# variables ####################################################################

ROOTFS ?= $(DESTDIR)$(prefix)

ifeq ($(OUT_DIR),)
override OUT_DIR = .
endif
override OUT_DIR ?= .

VERSION=2.0
# must be kept in sync with debian/changelog and CMakeLists.txt
# PACKAGENAME=libsecutils
# DIRNAME=$(PACKAGENAME)-$(VERSION)

SHELL=bash # This is needed for supporting extended file name globbing

ifeq ($(OS),Windows_NT)
# https://stackoverflow.com/questions/714100/os-detecting-makefile
ifeq ($(OS),Windows_NT) # strange but apparently this string is used also for all later versions
# so far, we do not support Windows, but trying to continue anyway
override OS=Windows
USERS='^([[:alpha:]]:)?\\Users\\'
EXE=.exe
DLL=.dll
SONAME=
LDD=TODO
OBJ=.obj
LIB=bin
else
EXE=
OBJ=.o
LIB=lib
override OS = $(shell sh -c 'uname 2>/dev/null || echo Unknown')
USERS='^/(home|Users)/'
ifeq ($(shell uname -s),Darwin)
OS=MacOS
override OS=MacOS
DLL=.dylib
SONAME=install_name,@rpath/
else # assuming Linux
LDD=otool -l
else # assuming other Unix-like
DLL=.so
SONAME=soname,
LDD=ldd
endif
endif

ifeq ($(OPENSSL_DIR),)
OPENSSL_DIR=$(ROOTFS)/usr
ifneq ($(filter-out doc install uninstall clean clean_config clean_all clean_uta clean_deb,$(MAKECMDGOALS)),)
ifeq ($(OPENSSL_DIR),) # for convenience, use heuristics to determine OPENSSL_DIR
ifeq ($(OS),MacOS)
SYSTEM_INCLUDE_OPENSSL=/opt/homebrew/include/openssl # usually symlink
else # TODO for Windows
SYSTEM_INCLUDE_OPENSSL=/usr/include/openssl
endif
OPENSSL_INCLUDE_DIR = $(realpath $(SYSTEM_INCLUDE_OPENSSL))
override OPENSSL_DIR = $(realpath $(OPENSSL_INCLUDE_DIR)/../..)
endif
ifeq ($(shell echo $(OPENSSL_DIR) | grep "^/"),)
# $(OPENSSL_DIR) is relative path, assumed relative to ../
OPENSSL=../$(OPENSSL_DIR)
OPENSSL_LIB ?= ../$(OPENSSL_DIR)
else
# $(OPENSSL_DIR) is absolute path
OPENSSL=$(OPENSSL_DIR)
OPENSSL_LIB ?= $(OPENSSL_DIR)
ifneq ($(OPENSSL_DIR),) # due to the above, always true
LIB_NAME_PATTERN=libcrypto*$(DLL)*
ifeq ($(realpath $(OPENSSL_DIR)),)
$(error OPENSSL_DIR appears to be an invalid path: $(OPENSSL_DIR))
endif
override OPENSSL_DIR := $(realpath $(OPENSSL_DIR))

ifeq ($(OPENSSL_LIB),) # for convenience, use heuristics to determine OPENSSL_LIB
override OPENSSL_LIB = $(OPENSSL_DIR)/$(LIB)
ifeq ($(wildcard $(OPENSSL_LIB)/$(LIB_NAME_PATTERN)),)
$(warning Warning: cannot find OpenSSL libraries at determined location $(OPENSSL_LIB), now trying $(OPENSSL_DIR))
override OPENSSL_LIB = $(OPENSSL_DIR)
ifeq ($(wildcard $(OPENSSL_LIB)/$(LIB_NAME_PATTERN)),)
ifeq ($(OS),Linux)
ifeq ($(shell echo $(OPENSSL_DIR) | grep -E '^/(home|Users)'),)
override OPENSSL_LIB = $(wildcard /lib/*linux-gnu*)
$(warning Warning: cannot find OpenSSL libraries at $(OPENSSL_DIR), now trying $(OPENSSL_LIB))
endif
endif
endif
endif
else
ifeq ($(wildcard $(OPENSSL_LIB)/$(LIB_NAME_PATTERN)),)
# $(warning Warning: cannot find OpenSSL libraries at given OPENSSL_LIB $(OPENSSL_LIB), now trying OPENSSL_DIR)
override OPENSSL_LIB = $(OPENSSL_DIR)
endif
endif
# ifeq ($(findstring $(USERS),$(OPENSSL_FULL_DIR)),)
# $(warning [DEBUG] OPENSSL_DIR is assumed to be an installation directory)
# else
# $(warning [DEBUG] OPENSSL_DIR is assumed to be a local build directory)
# endif
ifeq ($(wildcard $(OPENSSL_LIB)/$(LIB_NAME_PATTERN)),)
$(error Error: cannot find OpenSSL library $(LIB_NAME_PATTERN) at $(OPENSSL_LIB)/)
endif
override OPENSSL_LIB := $(realpath $(OPENSSL_LIB))
endif
ifeq ($(wildcard $(OPENSSL_DIR)/include/openssl),)
$(error cannot find directory '$(OPENSSL_DIR)/include/openssl', check OPENSSL_DIR variable)
endif
endif # neq ($(filter-out doc install uninstall clean clean_config clean_all clean_uta clean_deb,$(MAKECMDGOALS)),)


################################################################################
# Basic definitions targeted at debugging
Expand All @@ -73,10 +126,10 @@ endif
################################################################################

ifdef NDEBUG
DEBUG_FLAGS ?= -O2
override DEBUG_FLAGS ?= -O2
override DEBUG_FLAGS += -DNDEBUG=1 -Werror
else
DEBUG_FLAGS ?= -g -O0 -fsanitize=address -fsanitize=undefined -fno-sanitize-recover=all # not every compiler(version) supports -Og
override DEBUG_FLAGS ?= -g -O0 -fsanitize=address -fsanitize=undefined -fno-sanitize-recover=all # not every compiler(version) supports -Og
endif
override CFLAGS += $(DEBUG_FLAGS) \
-Wall -Woverflow -Wextra -Wswitch -Wmissing-prototypes -Wstrict-prototypes \
Expand All @@ -94,7 +147,7 @@ override CFLAGS += -pedantic -DPEDANTIC
################################################################################

CC ?= gcc
OUTLIB_=libsecutils
override OUTLIB_= libsecutils
OUTLIB=$(OUTLIB_)$(DLL)
ifeq ($(OS),MacOS)
OUTLIBV=$(OUTLIB_).$(VERSION)$(DLL)
Expand All @@ -109,7 +162,7 @@ DEST_DOC=$(DEST_PRE)/share/doc/libsecutils-dev
OUTBIN=icvutil$(EXE)
DEST_BIN=$(DEST_PRE)/bin
LOCAL_CFLAGS= -fPIC # -std=gnu90 TODO clean up code and re-enable flag
override CFLAGS += -isystem $(OPENSSL)/include# # # use of -isystem is critical for selecting wanted OpenSSL version
override CFLAGS += -isystem $(OPENSSL_DIR)/include# # use of -isystem is critical for selecting wanted OpenSSL version
override CFLAGS += -Isrc/libsecutils/include
override CFLAGS += -Isrc/libsecutils/include/secutils
ifneq ($(SECUTILS_USE_UTA),)
Expand All @@ -120,12 +173,9 @@ ifneq ($(SECUTILS_USE_ICV),)
endif

override LDFLAGS += $(DEBUG_FLAGS) # needed for -fsanitize=...
override LDFLAGS += -L $(OPENSSL_LIB) -L $(OPENSSL)
override LDFLAGS += -L $(OPENSSL_LIB)
ifeq ($(DEB_TARGET_ARCH),) # not during Debian packaging
override LDFLAGS += -Wl,-rpath,$(OPENSSL_LIB)
ifneq ($(OPENSSL_LIB),$(OPENSSL))
override LDFLAGS += -Wl,-rpath,$(OPENSSL)
endif
endif
ifneq ($(SECUTILS_USE_UTA),)
override LDFLAGS += -luta
Expand Down Expand Up @@ -167,12 +217,19 @@ OBJS := $(patsubst %.c,$(BUILDDIR)/%$(OBJ),$(notdir $(wildcard src/libsecutils/s
# Targets
################################################################################

# building #####################################################################

# Phony (non-file) targets
.PHONY: all doc util build build_only build_all clean clean_config clean_all clean_uta install uninstall deb clean_deb coverage

# Default target
all: build_all doc

ifneq ($(findstring build_only,$(MAKECMDGOALS)),)
$(info Build info: source directory is '$(PWD)')
$(info detected OpenSSL base directory '$(OPENSSL_DIR)')
$(info detected OpenSSL lib directory '$(OPENSSL_LIB)')
endif
build_only: $(OUT_DIR)/$(OUTLIB)

build:
Expand Down Expand Up @@ -212,7 +269,7 @@ endif
$(OUT_DIR)/$(OUTLIBV): $(OBJS)
$(CC) $(OBJS) $(LDFLAGS) -shared -o $@ -Wl,-$(SONAME)$(OUTLIBV)

$(OUT_DIR)/$(OUTLIB): $(OUT_DIR)/$(OUTLIBV)
$(OUT_DIR)/$(OUTLIB): $(OUT_DIR)/$(OUTLIBV) fix_build_lib
ln -sf $(OUTLIBV) $(OUT_DIR)/$(OUTLIB)

# Individual object targets; also provide dependencies on header files of the project (not on system headers)
Expand All @@ -232,6 +289,23 @@ $(BUILDDIR):
# (directories are flagged as changed on every object build)
$(OBJS): | $(BUILDDIR)

# workaround for using local OpenSSL builds by default expecting that
# its dynamic libs have been installed in ./$(LIB) when using the libs
# see for binaries that dynamically link to OpenSSL the output of $(LDD) <binary>
.PHONY: fix_build_lib
fix_build_lib:
ifneq ($(shell echo $(realpath $(OPENSSL_LIB)) | grep -E $(USERS)),)
ifeq ($(OPENSSL_LIB),$(OPENSSL_DIR))
@cd "$(OPENSSL_DIR)"; if [ ! -e lib ]; then ln -s . lib; fi
@ # alternative would be to use, e.g.,
@ # install_name_tool -change $(OPENSSL_DIR)/lib/libcrypto.3.dylib $(OPENSSL_DIR)/libcrypto.3.dylib <libname>
endif
endif
@true # prevent warning "Nothing to be done for `fix_build_lib'."


# Debian packaging #############################################################

deb:
debuild -e OPENSSL_DIR="$(OPENSSL_DIR)" -e OPENSSL_LIB="$(OPENSSL_LIB)" \
--preserve-envvar SECUTILS_NO_TLS \
Expand All @@ -248,6 +322,9 @@ clean_deb:
rm -fr _CPack_Packages changelog.gz
rm -f libsecutils*.{deb,tar.gz,zip}


# installation #################################################################

# installation target - append ROOTFS=<path> to install into virtual root
# filesystem
install: # doc/html $(OUT_DIR)/$(OUTLIB) $(OUT_DIR)/$(OUTBIN)
Expand Down Expand Up @@ -277,6 +354,9 @@ uninstall:
rm -f $(DEST_BIN)/$(OUTBIN)
rm -rf $(DEST_DOC)/doc/html


# cleaning #####################################################################

clean_uta:
rm -fr $(BUILDDIR)/uta_api$(OBJ) $(BUILDDIR)/files_icv$(OBJ) \
$(BUILDDIR)/files_dv$(OBJ) \
Expand All @@ -302,6 +382,9 @@ clean_all: clean clean_deb
rm -fr doc refman.pdf CMakeDoxyfile.in Doxyfile.security-utilities_doxygen Doxyfile.doc *.gcov reports
rm -fr _CPack_Packages Makefile CMakeCache.txt


# documentation ################################################################

doc: $(SECUTILS_CONFIG) doc/html refman.pdf

doc/html: Doxyfile $(wildcard src/libsecutils/include/*/*.h src/libsecutils/include/*/*/*.h)
Expand All @@ -312,5 +395,8 @@ refman.pdf: doc/html
@# for producing doc/latex/*, comment out in Doxyfile: GENERATE_LATEX = NO
@# $(MAKE) -C -f Makefile_v1 doc/latex && cp -a doc/latex/refman.pdf . # requires latex


# others #######################################################################

coverage: clean
$(MAKE) -f Makefile_v1 COMPILE_TYPE=code_coverage
7 changes: 5 additions & 2 deletions README.md
Original file line number Diff line number Diff line change
@@ -1,4 +1,4 @@
# libsecutils
# libSecUtils

<img src="libsecutils.svg" width="200">

Expand Down Expand Up @@ -76,7 +76,7 @@ including the C header files needed for development

By default any OpenSSL installation available on the system is used.
Set the optional environment variable `OPENSSL_DIR` to specify the
absolute (or relative to `../`) path of the OpenSSL installation to use, e.g.:
absolute or relative path of the OpenSSL installation to use, e.g.:
```
export OPENSSL_DIR=/usr/local
```
Expand All @@ -85,6 +85,9 @@ In case its libraries are in a different location, set also `OPENSSL_LIB`, e.g.:
export OPENSSL_LIB=$OPENSSL_DIR/lib
```

For all environment variables specifying a directory, relative paths such as `.`
are interpreted relative to the libSecUtils source directory.

Use of the UTA library can be enabled
by setting the environment variable `SECUTILS_USE_UTA`.

Expand Down

0 comments on commit 8b38d7a

Please sign in to comment.