summaryrefslogtreecommitdiffstats
path: root/docs/mingw-example/Dockerfile
blob: acddf56d069fce7781649fbf74eeaa9d3f1c5422 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
FROM ubuntu:22.04 as builder
ENV DEBIAN_FRONTEND=noninteractive
RUN apt-get update -qq
RUN apt-get install -y xz-utils wget make nasm git ninja-build autoconf automake libtool texinfo help2man yasm gcc pkg-config

# SETUP WORKSPACE
WORKDIR /tmp
# RUN wget https://github.com/mstorsjo/llvm-mingw/releases/download/20230320/llvm-mingw-20230320-ucrt-ubuntu-18.04-x86_64.tar.xz -O llvm.tar.xz && \
RUN wget https://github.com/mstorsjo/llvm-mingw/releases/download/20230320/llvm-mingw-20230320-msvcrt-ubuntu-18.04-x86_64.tar.xz -O llvm.tar.xz && \
  tar -xf llvm.tar.xz && \
  cp -a /tmp/llvm-mingw-20230320-msvcrt-ubuntu-18.04-x86_64/* /usr/ && \
  rm -rf /tmp/*

RUN mkdir /src
WORKDIR /src

# SETUP TOOLCHAIN
RUN mkdir /src/patch
ARG ARCH
ENV TOOLCHAIN_ARCH=$ARCH

FROM builder as cmake-builder
RUN apt-get install -y cmake
COPY toolchain/cmake /src/toolchain/cmake
ENV TOOLCHAIN_NAME=$TOOLCHAIN_ARCH-w64-mingw32
ENV TOOLCHAIN_CMAKE=/src/toolchain/cmake/$TOOLCHAIN_NAME-toolchain.cmake

FROM builder as meson-builder
RUN apt-get install -y meson
COPY toolchain/meson /src/toolchain/meson
ENV TOOLCHAIN_MESON=/src/toolchain/meson/$TOOLCHAIN_ARCH.txt

# BUILD ZLIB
FROM cmake-builder AS zlib-build
RUN git clone https://github.com/madler/zlib.git /src/zlib
WORKDIR /src/zlib
RUN git fetch; git checkout 04f42ceca40f73e2978b50e93806c2a18c1281fc
RUN mkdir /src/zlib/build
WORKDIR /src/zlib/build
RUN cmake .. -DCMAKE_TOOLCHAIN_FILE=$TOOLCHAIN_CMAKE -G Ninja -Wno-dev -DCMAKE_INSTALL_PREFIX=/build -DCMAKE_BUILD_TYPE=Release
RUN cmake --build . -j `nproc`
RUN cmake --install .

# BUILD OPENSSL
FROM cmake-builder AS openssl-build
RUN git clone https://github.com/janbar/openssl-cmake.git /src/openssl
WORKDIR /src/openssl
RUN mkdir /src/openssl/build
WORKDIR /src/openssl/build
RUN cmake .. -DCMAKE_TOOLCHAIN_FILE=$TOOLCHAIN_CMAKE -G Ninja -Wno-dev -DCMAKE_INSTALL_PREFIX=/build \
             -DCMAKE_BUILD_TYPE=Release -DBUILD_SHARED_LIBS=OFF
RUN cmake --build . -j `nproc`
RUN cmake --install . 

# BUILD OPENH264
FROM meson-builder AS openh264-build
RUN git clone https://github.com/cisco/openh264 /src/openh264
WORKDIR /src/openh264
RUN git fetch; git checkout 0a48f4d2e9be2abb4fb01b4c3be83cf44ce91a6e
RUN mkdir /src/openh264/out
WORKDIR /src/openh264/out
RUN meson .. . --cross-file $TOOLCHAIN_MESON --prefix=/build
RUN ninja -j `nproc`
RUN ninja install

# # BUILD LIBUSB
FROM cmake-builder AS libusb-build
RUN git clone https://github.com/libusb/libusb.git /src/libusb
WORKDIR /src/libusb
RUN git fetch; git checkout 4239bc3a50014b8e6a5a2a59df1fff3b7469543b
RUN mkdir m4; autoreconf -ivf
RUN sed -i.bak "s/-mwin32//g" ./configure
RUN sed -i.bak "s/--add-stdcall-alias//g" ./configure
RUN ./configure --host=$TOOLCHAIN_NAME --prefix=/build
RUN make -j `nproc` && make install

# BUILD FAAC
FROM cmake-builder AS faac-build
RUN git clone https://github.com/knik0/faac.git /src/faac
WORKDIR /src/faac
RUN git fetch; git checkout 78d8e0141600ac006a94ac6fd5601f599fa5b65b
RUN sed -i.bak "s/-Wl,--add-stdcall-alias//g" ./libfaac/Makefile.am
RUN mkdir m4; autoreconf -ivf
RUN sed -i.bak "s/-mwin32//g" ./configure
RUN ./configure --host=$TOOLCHAIN_NAME --prefix=/build
RUN make -j `nproc` && make install

# BUILD FAAD2
FROM cmake-builder AS faad2-build
RUN git clone https://github.com/knik0/faad2.git /src/faad2
WORKDIR /src/faad2
RUN git fetch; git checkout 3918dee56063500d0aa23d6c3c94b211ac471a8c
RUN sed -i.bak "s/-Wl,--add-stdcall-alias//g" ./libfaad/Makefile.am
RUN mkdir m4; autoreconf -ivf
RUN sed -i.bak "s/-mwin32//g" ./configure
RUN ./configure --host=$TOOLCHAIN_NAME --prefix=/build
RUN make -j `nproc` && make install

# BUILD OPENCL-HEADERS
FROM cmake-builder AS opencl-headers
RUN git clone https://github.com/KhronosGroup/OpenCL-Headers.git /src/opencl-headers
WORKDIR /src/opencl-headers
RUN git fetch; git checkout 4fdcfb0ae675f2f63a9add9552e0af62c2b4ed30
RUN mkdir /src/opencl-headers/build
WORKDIR /src/opencl-headers/build
RUN cmake .. -DCMAKE_TOOLCHAIN_FILE=$TOOLCHAIN_CMAKE -G Ninja -Wno-dev -DCMAKE_INSTALL_PREFIX=/build \
             -DCMAKE_BUILD_TYPE=Release -DBUILD_SHARED_LIBS=OFF
RUN cmake --build . -j `nproc`
RUN cmake --install . 

# BUILD OPENCL
FROM cmake-builder AS opencl-build
COPY --from=opencl-headers /build /build
RUN git clone https://github.com/KhronosGroup/OpenCL-ICD-Loader.git /src/opencl
WORKDIR /src/opencl
RUN git fetch; git checkout b1bce7c3c580a8345205cf65fc1a5f55ba9cdb01
RUN echo 'set_target_properties (OpenCL PROPERTIES PREFIX "")' >> CMakeLists.txt
RUN mkdir /src/opencl/build
WORKDIR /src/opencl/build
RUN cmake .. -DCMAKE_TOOLCHAIN_FILE=$TOOLCHAIN_CMAKE -G Ninja -Wno-dev -DCMAKE_INSTALL_PREFIX=/build \
             -DBUILD_SHARED_LIBS=OFF -DOPENCL_ICD_LOADER_DISABLE_OPENCLON12=ON  \
             -DCMAKE_BUILD_TYPE=Release -DBUILD_TESTING=OFF \
             -DCMAKE_C_FLAGS="${CMAKE_C_FLAGS} -I/build/include/" \
             -DCMAKE_CXX_FLAGS="${CMAKE_CXX_FLAGS} -I/build/include/"
RUN cmake --build . -j `nproc`
RUN cmake --install . 

# BUILD FREERDP
FROM cmake-builder AS freerdp-build
COPY --from=zlib-build /build /build
COPY --from=openssl-build /build /build
COPY --from=openh264-build /build /build
COPY --from=libusb-build /build /build
COPY --from=faac-build /build /build
COPY --from=faad2-build /build /build
COPY --from=opencl-build /build /build
RUN git clone https://github.com/FreeRDP/FreeRDP.git /src/FreeRDP
RUN mkdir /src/FreeRDP/build
WORKDIR /src/FreeRDP/build

ARG ARCH
RUN /bin/bash -c "( [[ $ARCH == aarch64 ]] && printf 'arm64' || printf $ARCH ) > arch.txt"

RUN bash -c "cmake .. -DCMAKE_TOOLCHAIN_FILE=$TOOLCHAIN_CMAKE -G Ninja -Wno-dev -DCMAKE_INSTALL_PREFIX=/build \
             -DWITH_X11=OFF -DWITH_MEDIA_FOUNDATION=OFF -DBUILD_SHARED_LIBS=OFF -DCMAKE_BUILD_TYPE=Release \
             -DUSE_UNWIND=OFF \
             -DWITH_ZLIB=ON  -DZLIB_INCLUDE_DIR=/build  \
             -DWITH_OPENH264=ON -DOPENH264_INCLUDE_DIR=/build/include -DOPENH264_LIBRARY=/build/lib/libopenh264.dll.a \
             -DOPENSSL_INCLUDE_DIR=/build/include \
             -DWITH_OPENCL=ON -DOpenCL_INCLUDE_DIR=/build/include -DOpenCL_LIBRARIES=/build/lib/OpenCL.a \
             -DLIBUSB_1_INCLUDE_DIRS=/build/include/libusb-1.0 -DLIBUSB_1_LIBRARIES=/build/lib/libusb-1.0.a \
             -DWITH_WINPR_TOOLS=OFF -DWITH_WIN_CONSOLE=ON -DWITH_PROGRESS_BAR=OFF \
             -DWITH_FAAD2=ON -DFAAD2_INCLUDE_DIR=/build/include -DFAAD2_LIBRARY=/build/lib/libfaad.a \
             -DWITH_FAAC=ON -DFAAC_INCLUDE_DIR=/build/include -DFAAC_LIBRARY=/build/lib/libfaac.a \
						 -DCMAKE_SYSTEM_PROCESSOR=$( cat arch.txt ) \
             -DCMAKE_C_FLAGS=\"${CMAKE_C_FLAGS} -static -Wno-error=incompatible-function-pointer-types -DERROR_OPERATION_IN_PROGRESS=0x00000149\" \
						 "
RUN cmake --build . -j `nproc`
RUN cmake --install . 
RUN cp -a /usr/$ARCH-w64-mingw32/bin/* /build/bin;