include(ExternalProject)
include(ProcessorCount)
set(NCURSES_SOURCE_DIR "${ROOT_DIR}/third-party/ncurses")
set(NCURSES_BUILD_DIR "${PROJECT_BUILD_DIR}/ncurses/build")
set(NCURSES_INSTALL_DIR "${PROJECT_BUILD_DIR}/ncurses/install" CACHE PATH "Ncurses install directory")
set(NCURSES_OUTPUT_DIR <BINARY_DIR> CACHE STRING "Path to ncurses")
file(MAKE_DIRECTORY "${NCURSES_BUILD_DIR}" "${NCURSES_INSTALL_DIR}")
set(NCURSES_LINKFLAGS "-Wl,-z,now -s")
set(NCURSES_CFLAGS "-fstack-protector-all -ftrapv")
set(NCURSES_CPPFLAGS "-D_FORTIFY_SOURCE=2 -O2")
find_program(MAKE make)
if(NOT MAKE)
message(FATAL_ERROR "make tool not found!")
endif()
file(MAKE_DIRECTORY ${NCURSES_INSTALL_DIR})
file(GLOB_RECURSE NCURSES_TAR_FILE_GLOB ${NCURSES_SOURCE_DIR}/ncurses-*.tar.gz)
list(GET NCURSES_TAR_FILE_GLOB 0 NCURSES_TAR_FILE)
message(STATUS "Use ncurses tar file: ${NCURSES_TAR_FILE}")
add_custom_command(
OUTPUT ${NCURSES_SOURCE_DIR}/configure
COMMENT "Extract ncurses component from ${NCURSES_TAR_FILE}"
# 跳过最外层目录,直接将内容解压到当前目录
COMMAND git lfs install
COMMAND git lfs pull
COMMAND tar xf ${NCURSES_TAR_FILE} --strip-components=1
DEPENDS ${NCURSES_TAR_FILE}
WORKING_DIRECTORY ${NCURSES_SOURCE_DIR}
)
add_custom_target(
ncurses_extract_target
ALL
DEPENDS ${NCURSES_SOURCE_DIR}/configure
COMMENT "Custom target for extracting ncurses tar file"
)
# 检测 GCC 11,没有则 fallback 到系统默认 gcc
find_program(NCURSES_CC gcc PATHS /opt/gcc11-glibc2.17/bin NO_DEFAULT_PATH)
if(NOT NCURSES_CC)
find_program(NCURSES_CC gcc)
endif()
message(STATUS "Ncurses CC: ${NCURSES_CC}")
ExternalProject_Add(ncurses_project
DOWNLOAD_COMMAND ${CMAKE_COMMAND} -E copy_directory ${NCURSES_SOURCE_DIR} ${NCURSES_OUTPUT_DIR}
SOURCE_DIR "${NCURSES_SOURCE_DIR}"
BINARY_DIR "${NCURSES_BUILD_DIR}"
DEPENDS ncurses_extract_target
CONFIGURE_COMMAND cd ${NCURSES_OUTPUT_DIR} && ./configure
CC=${NCURSES_CC}
--prefix=${NCURSES_INSTALL_DIR}
CFLAGS=${NCURSES_CFLAGS}
LDFLAGS=${NCURSES_LINKFLAGS}
CPPFLAGS=${NCURSES_CPPFLAGS}
--disable-root-environ
--with-shared
--without-normal
--with-termlib
--with-abi-version=5
--with-versioned-syms
USES_TERMINAL_BUILD TRUE
BUILD_COMMAND cd ${NCURSES_OUTPUT_DIR} && make -j ${NPROC} install
INSTALL_COMMAND ""
EXCLUDE_FROM_ALL TRUE
BUILD_ALWAYS OFF
)
set(NCURSES_LIB_DIR "${NCURSES_INSTALL_DIR}/lib" CACHE PATH "Ncurses library directory")