229 lines
7.6 KiB
CMake
229 lines
7.6 KiB
CMake
|
|
# SPDX-License-Identifier: Apache-2.0
|
||
|
|
# ----------------------------------------------------------------------------
|
||
|
|
# Copyright 2020-2022 Arm Limited
|
||
|
|
#
|
||
|
|
# Licensed 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.
|
||
|
|
# ----------------------------------------------------------------------------
|
||
|
|
|
||
|
|
# CMake configuration
|
||
|
|
cmake_minimum_required(VERSION 3.15)
|
||
|
|
cmake_policy(SET CMP0069 NEW) # LTO support
|
||
|
|
cmake_policy(SET CMP0091 NEW) # MSVC runtime support
|
||
|
|
|
||
|
|
if(MSVC)
|
||
|
|
add_compile_options("/wd4324") # Disable structure was padded due to alignment specifier
|
||
|
|
endif()
|
||
|
|
|
||
|
|
project(astcencoder VERSION 4.2.0)
|
||
|
|
|
||
|
|
set(CMAKE_CXX_STANDARD 14)
|
||
|
|
set(CMAKE_CXX_STANDARD_REQUIRED ON)
|
||
|
|
set(CMAKE_CXX_EXTENSIONS OFF)
|
||
|
|
set(CMAKE_EXPORT_COMPILE_COMMANDS 1)
|
||
|
|
|
||
|
|
include(CTest)
|
||
|
|
|
||
|
|
option(ISA_AVX2 "Enable builds for AVX2 SIMD")
|
||
|
|
option(ISA_SSE41 "Enable builds for SSE4.1 SIMD")
|
||
|
|
option(ISA_SSE2 "Enable builds for SSE2 SIMD")
|
||
|
|
option(ISA_NEON "Enable builds for NEON SIMD")
|
||
|
|
option(ISA_NONE "Enable builds for no SIMD")
|
||
|
|
option(ISA_NATIVE "Enable builds for native SIMD")
|
||
|
|
option(DECOMPRESSOR "Enable builds for decompression only")
|
||
|
|
option(DIAGNOSTICS "Enable builds for diagnostic trace")
|
||
|
|
option(ASAN "Enable builds width address sanitizer")
|
||
|
|
option(UNITTEST "Enable builds for unit tests")
|
||
|
|
option(NO_INVARIANCE "Enable builds without invariance")
|
||
|
|
option(CLI "Enable build of CLI" ON)
|
||
|
|
|
||
|
|
set(UNIVERSAL_BUILD OFF)
|
||
|
|
set(MACOS_BUILD OFF)
|
||
|
|
set(MACOS_ARCH_LEN 0)
|
||
|
|
|
||
|
|
# Preflight for some macOS-specific build options
|
||
|
|
if("${CMAKE_SYSTEM_NAME}" STREQUAL "Darwin")
|
||
|
|
set(MACOS_BUILD ON)
|
||
|
|
list(LENGTH CMAKE_OSX_ARCHITECTURES MACOS_ARCH_LEN)
|
||
|
|
endif()
|
||
|
|
|
||
|
|
# Count options which MUST be x64
|
||
|
|
set(X64_ISA_COUNT 0)
|
||
|
|
set(CONFIGS ${ISA_AVX2} ${ISA_SSE41} ${ISA_SSE2})
|
||
|
|
foreach(CONFIG ${CONFIGS})
|
||
|
|
if(${CONFIG})
|
||
|
|
math(EXPR X64_ISA_COUNT "${X64_ISA_COUNT} + 1")
|
||
|
|
endif()
|
||
|
|
endforeach()
|
||
|
|
|
||
|
|
# Count options which MUST be arm64
|
||
|
|
set(ARM64_ISA_COUNT 0)
|
||
|
|
set(CONFIGS ${ISA_NEON})
|
||
|
|
foreach(CONFIG ${CONFIGS})
|
||
|
|
if(${CONFIG})
|
||
|
|
math(EXPR ARM64_ISA_COUNT "${ARM64_ISA_COUNT} + 1")
|
||
|
|
endif()
|
||
|
|
endforeach()
|
||
|
|
|
||
|
|
# macOS builds
|
||
|
|
if("${MACOS_BUILD}")
|
||
|
|
list(FIND CMAKE_OSX_ARCHITECTURES "x86_64" IS_X64)
|
||
|
|
list(FIND CMAKE_OSX_ARCHITECTURES "arm64" IS_ARM64)
|
||
|
|
list(FIND CMAKE_OSX_ARCHITECTURES "$(ARCHS_STANDARD)" IS_AUTO)
|
||
|
|
|
||
|
|
# Turn list index into boolean
|
||
|
|
if(${IS_X64} EQUAL -1)
|
||
|
|
set(IS_X64 OFF)
|
||
|
|
else()
|
||
|
|
set(IS_X64 ON)
|
||
|
|
endif()
|
||
|
|
|
||
|
|
if(${IS_ARM64} EQUAL -1)
|
||
|
|
set(IS_ARM64 OFF)
|
||
|
|
else()
|
||
|
|
set(IS_ARM64 ON)
|
||
|
|
endif()
|
||
|
|
|
||
|
|
if(${IS_AUTO} EQUAL -1)
|
||
|
|
set(IS_AUTO OFF)
|
||
|
|
else()
|
||
|
|
set(IS_AUTO ON)
|
||
|
|
endif()
|
||
|
|
|
||
|
|
# Set up defaults if no more specific ISA set - use XCode's own defaults
|
||
|
|
if((IS_ARM64 OR IS_AUTO) AND ("${ARM64_ISA_COUNT}" EQUAL 0) AND (NOT "${ISA_NONE}"))
|
||
|
|
set(ARM64_ISA_COUNT 1)
|
||
|
|
set(ISA_NEON ON)
|
||
|
|
endif()
|
||
|
|
|
||
|
|
if((IS_X64 OR IS_AUTO) AND ("${X64_ISA_COUNT}" EQUAL 0) AND (NOT "${ISA_NONE}"))
|
||
|
|
set(X64_ISA_COUNT 1)
|
||
|
|
set(ISA_SSE41 ON)
|
||
|
|
endif()
|
||
|
|
|
||
|
|
# User might be doing multi-architecture - XCode sets this at runtime
|
||
|
|
if("${IS_AUTO}")
|
||
|
|
if(("${ARM64_ISA_COUNT}" GREATER 1) OR ("${X64_ISA_COUNT}" GREATER 1))
|
||
|
|
message(FATAL_ERROR "For macOS universal binaries only one backend per architecture is allowed.")
|
||
|
|
endif()
|
||
|
|
|
||
|
|
set(UNIVERSAL_BUILD ON)
|
||
|
|
|
||
|
|
# User requested explicit multi-architecture universal build
|
||
|
|
elseif("${MACOS_ARCH_LEN}" GREATER 2)
|
||
|
|
message(FATAL_ERROR "For macOS universal binaries only x86_64 and arm64 builds are allowed.")
|
||
|
|
|
||
|
|
elseif("${MACOS_ARCH_LEN}" EQUAL 2)
|
||
|
|
if(NOT (${IS_X64} AND ${IS_ARM64}))
|
||
|
|
message(FATAL_ERROR "For macOS universal binaries only x86_64 and arm64 builds are allowed.")
|
||
|
|
endif()
|
||
|
|
|
||
|
|
if(("${ARM64_ISA_COUNT}" GREATER 1) OR ("${X64_ISA_COUNT}" GREATER 1))
|
||
|
|
message(FATAL_ERROR "For macOS universal binaries only one backend per architecture is allowed.")
|
||
|
|
endif()
|
||
|
|
|
||
|
|
set(UNIVERSAL_BUILD ON)
|
||
|
|
|
||
|
|
# User requested explicit single architecture build
|
||
|
|
elseif("${MACOS_ARCH_LEN}" EQUAL 1)
|
||
|
|
if("${IS_X64}" AND "${ARM64_ISA_COUNT}")
|
||
|
|
message(FATAL_ERROR "For macOS x86_64 builds an arm64 backend cannot be specified.")
|
||
|
|
endif()
|
||
|
|
|
||
|
|
if("${IS_ARM64}" AND "${X64_ISA_COUNT}")
|
||
|
|
message(FATAL_ERROR "For macOS arm64 builds an x86_64 backend cannot be specified.")
|
||
|
|
endif()
|
||
|
|
|
||
|
|
# Else is this a implicit multi-architecture universal build?
|
||
|
|
elseif(("${ARM64_ISA_COUNT}" EQUAL 1) AND ("${X64_ISA_COUNT}" GREATER 1))
|
||
|
|
string(CONCAT MSG "For macOS setting multiple architecture backends builds a universal binary. "
|
||
|
|
"For universal binaries only one backend per architecture is allowed.")
|
||
|
|
message(FATAL_ERROR "${MSG}")
|
||
|
|
|
||
|
|
elseif(("${X64_ISA_COUNT}" EQUAL 1) AND ("${ARM64_ISA_COUNT}" GREATER 1))
|
||
|
|
string(CONCAT MSG "For macOS setting multiple architecture backends builds a universal binary. "
|
||
|
|
"For universal binaries only one backend per architecture is allowed.")
|
||
|
|
message(FATAL_ERROR "${MSG}")
|
||
|
|
|
||
|
|
elseif(("${ARM64_ISA_COUNT}" EQUAL 1) AND ("${X64_ISA_COUNT}" EQUAL 1))
|
||
|
|
set(UNIVERSAL_BUILD ON)
|
||
|
|
set(CMAKE_OSX_ARCHITECTURES "arm64;x86_64")
|
||
|
|
|
||
|
|
# Else is this an implicit single architecture build?
|
||
|
|
elseif("${ARM64_ISA_COUNT}" EQUAL 1)
|
||
|
|
set(CMAKE_OSX_ARCHITECTURES "arm64")
|
||
|
|
|
||
|
|
elseif("${X64_ISA_COUNT}" EQUAL 1)
|
||
|
|
set(CMAKE_OSX_ARCHITECTURES "x86_64")
|
||
|
|
|
||
|
|
else()
|
||
|
|
# Do nothing here - assume it defaults to host?
|
||
|
|
|
||
|
|
endif()
|
||
|
|
|
||
|
|
# Non-macOS builds
|
||
|
|
else()
|
||
|
|
if(("${ARM64_ISA_COUNT}" GREATER 0) AND ("${X64_ISA_COUNT}" GREATER 0))
|
||
|
|
message(FATAL_ERROR "Builds can only support a single architecture per configure.")
|
||
|
|
endif()
|
||
|
|
endif()
|
||
|
|
|
||
|
|
# If nothing more specific is set then fall back on the compiler's defaults
|
||
|
|
if(("${ARM64_ISA_COUNT}" EQUAL 0) AND ("${X64_ISA_COUNT}" EQUAL 0) AND (NOT "${ISA_NONE}"))
|
||
|
|
set(ISA_NATIVE ON)
|
||
|
|
endif()
|
||
|
|
|
||
|
|
function(printopt optName optVal)
|
||
|
|
if(${optVal})
|
||
|
|
message(STATUS " ${optName} - ON")
|
||
|
|
else()
|
||
|
|
message(STATUS " ${optName} - OFF")
|
||
|
|
endif()
|
||
|
|
endfunction()
|
||
|
|
|
||
|
|
if("${BLOCK_MAX_TEXELS}")
|
||
|
|
message(STATUS " Max block texels - ${BLOCK_MAX_TEXELS}")
|
||
|
|
endif()
|
||
|
|
printopt("AVX2 backend " ${ISA_AVX2})
|
||
|
|
printopt("SSE4.1 backend " ${ISA_SSE41})
|
||
|
|
printopt("SSE2 backend " ${ISA_SSE2})
|
||
|
|
printopt("NEON backend " ${ISA_NEON})
|
||
|
|
printopt("NONE backend " ${ISA_NONE})
|
||
|
|
printopt("NATIVE backend " ${ISA_NATIVE})
|
||
|
|
if("${MACOS_BUILD}")
|
||
|
|
printopt("Universal bin " ${UNIVERSAL_BUILD})
|
||
|
|
endif()
|
||
|
|
printopt("Decompressor " ${DECOMPRESSOR})
|
||
|
|
printopt("No invariance " ${NO_INVARIANCE})
|
||
|
|
printopt("Diagnostics " ${DIAGNOSTICS})
|
||
|
|
printopt("ASAN " ${ASAN})
|
||
|
|
printopt("Unit tests " ${UNITTEST})
|
||
|
|
|
||
|
|
# Subcomponents
|
||
|
|
add_subdirectory(Source)
|
||
|
|
|
||
|
|
# Configure package archive
|
||
|
|
if(PACKAGE)
|
||
|
|
if("${MACOS_BUILD}")
|
||
|
|
string(TOLOWER "macOS" PKG_OS)
|
||
|
|
else()
|
||
|
|
string(TOLOWER ${CMAKE_SYSTEM_NAME} PKG_OS)
|
||
|
|
endif()
|
||
|
|
|
||
|
|
set(CPACK_PACKAGE_FILE_NAME "astcenc-${CMAKE_PROJECT_VERSION}-${PKG_OS}-${PACKAGE}")
|
||
|
|
set(CPACK_INCLUDE_TOPLEVEL_DIRECTORY FALSE)
|
||
|
|
set(CPACK_PACKAGE_CHECKSUM SHA256)
|
||
|
|
set(CPACK_GENERATOR ZIP)
|
||
|
|
|
||
|
|
include(CPack) # Must be included after CPack configuration.
|
||
|
|
endif()
|