Project

General

Profile

Download (7.35 KB) Statistics
| Branch: | Revision:
CMAKE_MINIMUM_REQUIRED(VERSION 3.16)
PROJECT("packJPG")

################################################################################
# Check GCC version
################################################################################
IF ("${CMAKE_CXX_COMPILER_ID}" STREQUAL "GNU")
# Require at least gcc 10.3 for C++20 support
IF (CMAKE_CXX_COMPILER_VERSION VERSION_LESS 10.3)
MESSAGE(FATAL_ERROR "GCC version must be at least 10.3!")
ENDIF()
ENDIF()

# This is a neat trick to prevent in source builds
IF (CMAKE_SOURCE_DIR STREQUAL CMAKE_BINARY_DIR)
MESSAGE(FATAL_ERROR "Prevented in-tree build. This is bad practice; you "
"should be running cmake from inside a build directory.")
ENDIF()


################################################################################
# Build configuration options
################################################################################

IF (NOT CMAKE_BUILD_TYPE)
SET(CMAKE_BUILD_TYPE ReleaseWithDebug CACHE STRING
"Choose the type of build, options are: None Debug ReceiverRelease ReleaseWithDebug."
FORCE )
ENDIF()

MESSAGE(STATUS "Build Type: " ${CMAKE_BUILD_TYPE})

ADD_CUSTOM_TARGET(Debug
COMMAND ${CMAKE_COMMAND} -DCMAKE_BUILD_TYPE=Debug ${CMAKE_SOURCE_DIR}
COMMAND ${CMAKE_COMMAND} --build ${CMAKE_BINARY_DIR} --target all
COMMENT "Switch CMAKE_BUILD_TYPE to Debug"
)

ADD_CUSTOM_TARGET(ReceiverRelease
COMMAND ${CMAKE_COMMAND} -DCMAKE_BUILD_TYPE=LibRelease ${CMAKE_SOURCE_DIR}
COMMAND ${CMAKE_COMMAND} --build ${CMAKE_BINARY_DIR} --target all
COMMENT "Switch CMAKE_BUILD_TYPE to ReceiverRelease"
)

ADD_CUSTOM_TARGET(ReleaseWithDebug
COMMAND ${CMAKE_COMMAND} -DCMAKE_BUILD_TYPE=ReleaseWithDebug ${CMAKE_SOURCE_DIR}
COMMAND ${CMAKE_COMMAND} --build ${CMAKE_BINARY_DIR} --target all
COMMENT "Switch CMAKE_BUILD_TYPE to ReleaseWithDebug"
)


# Use /etc/os-release to determine Linux flavor and version
EXECUTE_PROCESS(COMMAND bash -c "grep \"^NAME=\" /etc/os-release | cut -c7- | rev | cut -c2- | rev"
OUTPUT_VARIABLE DISTRIB_ID
OUTPUT_STRIP_TRAILING_WHITESPACE
)

EXECUTE_PROCESS(COMMAND bash -c "grep \"^VERSION_ID=\" /etc/os-release | cut -c13- | rev | cut -c2- | rev"
OUTPUT_VARIABLE DISTRIB_RELEASE
OUTPUT_STRIP_TRAILING_WHITESPACE
)

# Output the parsed ID and release version
MESSAGE(STATUS "DISTRIB_ID: " ${DISTRIB_ID})
MESSAGE(STATUS "DISTRIB_RELEASE: " ${DISTRIB_RELEASE})

# Do not let CMake add the build directory path to RPATH. This means that CL/SL
# cannot be run from the build directory and must be properly installed.
SET(CMAKE_SKIP_BUILD_RPATH TRUE)

# Uncomment this line to enable AddressSanitizer
# SET(CMAKE_CXX_FLAGS "-fsanitize=address -fno-omit-frame-pointer")

# Detect presence of mold linker and use it if found
IF (EXISTS "/usr/bin/mold")
MESSAGE(STATUS "Using mold linker!")
# Note this only works on gcc >= 12.1
SET(CMAKE_EXE_LINKER_FLAGS "${CMAKE_EXE_LINKER_FLAGS} -fuse-ld=mold")
SET(CMAKE_SHARED_LINKER_FLAGS "${CMAKE_SHARED_LINKER_FLAGS} -fuse-ld=mold")
ELSE()
MESSAGE(WARNING "Mold linker not detected. Consider installing mold (add BL APT repo: "
"https://athena.blacklynx.tech/apt/): sudo apt install mold")
ENDIF()

#
# Set the compile flags
#
SET(CMAKE_CXX_STANDARD 20)
SET(CMAKE_CXX_STANDARD_REQUIRED ON)
SET(CMAKE_CXX_EXTENSIONS OFF)
# SET(CMAKE_CXX_VISIBILITY_PRESET hidden)

