diff --git a/.github/static/DockerQt b/.github/static/DockerQt new file mode 100644 index 0000000000..1c8feb13f8 --- /dev/null +++ b/.github/static/DockerQt @@ -0,0 +1,50 @@ +FROM ubuntu:20.04 +ARG ARCH="x86_64" + +RUN apt-get update +RUN apt-get install -y lsb-release software-properties-common gnupg +RUN apt-get install -y wget ninja-build ccache libstdc++-10-dev + +# QT DEPS +RUN apt-get install -y libgl-dev libglu-dev libx11-xcb-dev libxkbcommon-x11-dev libpcre2-dev libz-dev libfreetype6-dev libpng-dev libjpeg-dev libsqlite3-dev libharfbuzz-dev libb2-dev libdouble-conversion-dev libfontconfig1-dev +RUN apt-get install -y "libxcb*-dev" + +WORKDIR / +RUN wget -q https://github.com/Kitware/CMake/releases/download/v3.29.4/cmake-3.29.4-linux-$ARCH.sh + +# cmake bin +RUN sh /cmake-3.29.4-linux-$ARCH.sh --skip-license --prefix=/usr +RUN rm /cmake-3.29.4-linux-$ARCH.sh + +# Install compilers +RUN wget -q https://apt.llvm.org/llvm.sh +RUN chmod +x llvm.sh +RUN ./llvm.sh 18 + +WORKDIR / +RUN bash -c "\ + wget -q https://download.qt.io/official_releases/qt/6.7/6.7.1/single/qt-everywhere-src-6.7.1.tar.xz &&\ + tar xf qt-everywhere-src-6.7.1.tar.xz &&\ + rm qt-everywhere-src-6.7.1.tar.xz &&\ + cd qt-everywhere-src-6.7.1 &&\ + cmake -S . -B build -G Ninja \ + -D CMAKE_CXX_COMPILER=clang++-18 \ + -D CMAKE_C_COMPILER=clang-18 \ + -D CMAKE_INSTALL_PREFIX=\/usr \ + -D QT_BUILD_SUBMODULES=\"qtbase;qt5compat;qtmultimedia;qtdeclarative\" \ + -D BUILD_SHARED_LIBS=OFF \ + -D INPUT_icu=no \ + -D INPUT_pcre=system \ + -D INPUT_glib=no \ + -D INPUT_fontconfig=no \ + -D INPUT_optimize_size=yes \ + -D QT_USE_CCACHE=OFF \ + -D CMAKE_BUILD_TYPE=Release &&\ + cmake --build build --parallel &&\ + cmake --build build --target install &&\ + cd \/ && \ + rm -rf /qt-everywhere-src-6.7.1" + +WORKDIR / +RUN ln -s /bin/clang-18 /bin/clang +RUN ln -s /bin/clang++-18 /bin/clang++ diff --git a/.github/static/DockerUbuntu b/.github/static/DockerUbuntu new file mode 100644 index 0000000000..d055c7a209 --- /dev/null +++ b/.github/static/DockerUbuntu @@ -0,0 +1,20 @@ +FROM yaraslaut/static_qt:20.04 + +ARG ARCH="x86_64" + +RUN apt-get install -y git libutempter-dev make + +WORKDIR / +COPY . /contour +RUN CC=clang CXX=clang++ sh /contour/scripts/install-static.sh + +WORKDIR /contour +RUN cmake -S . -B build -G Ninja \ + -D CONTOUR_BUILD_STATIC=ON \ + -D CONTOUR_USE_CPM=ON \ + -D CMAKE_CXX_COMPILER=clang++-18 \ + -D CMAKE_C_COMPILER=clang-18 \ + -D CMAKE_CXX_FLAGS="-I/contour/build/_deps/yaml-cpp-src/include" \ + -D CMAKE_PREFIX_PATH=/usr/local/Qt-6.7.1/lib/cmake +RUN cmake --build build --verbose +RUN ldd ./build/src/contour/contour diff --git a/.github/static/readme b/.github/static/readme new file mode 100644 index 0000000000..70f2ef8b00 --- /dev/null +++ b/.github/static/readme @@ -0,0 +1,14 @@ +To build static image we need to build qt static docker container and put it on dockerhub : +``` +docker buildx build --tag qt_static:20.04 --progress=plain -f .github/static/DockerQt --load . +docker tag qt_static:20.04 yaraslaut/static_qt:20.04 +docker push yaraslaut/static_qt:20.04 +``` + +Then we can use it to build contour inside github actions with +``` +docker buildx build --tag static_contour --progress=plain -f .github/static/DockerUbuntu --load . +docker create --name contour_static contour_static +docker cp contour_static:/contour/build/src/contour/contour . +docker container rm contour_static +``` diff --git a/.github/workflows/build.yml b/.github/workflows/build.yml index be6ee25b1c..f5fa8b71ee 100644 --- a/.github/workflows/build.yml +++ b/.github/workflows/build.yml @@ -191,6 +191,46 @@ jobs: if-no-files-found: error retention-days: 1 # }}} + # {{{ StaticBuild + staticBuild: + #if: github.ref == 'refs/heads/master' || github.head_ref == 'release' + name: "Static build" + runs-on: ubuntu-latest + steps: + - uses: actions/checkout@v4 + - name: Set up QEMU + uses: docker/setup-qemu-action@v2 + with: + platforms: all + - name: Set up Docker Buildx + id: buildx + uses: docker/setup-buildx-action@v2 + with: + version: latest + - name: "update APT database" + run: sudo apt -q update + - name: Installing xmllint for ci-set-vars + run: sudo apt -qy install libxml2-utils + - name: Build release + shell: bash + run: | + docker buildx build \ + --tag static_contour \ + --progress=plain \ + -f .github/static/DockerUbuntu \ + --load \ + . + docker create --name contour_static static_contour + docker cp contour_static:/contour/build/src/contour/contour contour + docker container rm contour_static + - name: "Uploading static executable" + uses: actions/upload-artifact@v3 + with: + name: "contour" + path: "contour" + if-no-files-found: error + retention-days: 1 + # }}} # {{{ Fedora fedora: strategy: diff --git a/.gitignore b/.gitignore index dba27c6c39..53ee3fe09e 100644 --- a/.gitignore +++ b/.gitignore @@ -67,3 +67,5 @@ src/contour/ui/main.qml # mkdocs docs/vt-sequence/index.md + +version.txt diff --git a/CMakeLists.txt b/CMakeLists.txt index aff8ddfef0..0653dc94ab 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -74,6 +74,15 @@ option(CONTOUR_STACKTRACE_ADDR2LINE "Uses addr2line to pretty-print SEGV stacktr option(CONTOUR_BUILD_WITH_MIMALLOC "Builds with mimalloc [default: OFF]" OFF) option(CONTOUR_INSTALL_TOOLS "Installs tools, if built [default: OFF]" OFF) option(CONTOUR_PACKAGE_TERMINFO "Package terminfo files" ON) +option(CONTOUR_USE_CPM "Use CPM to fetch dependencies [default: OFF]" OFF) +option(CONTOUR_BUILD_STATIC "Link to static libraries [default: OFF]" OFF) + + +if(CONTOUR_BUILD_STATIC) + set(BUILD_SHARED_LIBS OFF) + set(CMAKE_POSITION_INDEPENDENT_CODE ON) + set(CMAKE_EXE_LINKER_FLAGS "-static-libgcc -static-libstdc++ ${CMAKE_EXE_LINKER_FLAGS}") +endif() if(NOT WIN32 AND NOT CONTOUR_SANITIZE AND NOT CMAKE_CONFIGURATION_TYPES) set(CONTOUR_SANITIZE "OFF" CACHE STRING "Choose the sanitizer mode." FORCE) @@ -103,6 +112,18 @@ if(CONTOUR_TESTING) endif() # ---------------------------------------------------------------------------- +if(CONTOUR_USE_CPM) + # download CPM.cmake + file( + DOWNLOAD + https://github.com/cpm-cmake/CPM.cmake/releases/download/v0.38.3/CPM.cmake + ${CMAKE_CURRENT_BINARY_DIR}/cmake/CPM.cmake + EXPECTED_HASH SHA256=cc155ce02e7945e7b8967ddfaff0b050e958a723ef7aad3766d368940cb15494 + ) + include(${CMAKE_CURRENT_BINARY_DIR}/cmake/CPM.cmake) +endif() + + include(ContourThirdParties) add_subdirectory(src) add_subdirectory(examples) diff --git a/cmake/ContourThirdParties.cmake b/cmake/ContourThirdParties.cmake index ad659e92a3..4b145e2833 100644 --- a/cmake/ContourThirdParties.cmake +++ b/cmake/ContourThirdParties.cmake @@ -31,61 +31,48 @@ else() message(STATUS "No 3rdparty libraries found at ${ContourThirdParties_SRCDIR}") endif() -set(LIST ContourThirdParties) -macro(Thirdparty_Include_If_MIssing _TARGET _PACKAGE_NAME) - if(${_PACKAGE_NAME} STREQUAL "") - set(${_PACKAGE_NAME} ${_TARGET}) - endif() - if (NOT TARGET ${_TARGET}) - find_package(${_PACKAGE_NAME} REQUIRED) - list(APPEND ContourThirdParties ${_TARGET}_SYSDEP) - set(THIRDPARTY_BUILTIN_${_TARGET} "system package") - else() - list(APPEND ContourThirdParties ${_TARGET}_EMBED) +macro(HandleThirdparty _TARGET _CPM_TARGET) + if(TARGET ${_TARGET}) set(THIRDPARTY_BUILTIN_${_TARGET} "embedded") + else() + find_package(${_TARGET}) + + if(${_TARGET}_FOUND) + set(THIRDPARTY_BUILTIN_${_TARGET} "system package") + elseif(CONTOUR_USE_CPM) + message(STATUS "====== Using CPM to add ${_TARGET}") + CPMAddPackage(${_CPM_TARGET}) + set(THIRDPARTY_BUILTIN_${_TARGET} "embedded (CPM)") + else() + message(FATAL_ERROR "Could not find ${_TARGET}") + endif() endif() endmacro() -# Thirdparty_Include_If_MIssing(Catch2 catch2) -# Thirdparty_Include_If_MIssing(fmt) -# Thirdparty_Include_If_MIssing(GSL) -# Thirdparty_Include_If_MIssing(range-v3) -# Thirdparty_Include_If_MIssing(termbench) -# Thirdparty_Include_If_MIssing(unicode::core) -# Thirdparty_Include_If_MIssing(yaml-cpp) -# TODO make me working -macro(ContourThirdPartiesSummary) - message(STATUS "==============================================================================") - message(STATUS " Contour ThirdParties") - message(STATUS "------------------------------------------------------------------------------") - foreach(TP ${ContourThirdParties}) - message(STATUS "${TP}\t\t${THIRDPARTY_BUILTIN_${TP}}") - endforeach() -endmacro() -# Now, conditionally find all dependencies that were not included above -# via find_package, usually system installed packages. +message(STATUS "==============================================================================") +message(STATUS " Contour ThirdParties: ${ContourThirdParties}") -if(CONTOUR_TESTING) - if(TARGET Catch2::Catch2WithMain) - set(THIRDPARTY_BUILTIN_Catch2 "embedded") - else() - find_package(Catch2 REQUIRED) - set(THIRDPARTY_BUILTIN_Catch2 "system package") - endif() -else() - set(THIRDPARTY_BUILTIN_Catch2 "(tests disabled)") -endif() +set(LIBUNICODE_MINIMAL_VERSION "0.4.0") +set(BOXED_CPP_MINIMAL_VERSION "1.2.2") +set(TERMBENCH_PRO_COMMIT_HASH "96c6bb7897af4110d1b99a93b982f8ec10e71183") +set(FMT_VERSION "10.0.0") +set(CATCH_VERSION "3.4.0") +set(RANGE_V3_VERSION "0.12.0") +set(YAML_CPP_VERSION "0.8.0") +set(HARFBUZZ_VERSION "8.4.0") -if(TARGET fmt) - set(THIRDPARTY_BUILTIN_fmt "embedded") -else() - find_package(fmt REQUIRED) - set(THIRDPARTY_BUILTIN_fmt "system package") -endif() if(TARGET GSL) set(THIRDPARTY_BUILTIN_GSL "embedded") +elseif(CONTOUR_USE_CPM) + CPMAddPackage( + NAME GSL + GITHUB_REPOSITORY microsoft/GSL + GIT_TAG v3.1.0 + OPTIONS "GSL_TEST=OFF" + ) + set(THIRDPARTY_BUILTIN_GSL "embedded(CPM)") else() set(THIRDPARTY_BUILTIN_GSL "system package") if (WIN32) @@ -97,35 +84,18 @@ else() endif() endif() -if (TARGET range-v3) - set(THIRDPARTY_BUILTIN_range_v3 "embedded") -else() - find_package(range-v3 REQUIRED) - set(THIRDPARTY_BUILTIN_range_v3 "system package") -endif() - -if (TARGET yaml-cpp) - set(THIRDPARTY_BUILTIN_yaml_cpp "embedded") -else() - find_package(yaml-cpp REQUIRED) - set(THIRDPARTY_BUILTIN_yaml_cpp "system package") -endif() -if (TARGET harfbuzz) - set(THIRDPARTY_BUILTIN_harfbuzz "embedded") -else() - find_package(HarfBuzz REQUIRED) - set(THIRDPARTY_BUILTIN_harfbuzz "system package") -endif() -if (TARGET freetype) - set(THIRDPARTY_BUILTIN_freetype "embedded") -else() - find_package(Freetype REQUIRED) - set(THIRDPARTY_BUILTIN_freetype "system package") +if(CONTOUR_TESTING) + HandleThirdparty(Catch2 "gh:catchorg/Catch2@${CATCH_VERSION}") endif() +HandleThirdparty(fmt "gh:fmtlib/fmt#${FMT_VERSION}") +HandleThirdparty(range-v3 "gh:ericniebler/range-v3#${RANGE_V3_VERSION}") +HandleThirdparty(yaml-cpp "gh:jbeder/yaml-cpp#${YAML_CPP_VERSION}") +HandleThirdparty(Freetype "https://download.savannah.gnu.org/releases/freetype/freetype-2.10.0.tar.gz") +# harfbuzz is only needed for non static builds since qt provides own harfbuzz target +HandleThirdparty(HarfBuzz "gh:harfbuzz/harfbuzz#${HARFBUZZ_VERSION}") -set(LIBUNICODE_MINIMAL_VERSION "0.4.0") if(COMMAND ContourThirdParties_Embed_libunicode) ContourThirdParties_Embed_libunicode() subproject_version(libunicode libunicode_version) @@ -134,8 +104,7 @@ if(COMMAND ContourThirdParties_Embed_libunicode) endif() set(THIRDPARTY_BUILTIN_unicode_core "embedded") else() - find_package(libunicode ${LIBUNICODE_MINIMAL_VERSION} REQUIRED) - set(THIRDPARTY_BUILTIN_unicode_core "system package (${libunicode_VERSION})") + HandleThirdparty(libunicode "gh:contour-terminal/libunicode#v${LIBUNICODE_MINIMAL_VERSION}") endif() if(LIBTERMINAL_BUILD_BENCH_HEADLESS) @@ -150,7 +119,6 @@ else() set(THIRDPARTY_BUILTIN_termbench "(bench-headless disabled)") endif() -set(BOXED_CPP_MINIMAL_VERSION "1.2.2") if(COMMAND ContourThirdParties_Embed_boxed_cpp) ContourThirdParties_Embed_boxed_cpp() subproject_version(boxed-cpp boxed_cpp_version) @@ -159,11 +127,10 @@ if(COMMAND ContourThirdParties_Embed_boxed_cpp) endif() set(THIRDPARTY_BUILTIN_boxed_cpp "embedded") else() - find_package(boxed-cpp ${BOXED_CPP_MINIMAL_VERSION} REQUIRED) - set(THIRDPARTY_BUILTIN_boxed_cpp "system package") - message(STATUS "Found boxed-cpp: ${boxed-cpp_VERSION} (system package)") + HandleThirdparty(boxed_cpp "gh:contour-terminal/boxed-cpp#v${BOXED_CPP_MINIMAL_VERSION}") endif() + macro(ContourThirdPartiesSummary2) message(STATUS "==============================================================================") message(STATUS " Contour ThirdParties") @@ -171,12 +138,16 @@ macro(ContourThirdPartiesSummary2) message(STATUS "Catch2 ${THIRDPARTY_BUILTIN_Catch2}") message(STATUS "GSL ${THIRDPARTY_BUILTIN_GSL}") message(STATUS "fmt ${THIRDPARTY_BUILTIN_fmt}") - message(STATUS "freetype ${THIRDPARTY_BUILTIN_freetype}") - message(STATUS "harfbuzz ${THIRDPARTY_BUILTIN_harfbuzz}") - message(STATUS "range-v3 ${THIRDPARTY_BUILTIN_range_v3}") - message(STATUS "yaml-cpp ${THIRDPARTY_BUILTIN_yaml_cpp}") + message(STATUS "freetype ${THIRDPARTY_BUILTIN_Freetype}") + message(STATUS "harfbuzz ${THIRDPARTY_BUILTIN_HarfBuzz}") + message(STATUS "range-v3 ${THIRDPARTY_BUILTIN_range-v3}") + message(STATUS "yaml-cpp ${THIRDPARTY_BUILTIN_yaml-cpp}") message(STATUS "termbench-pro ${THIRDPARTY_BUILTIN_termbench}") - message(STATUS "libunicode ${THIRDPARTY_BUILTIN_unicode_core}") + if(CONTOUR_USE_CPM) + message(STATUS "libunicode ${THIRDPARTY_BUILTIN_libunicode}") + else() + message(STATUS "libunicode ${THIRDPARTY_BUILTIN_unicode_core}") + endif() message(STATUS "boxed-cpp ${THIRDPARTY_BUILTIN_boxed_cpp}") message(STATUS "------------------------------------------------------------------------------") endmacro() diff --git a/metainfo.xml b/metainfo.xml index c62e9d0ffb..228dd772db 100644 --- a/metainfo.xml +++ b/metainfo.xml @@ -117,6 +117,8 @@