Skip to content

Commit

Permalink
Add Static build and CPM
Browse files Browse the repository at this point in the history
  • Loading branch information
Yaraslaut authored and christianparpart committed Jun 30, 2024
1 parent 28c45d6 commit 26798a2
Show file tree
Hide file tree
Showing 14 changed files with 285 additions and 94 deletions.
50 changes: 50 additions & 0 deletions .github/static/DockerQt
Original file line number Diff line number Diff line change
@@ -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++
20 changes: 20 additions & 0 deletions .github/static/DockerUbuntu
Original file line number Diff line number Diff line change
@@ -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
14 changes: 14 additions & 0 deletions .github/static/readme
Original file line number Diff line number Diff line change
@@ -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
```
40 changes: 40 additions & 0 deletions .github/workflows/build.yml
Original file line number Diff line number Diff line change
Expand Up @@ -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:
Expand Down
2 changes: 2 additions & 0 deletions .gitignore
Original file line number Diff line number Diff line change
Expand Up @@ -67,3 +67,5 @@ src/contour/ui/main.qml

# mkdocs
docs/vt-sequence/index.md

version.txt
21 changes: 21 additions & 0 deletions CMakeLists.txt
Original file line number Diff line number Diff line change
Expand Up @@ -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)
Expand Down Expand Up @@ -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)
Expand Down
133 changes: 52 additions & 81 deletions cmake/ContourThirdParties.cmake
Original file line number Diff line number Diff line change
Expand Up @@ -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)
Expand All @@ -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)
Expand All @@ -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)
Expand All @@ -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)
Expand All @@ -159,24 +127,27 @@ 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")
message(STATUS "------------------------------------------------------------------------------")
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()
2 changes: 2 additions & 0 deletions metainfo.xml
Original file line number Diff line number Diff line change
Expand Up @@ -117,6 +117,8 @@
<li>Add SGRSAVE and SGRRESTORE VT sequences to save and restore SGR state (They intentionally conflict with XTPUSHSGR and XTPOPSGR)</li>
<li>Add extended word selection feature (#1023)</li>
<li>Add some more missing vi input motions, such as `y$`, `o$`, and many others as initiated by `y` and `o` (#1441)</li>
<li>Add CPM fallback for the dependencies</li>
<li>Add static build</li>
<li>Add shell integration for bash shell.</li>
<li>Add better bell sound (#1378)</li>
<li>Add config entry to configure behaviour on exit from search mode</li>
Expand Down
6 changes: 3 additions & 3 deletions scripts/install-deps.sh
Original file line number Diff line number Diff line change
Expand Up @@ -139,9 +139,9 @@ fetch_and_unpack_libunicode()
fetch_and_unpack_yaml_cpp()
{
fetch_and_unpack \
yaml-cpp-yaml-cpp-0.7.0 \
yaml-cpp-0.7.0.tar.gz \
https://github.com/jbeder/yaml-cpp/archive/refs/tags/yaml-cpp-0.7.0.tar.gz
yaml-cpp-0.8.0 \
yaml-cpp-0.8.0.tar.gz \
https://github.com/jbeder/yaml-cpp/archive/refs/tags/0.8.0.tar.gz
}

fetch_and_unpack_range()
Expand Down
Loading

0 comments on commit 26798a2

Please sign in to comment.