# This length is used along with the __FILE__ macro for logging
STRING(LENGTH ${CMAKE_CURRENT_SOURCE_DIR} BPLEN)
ADD_DEFINITIONS("-DBUILD_PATH_LEN=${BPLEN}")

# Ensure symbols from statically linked libraries are hidden
SET(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -Wl,--exclude-libs=ALL")

# Enable warnings
SET(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -Wall -Wextra -Wno-unused-parameter")
SET(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -Wall -Wextra -Wno-unused-parameter")

IF (CMAKE_BUILD_TYPE STREQUAL "LibRelease")

# Tune for Haswell minimum
SET(COMPILE_FLAGS "-O3 -flto=auto -ffast-math -ffp-contract=fast -fno-verbose-asm -march=skylake -mfma -mavx2")

SET(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} ${COMPILE_FLAGS}")
SET(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} ${COMPILE_FLAGS}")

ELSEIF (CMAKE_BUILD_TYPE STREQUAL "ReleaseWithDebug")

# Tune for Haswell minimum
# SET(COMPILE_FLAGS "-g -O3 -flto=auto -march=haswell -mtune=generic -mavx2")
SET(COMPILE_FLAGS "-g -O3 -flto=auto -ffast-math -ffp-contract=fast -fno-verbose-asm -march=skylake -mfma -mavx2")

SET(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} ${COMPILE_FLAGS}")
SET(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} ${COMPILE_FLAGS}")

ELSEIF (CMAKE_BUILD_TYPE STREQUAL "Debug")

SET(COMPILE_FLAGS "-g -O0 -march=skylake -mtune=generic")

SET(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} ${COMPILE_FLAGS}")
SET(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} ${COMPILE_FLAGS}")

ENDIF()

# Set the library install path depending on the Linux flavor
SET(LIBRARY_INSTALL_PATH "")
IF ((DISTRIB_ID STREQUAL "Ubuntu") OR (DISTRIB_ID STREQUAL "Linux Mint"))
SET(LIBRARY_INSTALL_PATH "usr/lib/x86_64-linux-gnu/")
ELSE()
# CentOS/RedHat/Scientific
SET(LIBRARY_INSTALL_PATH "usr/lib64/")
ENDIF()

IF(CMAKE_INSTALL_PREFIX_INITIALIZED_TO_DEFAULT)
set(CMAKE_INSTALL_PREFIX "/" CACHE PATH "..." FORCE)
ENDIF()


################################################################################
# Library Dependencies
################################################################################
SET(EXTERNAL_LIBS)


################################################################################
# Source
################################################################################
INCLUDE_DIRECTORIES(${CMAKE_CURRENT_SOURCE_DIR}/src)
INCLUDE_DIRECTORIES(${CMAKE_CURRENT_SOURCE_DIR}/external)

SET(packjpg_sources
${CMAKE_CURRENT_SOURCE_DIR}/src/aricoder.cpp
${CMAKE_CURRENT_SOURCE_DIR}/src/bitops.cpp
${CMAKE_CURRENT_SOURCE_DIR}/src/packjpg.cpp
)


################################################################################
# Target: shared library
################################################################################
ADD_LIBRARY(packjpg SHARED ${packjpg_sources} "${CMAKE_CURRENT_SOURCE_DIR}/src/packjpg.h")

SET_TARGET_PROPERTIES(packjpg PROPERTIES
CXX_STANDARD 17
PUBLIC_HEADER "${CMAKE_CURRENT_SOURCE_DIR}/src/packjpg.h")

INSTALL(TARGETS packjpg
LIBRARY DESTINATION ${LIBRARY_INSTALL_PATH})

INSTALL(FILES "${CMAKE_CURRENT_SOURCE_DIR}/src/packjpg.h" DESTINATION "usr/include")


################################################################################
# Target: static library
################################################################################
ADD_LIBRARY(packjpg_static STATIC ${packjpg_sources} "${CMAKE_CURRENT_SOURCE_DIR}/src/packjpg.h")
SET_TARGET_PROPERTIES(packjpg_static PROPERTIES OUTPUT_NAME "packjpg")

SET_TARGET_PROPERTIES(packjpg_static PROPERTIES
CXX_STANDARD 17
PUBLIC_HEADER "${CMAKE_CURRENT_SOURCE_DIR}/src/packjpg.h")

INSTALL(TARGETS packjpg_static
ARCHIVE DESTINATION "${LIBRARY_INSTALL_PATH}"
PUBLIC_HEADER DESTINATION "usr/include")


################################################################################
# Target: simple utility
################################################################################
ADD_EXECUTABLE(packjpg_simple
${CMAKE_CURRENT_SOURCE_DIR}/src/bin/packjpg_simple.cc)
TARGET_LINK_LIBRARIES(packjpg_simple packjpg )
    (1-1/1)