simh-testsetgenerator/cmake/dep-locate.cmake
B. Scott Michel 8b14bb69be
CMake build infrastructure II (#53)
* CMake build infrastructure

The squashed commit that builds and packages releases for the SIMH
simulator suite with CMake, version 3.14 or newer.

See README-CMake.md for documentation.
2023-05-17 20:18:42 -04:00

361 lines
13 KiB
CMake

##=~=~=~=~=~=~=~=~=~=~=~=~=~=~=~=~=~=~=~=~=~=~=~=~=~=~=~=~=~=~=~=~=~=~=~=~=~=
## dep-locate.cmake
##
## Consolidated list of runtime dependencies for simh, probed/found via
## CMake's find_package() and pkg_check_modules() when 'pkgconfig' is
## available.
##=~=~=~=~=~=~=~=~=~=~=~=~=~=~=~=~=~=~=~=~=~=~=~=~=~=~=~=~=~=~=~=~=~=~=~=~=~=
##-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~
## Find packages:
##-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~
if (WITH_REGEX)
if (PREFER_PCRE)
if (USING_VCPKG)
find_package(unofficial-pcre CONFIG)
else ()
## LEGACY strategy:
find_package(PCRE)
endif ()
else ()
find_package(PCRE2)
endif ()
endif ()
if (WITH_REGEX OR WITH_VIDEO)
set(ZLIB_USE_STATIC_LIBS ON)
find_package(ZLIB)
endif ()
if (WITH_VIDEO)
if (NOT USING_VCPKG)
## LEGACY strategy:
find_package(PNG)
find_package(Freetype)
find_package(SDL2 NAMES sdl2 SDL2)
find_package(SDL2_ttf NAMES sdl2_ttf SDL2_ttf)
else ()
## vcpkg strategy:
find_package(PNG REQUIRED)
find_package(SDL2 CONFIG)
find_package(SDL2_ttf CONFIG)
endif ()
endif ()
if (WITH_NETWORK)
if (WITH_VDE)
find_package(VDE)
endif ()
## pcap is special: Headers only and dynamically loaded.
if (WITH_PCAP)
find_package(PCAP)
endif (WITH_PCAP)
endif (WITH_NETWORK)
if (NOT WIN32 OR MINGW)
find_package(PkgConfig)
if (PKG_CONFIG_FOUND)
if (WITH_REGEX)
if (PREFER_PCRE AND NOT PCRE_FOUND)
pkg_check_modules(PCRE IMPORTED_TARGET libpcre)
elseif (NOT PREFER_PCRE AND NOT PCRE2_FOUND)
pkg_check_modules(PCRE IMPORTED_TARGET libpcre2-8)
endif ()
endif (WITH_REGEX)
if (WITH_REGEX OR WITH_VIDEO)
if (NOT ZLIB_FOUND)
pkg_check_modules(ZLIB IMPORTED_TARGET zlib)
endif ()
endif ()
if (WITH_VIDEO)
if (NOT PNG_FOUND)
pkg_check_modules(PNG IMPORTED_TARGET libpng16)
endif ()
if (NOT SDL2_FOUND)
pkg_check_modules(SDL2 IMPORTED_TARGET sdl2)
if (NOT SDL2_FOUND)
pkg_check_modules(SDL2 IMPORTED_TARGET SDL2)
endif ()
endif ()
if (NOT SDL2_ttf_FOUND)
pkg_check_modules(SDL2_ttf IMPORTED_TARGET SDL2_ttf)
if (NOT SDL2_ttf_FOUND)
pkg_check_modules(SDL2_ttf IMPORTED_TARGET sdl2_ttf)
endif ()
endif ()
endif (WITH_VIDEO)
if (WITH_NETWORK)
if (WITH_VDE AND NOT VDE_FOUND)
pkg_check_modules(VDE IMPORTED_TARGET vdeplug)
endif ()
endif (WITH_NETWORK)
endif ()
endif ()
##-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~
## Add rules for the superbuild if dependencies need to be built:
##-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~
if (NO_DEP_BUILD)
## Not going to build dependencies...
return ()
endif ()
include (ExternalProject)
# Source URLs (to make it easy to update versions):
set(ZLIB_SOURCE_URL "https://github.com/madler/zlib/archive/v1.2.13.zip")
set(PCRE2_SOURCE_URL "https://github.com/PCRE2Project/pcre2/releases/download/pcre2-10.40/pcre2-10.40.zip")
## PCRE needs multiple URLs to chase a working SF mirror:
list(APPEND PCRE_SOURCE_URL
"https://sourceforge.net/projects/pcre/files/pcre/8.45/pcre-8.45.zip/download?use_mirror=cytranet"
"https://sourceforge.net/projects/pcre/files/pcre/8.45/pcre-8.45.zip/download?use_mirror=phoenixnap"
"https://sourceforge.net/projects/pcre/files/pcre/8.45/pcre-8.45.zip/download?use_mirror=versaweb"
"https://sourceforge.net/projects/pcre/files/pcre/8.45/pcre-8.45.zip/download?use_mirror=netactuate"
"https://sourceforge.net/projects/pcre/files/pcre/8.45/pcre-8.45.zip/download?use_mirror=cfhcable"
"https://sourceforge.net/projects/pcre/files/pcre/8.45/pcre-8.45.zip/download?use_mirror=freefr"
"https://sourceforge.net/projects/pcre/files/pcre/8.45/pcre-8.45.zip/download?use_mirror=master"
)
set(PNG_SOURCE_URL "https://github.com/glennrp/libpng/archive/refs/tags/v1.6.39.tar.gz")
## Freetype also needs multiple URLs to chase a working mirror:
list(APPEND FREETYPE_SOURCE_URL
"https://github.com/freetype/freetype/archive/refs/tags/VER-2-12-1.zip"
"https://sourceforge.net/projects/freetype/files/freetype2/2.12.1/ft2121.zip/download?use_mirror=cytranet"
"https://sourceforge.net/projects/freetype/files/freetype2/2.12.1/ft2121.zip/download?use_mirror=phoenixnap"
"https://sourceforge.net/projects/freetype/files/freetype2/2.12.1/ft2121.zip/download?use_mirror=versaweb"
"https://sourceforge.net/projects/freetype/files/freetype2/2.12.1/ft2121.zip/download?use_mirror=netactuate"
"https://sourceforge.net/projects/freetype/files/freetype2/2.12.1/ft2121.zip/download?use_mirror=cfhcable"
"https://sourceforge.net/projects/freetype/files/freetype2/2.12.1/ft2121.zip/download?use_mirror=freefr"
"https://sourceforge.net/projects/freetype/files/freetype2/2.12.1/ft2121.zip/download?use_mirror=master"
"https://download.savannah.gnu.org/releases/freetype/freetype-2.12.1.tar.xz"
"https://gitlab.freedesktop.org/freetype/freetype/-/archive/VER-2-12-1/freetype-VER-2-12-1.zip"
)
set(SDL2_SOURCE_URL "https://github.com/libsdl-org/SDL/archive/refs/tags/release-2.26.3.zip")
set(SDL2_TTF_SOURCE_URL "https://github.com/libsdl-org/SDL_ttf/archive/refs/tags/release-2.20.2.zip")
## Need to build ZLIB for both PCRE and libpng16:
if ((WITH_REGEX OR WITH_VIDEO) AND NOT ZLIB_FOUND)
ExternalProject_Add(zlib-dep
URL ${ZLIB_SOURCE_URL}
CONFIGURE_COMMAND ""
BUILD_COMMAND ""
INSTALL_COMMAND ""
## These patches come from vcpkg so that only the static libraries are built and
## installed. If the patches don't apply cleanly (and there's a build error), that
## means a version number got bumped and need to see what patches, if any, are
## still applicable.
PATCH_COMMAND
git -c core.longpaths=true -c core.autocrlf=false --work-tree=. --git-dir=.git
apply
"${SIMH_DEP_PATCHES}/zlib/0001-Prevent-invalid-inclusions-when-HAVE_-is-set-to-0.patch"
"${SIMH_DEP_PATCHES}/zlib/0002-skip-building-examples.patch"
"${SIMH_DEP_PATCHES}/zlib/0003-build-static-or-shared-not-both.patch"
"${SIMH_DEP_PATCHES}/zlib/0004-android-and-mingw-fixes.patch"
--ignore-whitespace --whitespace=nowarn --verbose
)
BuildDepMatrix(zlib-dep zlib CMAKE_ARGS -DBUILD_SHARED_LIBS:Bool=${BUILD_SHARED_DEPS})
list(APPEND SIMH_BUILD_DEPS zlib)
list(APPEND SIMH_DEP_TARGETS zlib-dep)
message(STATUS "Building ZLIB from ${ZLIB_SOURCE_URL}.")
set(ZLIB_PKG_STATUS "ZLIB source build")
endif ()
IF (WITH_REGEX AND NOT (PCRE_FOUND OR PCRE2_FOUND OR TARGET unofficial::pcre::pcre))
set(PCRE_DEPS)
IF (TARGET zlib-dep)
list(APPEND PCRE_DEPS zlib-dep)
ENDIF (TARGET zlib-dep)
set(PCRE_CMAKE_ARGS -DBUILD_SHARED_LIBS:Bool=${BUILD_SHARED_DEPS})
if (NOT PREFER_PCRE)
set(PCRE_URL ${PCRE2_SOURCE_URL})
list(APPEND PCRE_CMAKE_ARGS
-DPCRE2_BUILD_PCREGREP:Bool=Off
-DPCRE2_SUPPORT_LIBEDIT:Bool=Off
-DPCRE2_SUPPORT_LIBREADLINE:Bool=Off
)
# IF(MSVC)
# list(APPEND PCRE_CMAKE_ARGS -DINSTALL_MSVC_PDB=On)
# ENDIF(MSVC)
message(STATUS "Building PCRE2 from ${PCRE_URL}")
set(PCRE_PKG_STATUS "pcre2 source build")
ELSE ()
set(PCRE_URL ${PCRE_SOURCE_URL})
list(APPEND PCRE_CMAKE_ARGS
-DPCRE_BUILD_PCREGREP:Bool=Off
-DPCRE_SUPPORT_LIBEDIT:Bool=Off
-DPCRE_SUPPORT_LIBREADLINE:Bool=Off
)
if (WIN32)
list(APPEND PCRE_CMAKE_ARGS
-DBUILD_SHARED_LIBS:Bool=Off
-DPCRE_STATIC_RUNTIME:Bool=On
)
endif ()
message(STATUS "Building PCRE from ${PCRE_URL}")
set(PCRE_PKG_STATUS "pcre source build")
ENDIF ()
ExternalProject_Add(pcre-ext
URL
${PCRE_URL}
DEPENDS
${PCRE_DEPS}
CONFIGURE_COMMAND ""
BUILD_COMMAND ""
INSTALL_COMMAND ""
)
BuildDepMatrix(pcre-ext pcre CMAKE_ARGS ${PCRE_CMAKE_ARGS})
list(APPEND SIMH_BUILD_DEPS pcre)
list(APPEND SIMH_DEP_TARGETS pcre-ext)
ELSE ()
set(PCRE_PKG_STATUS "regular expressions disabled")
ENDIF ()
set(BUILD_WITH_VIDEO FALSE)
IF (WITH_VIDEO)
IF (NOT PNG_FOUND)
set(PNG_DEPS)
if (NOT ZLIB_FOUND)
list(APPEND PNG_DEPS zlib-dep)
endif (NOT ZLIB_FOUND)
ExternalProject_Add(png-dep
URL
${PNG_SOURCE_URL}
DEPENDS
${PNG_DEPS}
CONFIGURE_COMMAND ""
BUILD_COMMAND ""
INSTALL_COMMAND ""
)
## Work around the GCC 8.1.0 SEH index regression.
set(PNG_CMAKE_BUILD_TYPE_RELEASE "Release")
if (CMAKE_C_COMPILER_ID STREQUAL "GNU" AND
CMAKE_C_COMPILER_VERSION VERSION_EQUAL "8.1" AND
NOT CMAKE_BUILD_VERSION)
message(STATUS "PNG: Build using MinSizeRel CMAKE_BUILD_TYPE with GCC 8.1")
set(PNG_CMAKE_BUILD_TYPE_RELEASE "MinSizeRel")
endif()
BuildDepMatrix(png-dep libpng
CMAKE_ARGS
-DPNG_SHARED:Bool=${BUILD_SHARED_DEPS}
-DPNG_STATUS:Bool=On
-DPNG_EXECUTABLES:Bool=Off
-DPNG_TESTS:Bool=Off
RELEASE_BUILD ${PNG_CMAKE_BUILD_TYPE_RELEASE}
)
list(APPEND SIMH_BUILD_DEPS "png")
list(APPEND SIMH_DEP_TARGETS "png-dep")
message(STATUS "Building PNG from ${PNG_SOURCE_URL}")
list(APPEND VIDEO_PKG_STATUS "PNG source build")
ENDIF (NOT PNG_FOUND)
IF (NOT SDL2_FOUND)
ExternalProject_Add(sdl2-dep
URL ${SDL2_SOURCE_URL}
CONFIGURE_COMMAND ""
BUILD_COMMAND ""
INSTALL_COMMAND ""
)
BuildDepMatrix(sdl2-dep SDL2 CMAKE_ARGS "-DBUILD_SHARED_LIBS:Bool=${BUILD_SHARED_DEPS}")
list(APPEND SIMH_BUILD_DEPS "SDL2")
list(APPEND SIMH_DEP_TARGETS "sdl2-dep")
message(STATUS "Building SDL2 from ${SDL2_SOURCE_URL}.")
list(APPEND VIDEO_PKG_STATUS "SDL2 source build")
ENDIF (NOT SDL2_FOUND)
IF (NOT FREETYPE_FOUND)
set(FREETYPE_DEPS)
if (TARGET zlib-dep)
list(APPEND FREETYPE_DEPS zlib-dep)
endif ()
if (TARGET png-dep)
list(APPEND FREETYPE_DEPS png-dep)
endif ()
ExternalProject_Add(freetype-dep
URL
${FREETYPE_SOURCE_URL}
DEPENDS
${FREETYPE_DEPS}
CONFIGURE_COMMAND ""
BUILD_COMMAND ""
INSTALL_COMMAND ""
)
BuildDepMatrix(freetype-dep Freetype
CMAKE_ARGS
"-DBUILD_SHARED_LIBS:Bool=${BUILD_SHARED_DEPS}"
"-DFT_DISABLE_BZIP2:Bool=TRUE"
"-DFT_DISABLE_HARFBUZZ:Bool=TRUE"
"-DFT_DISABLE_BROTLI:Bool=TRUE"
)
list(APPEND SIMH_BUILD_DEPS "Freetype")
list(APPEND SIMH_DEP_TARGETS freetype-dep)
message(STATUS "Building Freetype from ${FREETYPE_SOURCE_URL}.")
ENDIF ()
IF (NOT SDL2_ttf_FOUND)
set(SDL2_ttf_DEPS)
if (TARGET sdl2-dep)
list(APPEND SDL2_ttf_DEPS sdl2-dep)
endif (TARGET sdl2-dep)
if (TARGET freetype-dep)
list(APPEND SDL2_ttf_DEPS freetype-dep)
endif ()
ExternalProject_Add(sdl2-ttf-dep
URL
${SDL2_TTF_SOURCE_URL}
DEPENDS
${SDL2_ttf_DEPS}
CONFIGURE_COMMAND ""
BUILD_COMMAND ""
INSTALL_COMMAND ""
PATCH_COMMAND
git -c core.longpaths=true -c core.autocrlf=false --work-tree=. --git-dir=.git
apply
"${SIMH_DEP_PATCHES}/SDL_ttf/fix-pkgconfig.patch"
--ignore-whitespace --whitespace=nowarn --verbose
)
set(sdl2_ttf_cmake_args)
list(APPEND sdl2_ttf_cmake_args
"-DBUILD_SHARED_LIBS:Bool=${BUILD_SHARED_DEPS}"
"-DSDL2TTF_SAMPLES:Bool=Off"
"-DSDL2TTF_VENDORED:Bool=Off"
"-DSDL2TTF_HARFBUZZ:Bool=Off"
)
BuildDepMatrix(sdl2-ttf-dep SDL2_ttf CMAKE_ARGS ${sdl2_ttf_cmake_args})
list(APPEND SIMH_BUILD_DEPS "SDL2_ttf")
list(APPEND SIMH_DEP_TARGETS "sdl2-ttf-dep")
message(STATUS "Building SDL2_ttf from https://www.libsdl.org/release/SDL2_ttf-2.0.15.zip.")
list(APPEND VIDEO_PKG_STATUS "SDL2_ttf source build")
ENDIF (NOT SDL2_ttf_FOUND)
set(BUILD_WITH_VIDEO TRUE)
ELSE ()
set(VIDEO_PKG_STATUS "video support disabled")
ENDIF(WITH_VIDEO)