diff --git a/Dockerfile.windows-build b/Dockerfile.windows-build new file mode 100644 index 0000000..88400f3 --- /dev/null +++ b/Dockerfile.windows-build @@ -0,0 +1,101 @@ +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/