#**************************************************************
#
#  Licensed to the Apache Software Foundation (ASF) under one
#  or more contributor license agreements.  See the NOTICE file
#  distributed with this work for additional information
#  regarding copyright ownership.  The ASF licenses this file
#  to you under the Apache License, Version 2.0 (the
#  "License"); you may not use this file except in compliance
#  with the License.  You may obtain a copy of the License at
#
#    http://www.apache.org/licenses/LICENSE-2.0
#
#  Unless required by applicable law or agreed to in writing,
#  software distributed under the License is distributed on an
#  "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
#  KIND, either express or implied.  See the License for the
#  specific language governing permissions and limitations
#  under the License.
#
#**************************************************************



PRJ=.

PRJNAME=openssl
TARGET=openssl

# --- Settings -----------------------------------------------------

.INCLUDE :	settings.mk

# --- Files --------------------------------------------------------

.IF "$(SYSTEM_OPENSSL)" == "YES"
@all:
	@echo "Using system openssl...."
.ENDIF


OPENSSL_NAME=openssl-3.0.20

TARFILE_NAME=$(OPENSSL_NAME)
TARFILE_MD5=fabdcf86f3f54e27689253f85b738959

CONFIGURE_DIR=.
CONFIGURE_ACTION=config
CONFIGURE_FLAGS=-I$(SYSBASE)$/usr$/include -L$(SYSBASE)$/usr$/lib shared

BUILD_DIR=.
BUILD_ACTION=make CC='$(CC)' build_libs

