FROM ubuntu:24.04 # Install required tools for MinGW cross-compilation, CMake, and dependencies RUN apt-get update && apt-get install -y \ git \ make \ curl \ wget \ unzip \ cmake \ build-essential \ mingw-w64 \ g++-mingw-w64-x86-64-posix \ gcc-mingw-w64-x86-64-posix \ pkg-config \ && rm -rf /var/lib/apt/lists/* # Download and install Go 1.25.4 RUN wget https://go.dev/dl/go1.25.4.linux-amd64.tar.gz && \ tar -C /usr/local -xzf go1.25.4.linux-amd64.tar.gz && \ rm go1.25.4.linux-amd64.tar.gz ENV PATH=$PATH:/usr/local/go/bin # Download OpenCV 4.12.0 source RUN wget https://github.com/opencv/opencv/archive/4.12.0.zip && \ unzip 4.12.0.zip && \ mv opencv-4.12.0 opencv && \ rm 4.12.0.zip # Create MinGW toolchain file for CMake RUN echo 'set(CMAKE_SYSTEM_NAME Windows)' > /opencv/toolchain.cmake && \ echo 'set(CMAKE_SYSTEM_PROCESSOR AMD64)' >> /opencv/toolchain.cmake && \ echo 'set(TOOLCHAIN x86_64-w64-mingw32)' >> /opencv/toolchain.cmake && \ echo 'set(CMAKE_C_COMPILER /usr/bin/${TOOLCHAIN}-gcc-posix)' >> /opencv/toolchain.cmake && \ echo 'set(CMAKE_CXX_COMPILER /usr/bin/${TOOLCHAIN}-g++-posix)' >> /opencv/toolchain.cmake && \ echo 'set(CMAKE_RC_COMPILER /usr/bin/${TOOLCHAIN}-windres)' >> /opencv/toolchain.cmake && \ echo 'set(CMAKE_FIND_ROOT_PATH /usr/${TOOLCHAIN})' >> /opencv/toolchain.cmake && \ echo 'set(CMAKE_FIND_ROOT_PATH_MODE_PROGRAM NEVER)' >> /opencv/toolchain.cmake && \ echo 'set(CMAKE_FIND_ROOT_PATH_MODE_LIBRARY ONLY)' >> /opencv/toolchain.cmake && \ echo 'set(CMAKE_FIND_ROOT_PATH_MODE_INCLUDE ONLY)' >> /opencv/toolchain.cmake # Build and install OpenCV for Windows (static libs, minimal build to avoid dependency issues) RUN cd /opencv && mkdir build && cd build && \ cmake -DCMAKE_TOOLCHAIN_FILE=../toolchain.cmake \ -DCMAKE_INSTALL_PREFIX=/usr/x86_64-w64-mingw32 \ -DBUILD_SHARED_LIBS=OFF \ -DWITH_IPP=OFF \ -DBUILD_EXAMPLES=OFF \ -DBUILD_TESTS=OFF \ -DBUILD_PERF_TESTS=OFF \ -DBUILD_opencv_apps=OFF \ -DWITH_FFMPEG=OFF \ -DWITH_OPENGL=OFF \ -DWITH_QT=OFF \ -DWITH_VTK=OFF \ -DWITH_GTK=OFF \ -DCPU_BASELINE=SSE3 \ -DWITH_TBB=OFF \ -DWITH_PROTOBUF=ON \ -DBUILD_PROTOBUF=ON \ -DPROTOBUF_UPDATE_FILES=OFF \ -DWITH_PNG=ON \ -DWITH_JPEG=ON \ -DWITH_TIFF=ON \ -DWITH_WEBP=ON \ -DWITH_OPENJPEG=ON \ -DWITH_OPENEXR=OFF \ -DBUILD_PNG=ON \ -DBUILD_JPEG=ON \ -DBUILD_TIFF=ON \ -DBUILD_WEBP=ON \ -DBUILD_OPENJPEG=ON \ -DBUILD_ZLIB=ON \ .. && \ make -j$(nproc) && \ make install # List the actual libraries to help debug RUN echo "Installed OpenCV libraries:" && ls -la /usr/x86_64-w64-mingw32/lib/*.a | head -30 # Set CGO environment variables with corrected library names and paths ENV CGO_CPPFLAGS="-I/usr/x86_64-w64-mingw32/include/opencv4" ENV CGO_CXXFLAGS="--std=c++11" # Include both main lib directory and opencv4/3rdparty subdirectory, use correct library names and Windows system libs ENV CGO_LDFLAGS="-L/usr/x86_64-w64-mingw32/lib -L/usr/x86_64-w64-mingw32/lib/opencv4/3rdparty -lopencv_core4120 -lopencv_imgproc4120 -lopencv_objdetect4120 -lopencv_flann4120 -lopencv_features2d4120 -lopencv_calib3d4120 -lopencv_highgui4120 -lopencv_videoio4120 -lopencv_imgcodecs4120 -lopencv_video4120 -lopencv_photo4120 -lopencv_ml4120 -lopencv_dnn4120 -lopencv_gapi4120 -lopencv_stitching4120 -llibprotobuf -llibpng -llibopenjp2 -llibwebp -llibtiff -llibjpeg-turbo -lzlib -lade -lgdi32 -lole32 -loleaut32 -luuid -lcomdlg32 -lstdc++fs -lws2_32 -static-libgcc -static-libstdc++ -static" ENV PKG_CONFIG_PATH=/usr/x86_64-w64-mingw32/lib/pkgconfig ENV LD_LIBRARY_PATH=/usr/x86_64-w64-mingw32/lib # Clone the repository RUN git clone https://git.weirdcat.su/weirdcat/auto-attendance.git /go/src/auto-attendance # Set working directory WORKDIR /go/src/auto-attendance # Download Go modules RUN go mod download # Build the Windows executable with CGO enabled, customenv tag, and MinGW compilers RUN GOOS=windows GOARCH=amd64 CGO_ENABLED=1 \ CC=x86_64-w64-mingw32-gcc-posix CXX=x86_64-w64-mingw32-g++-posix \ go build -tags customenv -v -o bin/autoattendance.exe ./cmd/