cmake_minimum_required(VERSION 3.16) project(TILP_Suite VERSION 1.0.0 LANGUAGES C CXX) # Set C and C++ standards set(CMAKE_C_STANDARD 11) set(CMAKE_CXX_STANDARD 17) set(CMAKE_C_STANDARD_REQUIRED ON) set(CMAKE_CXX_STANDARD_REQUIRED ON) # Include useful CMake modules include(GNUInstallDirs) include(ExternalProject) include(FetchContent) # Options option(USE_EXPERIMENTAL "Use experimental branches" OFF) option(ENABLE_LOGGING "Enable logging in libticables" ON) option(ENABLE_LIBUSB10 "Enable libusb 1.0 support" ON) option(ENABLE_ICONV "Enable iconv support" ON) option(DISABLE_NLS "Disable native language support" OFF) # Platform-specific settings if(APPLE) # On macOS, prefer /usr/local if(CMAKE_INSTALL_PREFIX_INITIALIZED_TO_DEFAULT) set(CMAKE_INSTALL_PREFIX "/usr/local" CACHE PATH "Install prefix" FORCE) endif() # Set PKG_CONFIG_PATH for macOS set(ENV{PKG_CONFIG_PATH} "/usr/lib/pkgconfig:/usr/local/lib/pkgconfig:${CMAKE_INSTALL_PREFIX}/lib/pkgconfig:/usr/local/opt/libarchive/lib/pkgconfig:/usr/local/opt/libffi/lib/pkgconfig:/opt/X11/lib/pkgconfig") endif() # Linux 64-bit lib directory detection if(CMAKE_SYSTEM_NAME STREQUAL "Linux") if(CMAKE_SIZEOF_VOID_P EQUAL 8) # Check if system uses lib64 execute_process( COMMAND ldd /usr/bin/getent COMMAND grep "=>" COMMAND grep "/lib64/" RESULT_VARIABLE LIB64_CHECK OUTPUT_QUIET ERROR_QUIET ) if(LIB64_CHECK EQUAL 0) set(CMAKE_INSTALL_LIBDIR "lib64") endif() endif() endif() # Find required packages find_package(PkgConfig REQUIRED) # Required dependencies pkg_check_modules(GLIB2 REQUIRED glib-2.0) pkg_check_modules(ZLIB REQUIRED zlib) pkg_check_modules(LIBUSB1 REQUIRED libusb-1.0) pkg_check_modules(GTK2 REQUIRED gtk+-2.0) pkg_check_modules(LIBGLADE2 REQUIRED libglade-2.0) pkg_check_modules(LIBARCHIVE REQUIRED libarchive) find_program(GETTEXT_MSGFMT_EXECUTABLE msgfmt) find_program(BISON_EXECUTABLE bison) find_program(FLEX_EXECUTABLE flex) find_program(GROFF_EXECUTABLE groff) find_program(MAKEINFO_EXECUTABLE makeinfo) # Check for required tools if(NOT GETTEXT_MSGFMT_EXECUTABLE) message(WARNING "msgfmt not found - internationalization may not work") endif() if(NOT BISON_EXECUTABLE) message(FATAL_ERROR "bison is required but not found") endif() if(NOT FLEX_EXECUTABLE) message(FATAL_ERROR "flex is required but not found") endif() # Set up external project common arguments set(COMMON_CMAKE_ARGS -DCMAKE_INSTALL_PREFIX=${CMAKE_INSTALL_PREFIX} -DCMAKE_INSTALL_LIBDIR=${CMAKE_INSTALL_LIBDIR} -DCMAKE_BUILD_TYPE=${CMAKE_BUILD_TYPE} -DCMAKE_C_COMPILER=${CMAKE_C_COMPILER} -DCMAKE_CXX_COMPILER=${CMAKE_CXX_COMPILER} ) # Determine Git branch set(GIT_BRANCH "master") if(USE_EXPERIMENTAL) set(GIT_BRANCH "experimental") endif() # Download and build tilibs components ExternalProject_Add(tilibs GIT_REPOSITORY https://github.com/debrouxl/tilibs GIT_TAG ${GIT_BRANCH} SOURCE_DIR ${CMAKE_BINARY_DIR}/tilibs-src BINARY_DIR ${CMAKE_BINARY_DIR}/tilibs-build CONFIGURE_COMMAND "" BUILD_COMMAND "" INSTALL_COMMAND "" ) # Build libticonv ExternalProject_Add(libticonv DEPENDS tilibs SOURCE_DIR ${CMAKE_BINARY_DIR}/tilibs-src/libticonv/trunk BINARY_DIR ${CMAKE_BINARY_DIR}/libticonv-build CONFIGURE_COMMAND ${CMAKE_COMMAND} -E chdir autoreconf -i -v -f COMMAND ${CMAKE_COMMAND} -E chdir ./configure --prefix=${CMAKE_INSTALL_PREFIX} --libdir=${CMAKE_INSTALL_PREFIX}/${CMAKE_INSTALL_LIBDIR} $<$:--enable-iconv> $<$:--disable-nls> CC=${CMAKE_C_COMPILER} CXX=${CMAKE_CXX_COMPILER} BUILD_COMMAND ${CMAKE_COMMAND} -E chdir make INSTALL_COMMAND ${CMAKE_COMMAND} -E chdir make install ) # Build libtifiles ExternalProject_Add(libtifiles DEPENDS libticonv SOURCE_DIR ${CMAKE_BINARY_DIR}/tilibs-src/libtifiles/trunk BINARY_DIR ${CMAKE_BINARY_DIR}/libtifiles-build CONFIGURE_COMMAND ${CMAKE_COMMAND} -E chdir autoreconf -i -v -f COMMAND ${CMAKE_COMMAND} -E chdir ./configure --prefix=${CMAKE_INSTALL_PREFIX} --libdir=${CMAKE_INSTALL_PREFIX}/${CMAKE_INSTALL_LIBDIR} $<$:--disable-nls> CC=${CMAKE_C_COMPILER} CXX=${CMAKE_CXX_COMPILER} BUILD_COMMAND ${CMAKE_COMMAND} -E chdir make INSTALL_COMMAND ${CMAKE_COMMAND} -E chdir make install ) # Build libticables ExternalProject_Add(libticables DEPENDS libtifiles SOURCE_DIR ${CMAKE_BINARY_DIR}/tilibs-src/libticables/trunk BINARY_DIR ${CMAKE_BINARY_DIR}/libticables-build CONFIGURE_COMMAND ${CMAKE_COMMAND} -E chdir autoreconf -i -v -f COMMAND ${CMAKE_COMMAND} -E chdir ./configure --prefix=${CMAKE_INSTALL_PREFIX} --libdir=${CMAKE_INSTALL_PREFIX}/${CMAKE_INSTALL_LIBDIR} $<$:--enable-logging> $<$:--enable-libusb10> $<$:--disable-nls> CC=${CMAKE_C_COMPILER} CXX=${CMAKE_CXX_COMPILER} BUILD_COMMAND ${CMAKE_COMMAND} -E chdir make INSTALL_COMMAND ${CMAKE_COMMAND} -E chdir make install ) # Build libticalcs ExternalProject_Add(libticalcs DEPENDS libticables SOURCE_DIR ${CMAKE_BINARY_DIR}/tilibs-src/libticalcs/trunk BINARY_DIR ${CMAKE_BINARY_DIR}/libticalcs-build CONFIGURE_COMMAND ${CMAKE_COMMAND} -E chdir autoreconf -i -v -f COMMAND ${CMAKE_COMMAND} -E chdir ./configure --prefix=${CMAKE_INSTALL_PREFIX} --libdir=${CMAKE_INSTALL_PREFIX}/${CMAKE_INSTALL_LIBDIR} $<$:--disable-nls> CC=${CMAKE_C_COMPILER} CXX=${CMAKE_CXX_COMPILER} BUILD_COMMAND ${CMAKE_COMMAND} -E chdir make INSTALL_COMMAND ${CMAKE_COMMAND} -E chdir make install ) # Download and build tilp_and_gfm ExternalProject_Add(tilp_and_gfm GIT_REPOSITORY https://github.com/debrouxl/tilp_and_gfm GIT_TAG ${GIT_BRANCH} SOURCE_DIR ${CMAKE_BINARY_DIR}/tilp_and_gfm-src BINARY_DIR ${CMAKE_BINARY_DIR}/tilp_and_gfm-build CONFIGURE_COMMAND "" BUILD_COMMAND "" INSTALL_COMMAND "" ) # Build GFM ExternalProject_Add(gfm DEPENDS libticalcs tilp_and_gfm SOURCE_DIR ${CMAKE_BINARY_DIR}/tilp_and_gfm-src/gfm/trunk BINARY_DIR ${CMAKE_BINARY_DIR}/gfm-build CONFIGURE_COMMAND ${CMAKE_COMMAND} -E chdir autoreconf -i -v -f COMMAND ${CMAKE_COMMAND} -E chdir ./configure --prefix=${CMAKE_INSTALL_PREFIX} --libdir=${CMAKE_INSTALL_PREFIX}/${CMAKE_INSTALL_LIBDIR} CC=${CMAKE_C_COMPILER} CXX=${CMAKE_CXX_COMPILER} BUILD_COMMAND ${CMAKE_COMMAND} -E chdir make INSTALL_COMMAND ${CMAKE_COMMAND} -E chdir make install ) # Build TILP ExternalProject_Add(tilp DEPENDS gfm SOURCE_DIR ${CMAKE_BINARY_DIR}/tilp_and_gfm-src/tilp/trunk BINARY_DIR ${CMAKE_BINARY_DIR}/tilp-build CONFIGURE_COMMAND ${CMAKE_COMMAND} -E chdir autoreconf -i -v -f COMMAND ${CMAKE_COMMAND} -E chdir ./configure --prefix=${CMAKE_INSTALL_PREFIX} --libdir=${CMAKE_INSTALL_PREFIX}/${CMAKE_INSTALL_LIBDIR} CC=${CMAKE_C_COMPILER} CXX=${CMAKE_CXX_COMPILER} BUILD_COMMAND ${CMAKE_COMMAND} -E chdir make INSTALL_COMMAND ${CMAKE_COMMAND} -E chdir make install ) # Create a custom target to build everything add_custom_target(build_all DEPENDS libticonv libtifiles libticables libticalcs gfm tilp ) # Print configuration summary message(STATUS "=== TILP Suite Configuration Summary ===") message(STATUS "Install prefix: ${CMAKE_INSTALL_PREFIX}") message(STATUS "Library directory: ${CMAKE_INSTALL_LIBDIR}") message(STATUS "C Compiler: ${CMAKE_C_COMPILER}") message(STATUS "CXX Compiler: ${CMAKE_CXX_COMPILER}") message(STATUS "Build type: ${CMAKE_BUILD_TYPE}") message(STATUS "Use experimental: ${USE_EXPERIMENTAL}") message(STATUS "Enable logging: ${ENABLE_LOGGING}") message(STATUS "Enable libusb 1.0: ${ENABLE_LIBUSB10}") message(STATUS "Enable iconv: ${ENABLE_ICONV}") message(STATUS "Disable NLS: ${DISABLE_NLS}") # Installation information install(CODE " message(STATUS \"Installation completed successfully!\") message(STATUS \"If you want to use TILP as a non-root user, follow the instructions in:\") message(STATUS \"${CMAKE_BINARY_DIR}/tilibs-src/libticables/trunk/CONFIG\") ")