OUT2LIB = libssl.*
OUT2LIB += libcrypto.*
OUT2INC += include/openssl/*

UNAME=$(shell uname)

.IF "$(COM)"=="GCC" && "$(CCNUMVER)">="000400060000" || "$(OS)"=="WNT" && "$(NASM_PATH)"=="NO_NASM_HOME"
  NO_ASM="no-asm"
.ELSE
  NO_ASM=
.ENDIF

.IF "$(OS)" == "LINUX" || "$(OS)" == "FREEBSD"
	PATCH_FILES=opensslunx.patch
	.IF "$(CPU)" == "I"
		.IF "$(UNAME)" == "GNU/kFreeBSD"
			CONFIGURE_ACTION=Configure debian-kfreebsd-i386 no-dso no-shared $(NO_ASM)
		.ELIF "$(UNAME)" == "FreeBSD"
			CONFIGURE_ACTION=Configure BSD-x86-elf no-dso no-shared $(NO_ASM)
		.ELSE
			CONFIGURE_ACTION=Configure linux-generic32 no-dso no-shared $(NO_ASM)
		.ENDIF
	.ELIF "$(BUILD64)" == "1"
		.IF "$(UNAME)" == "GNU/kFreeBSD"
			CONFIGURE_ACTION=Configure debian-kfreebsd-amd64 no-dso no-shared $(NO_ASM)
		.ELIF "$(UNAME)" == "FreeBSD"
			CONFIGURE_ACTION=Configure BSD-x86_64 no-dso no-shared $(NO_ASM)
		.ELSE
			CONFIGURE_ACTION=Configure linux-x86_64 no-dso no-shared $(NO_ASM)
		.ENDIF
	.ELSE
		CONFIGURE_ACTION=Configure linux-generic32 no-dso no-shared $(NO_ASM)
	.ENDIF
	# if you build openssl as shared library you have to patch the Makefile.Shared "LD_LIBRARY_PATH=$$LD_LIBRARY_PATH \"
	#BUILD_ACTION=make 'SHARED_LDFLAGS=-Wl,--version-script=./lib$$(SHLIBDIRS)_OOo_0_9_8e.map'
.ENDIF

.IF "$(OS)" == "SOLARIS"
	PATCH_FILES=opensslsol.patch
	#BUILD_ACTION=make 'SHARED_LDFLAGS=-G -dy -z text -M./lib$$$$$$$$(SHLIBDIRS)_OOo_0_9_8e.map'

	# Use BUILD64 when 1 to select new specific 64bit Configurations if necessary

	.IF "$(CPUNAME)" == "INTEL" # Solaris INTEL
		.IF "$(CPU)" == "X"
		   CONFIGURE_ACTION=Configure solaris64-x86_64-cc
		.ELSE
		   CONFIGURE_ACTION=Configure solaris-x86-cc
		.ENDIF
	.ELIF "$(CPU)" == "U" # Solaris SPARC
	   CONFIGURE_ACTION=Configure solaris64-sparcv9-cc
	.ELSE
	   CONFIGURE_ACTION=Configure solaris-sparcv9-cc
	.ENDIF
.ENDIF

.IF "$(OS)" == "MACOSX"
.IF "$(CPUNAME)" == "AARCH64"
	CONFIGURE_ACTION=Configure darwin64-arm64-cc no-dso no-shared $(NO_ASM)
.ELSE
	CONFIGURE_ACTION=Configure darwin64-x86_64-cc no-dso no-shared $(NO_ASM)
.ENDIF
.ENDIF

.IF "$(OS)" == "WNT"

.IF "$(COM)"=="GCC"

PATCH_FILES=opensslmingw.patch
.IF "$(USE_MINGW)" == "cygwin"
CONFIGURE_ACTION=$(PERL) configure
CONFIGURE_FLAGS=mingw shared
INSTALL_ACTION=mv libcrypto.a libcrypto_static.a && mv libcrypto.dll.a libcrypto.a && mv libssl.a libssl_static.a && mv libssl.dll.a libssl.a
OUT2LIB = libcrypto_static.*
OUT2LIB += libssl_static.*
OUT2LIB += libcrypto.*
OUT2LIB += libssl.*
OUT2BIN = ssleay32.dll
OUT2BIN += libeay32.dll
.ELSE # "$(USE_MINGW)" == "cygwin"
CONFIGURE_ACTION=
BUILD_ACTION=cmd /c "ms\mingw32"
OUT2LIB = out/libcrypto_static.*
OUT2LIB += out/libssl_static.*
OUT2LIB += out/libcrypto.*
OUT2LIB += out/libssl.*
OUT2BIN = out/ssleay32.dll
OUT2BIN += out/libeay32.dll
.ENDIF # "$(USE_MINGW)" == "cygwin"

.ELSE # "$(COM)"=="GCC"

	PATCH_FILES=openssl.patch

	# Extract Strawberry Perl and use CONFIGURE_ACTION to insert it, and NASM which it needs, into the PATH.
	# Also define:
	# - certain constants absent in the old MSVC we use (INT64_MAX, INT64_MIN, UINT64_MAX).
	# - the minimum Windows version to support (_WIN32_WINDOWS=0x0400 for Windows 95, _WIN32_WINNT=0x0400 for Windows NT 4.0).
	# - OPENSSL_NO_ASYNC=1 to stop using async functions that require old Windows versions.
	STRAWBERRY_PERL_DIR=$(shell cygpath -u $(SOLARSRC)/openssl/$(INPATH)/misc/build/strawberry-perl)
	.IF "$(NASM_PATH)"=="NASM_IN_PATH"
		CONFIGURE_PATH=$(STRAWBERRY_PERL_DIR)/perl/bin:$(PATH)
	.ELSE
		NASM_PATH_NIX=$(shell cygpath -u $(NASM_PATH))
		CONFIGURE_PATH=$(STRAWBERRY_PERL_DIR)/perl/bin:$(NASM_PATH_NIX):$(PATH)
	.ENDIF
	CONFIGURE_ACTION=\
		if test -d "$(STRAWBERRY_PERL_DIR)"; \
		then echo Found Strawberry Perl; \
		else mkdir "$(STRAWBERRY_PERL_DIR)" && unzip -d $(STRAWBERRY_PERL_DIR) $(SOLARSRC)/../ext_sources/93fdfe261588bc82ab3a0bd4f5945b60-strawberry-perl-5.32.1.1-32bit-portable.zip ; \
		fi && \
		PATH="$(CONFIGURE_PATH)" \
		PERL= \
		CPPFLAGS="$(SOLARINC) \
			-DOPENSSL_NO_ASYNC=1 \
			-DWINVER=0x0400 \
			-D_WIN32_WINNT=0x0400 \
			-D_WIN32_WINDOWS=0x0400 \
			-DINT64_MAX=9223372036854775807i64 \
			-DINT64_MIN=(-9223372036854775807i64-1) \
			-DUINT64_MAX=0xffffffffffffffffui64" \
		RCFLAGS="$(SOLARINC)" \
		perl configure $(NO_ASM)
	.IF "$(CPUNAME)"=="INTEL"
		CONFIGURE_FLAGS=VC-WIN32
		OUT2BIN = libcrypto-3.dll
		OUT2BIN += libssl-3.dll
	.ELIF "$(CPUNAME)"=="X86_64"
		CONFIGURE_FLAGS=VC-WIN64A
		OUT2BIN = libcrypto-3-x64.dll
		OUT2BIN += libssl-3-x64.dll
	.ENDIF
	BUILD_ACTION=LIB="$(ILIB)" nmake

	OUT2INC = include$/openssl$/*

.ENDIF # "$(COM)"=="GCC"

.ENDIF # "$(OS)" == "WNT"


# --- Targets ------------------------------------------------------

.INCLUDE : set_ext.mk
.INCLUDE : target.mk
.INCLUDE : tg_ext.mk
