* 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.
361 lines
13 KiB
CMake
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)
|