gen2brain / go-fitz

Golang wrapper for the MuPDF Fitz library
GNU Affero General Public License v3.0
369 stars 87 forks source link

Have go-fitz build in bazel #62

Closed charlesoconor closed 1 year ago

charlesoconor commented 1 year ago

I was having some trouble pulling this library into bazel and wanted to share what worked for me. Gazelle doesn't seem to pick up the artifact files correctly, so had to modify it to know about them. Only tested this on Linux and mac x86 but would assume it would build correctly for all of the platforms there are artifact files provided.

To get this hooked up into my repo. I used the new_git_repository rule and provided the BUILD.bazel file in this PR to it in build_file_content with some modifications. All of the paths needed in the copts and clink attrs had to be prefixed with external/<workspace_name>. Would like to figure out how to pull the header and artifact paths from Make files but ran into a lot of issues trying to figure it out and have at least a working solution. Would like to fix that if anyone has ideas.

I know the repo probably doesn't want to use bazel as its build system but wanted a place to post this where people would find it.

https://github.com/gen2brain/go-fitz/issues/46 https://github.com/gen2brain/go-fitz/issues/31

gen2brain commented 1 year ago

Thanks, this can stay as a reference if someone wants to use/build upon it. I have no intention of supporting other build systems besides the official Go one. I do not use it, don't know what gazelle is, etc. As far as I remember in the past Bazel didn't even recognize build tags and was trying to build all files at once.

AFMiziara commented 4 months ago

@charlesoconor thanks for the detailed explanation. For anyone also needing this, another approach is to create a .patch file like that:

--- BUILD.bazel 2024-03-05 21:13:20
+++ BUILD.bazel 2024-03-05 21:13:13
@@ -1,5 +1,73 @@
 load("@io_bazel_rules_go//go:def.bzl", "go_library", "go_test")

+
+cc_library(
+    name = "mupdf",
+    srcs = select({
+        "@io_bazel_rules_go//go/platform:android_386": [
+            "libs/libmupdf_linux_386.a",
+            "libs/libmupdfthird_linux_386.a",
+        ],
+        "@io_bazel_rules_go//go/platform:android_amd64": [
+            "libs/libmupdf_linux_amd64.a",
+            "libs/libmupdfthird_linux_amd64.a",
+        ],
+        "@io_bazel_rules_go//go/platform:android_arm": [
+            "libs/libmupdf_android_arm.a",
+            "libs/libmupdfthird_android_arm.a",
+        ],
+        "@io_bazel_rules_go//go/platform:android_arm64": [
+            "libs/libmupdf_android_arm64.a",
+            "libs/libmupdfthird_android_arm64.a",
+        ],
+        "@io_bazel_rules_go//go/platform:darwin_amd64": [
+            "libs/libmupdf_darwin_amd64.a",
+            "libs/libmupdfthird_darwin_amd64.a",
+        ],
+        "@io_bazel_rules_go//go/platform:darwin_arm64": [
+            "libs/libmupdf_darwin_arm64.a",
+            "libs/libmupdfthird_darwin_arm64.a",
+        ],
+        "@io_bazel_rules_go//go/platform:ios_amd64": [
+            "libs/libmupdf_darwin_amd64.a",
+            "libs/libmupdfthird_darwin_amd64.a",
+        ],
+        "@io_bazel_rules_go//go/platform:ios_arm64": [
+            "libs/libmupdf_darwin_arm64.a",
+            "libs/libmupdfthird_darwin_arm64.a",
+        ],
+        "@io_bazel_rules_go//go/platform:linux_386": [
+            "libs/libmupdf_linux_386.a",
+            "libs/libmupdfthird_linux_386.a",
+        ],
+        "@io_bazel_rules_go//go/platform:linux_amd64": [
+            "libs/libmupdf_linux_amd64.a",
+            "libs/libmupdfthird_linux_amd64.a",
+        ],
+        "@io_bazel_rules_go//go/platform:linux_arm": [
+            "libs/libmupdf_linux_arm.a",
+            "libs/libmupdfthird_linux_arm.a",
+        ],
+        "@io_bazel_rules_go//go/platform:linux_arm64": [
+            "libs/libmupdf_linux_arm64.a",
+            "libs/libmupdfthird_linux_arm64.a",
+        ],
+        "@io_bazel_rules_go//go/platform:windows_386": [
+            "libs/libmupdf_windows_386.a",
+            "libs/libmupdfthird_windows_386.a",
+        ],
+        "@io_bazel_rules_go//go/platform:windows_amd64": [
+            "libs/libmupdf_windows_amd64.a",
+            "libs/libmupdfthird_windows_amd64.a",
+        ],
+        "//conditions:default": [],
+    }),
+    hdrs = glob(
+        ["include/**/*.h"],
+        allow_empty = False,
+    ),
+)
+
 go_library(
     name = "go-fitz",
     srcs = [
@@ -7,53 +75,54 @@
         "fitz_cgo.go",
         "fitz_content_types.go",
     ],
+    cdeps = [":mupdf"],
     cgo = True,
     clinkopts = select({
         "@io_bazel_rules_go//go/platform:android_386": [
-            "-Llibs -lmupdf_linux_386 -lmupdfthird_linux_386 -lm",
+            "-Lexternal/com_github_gen2brain_go_fitz/libs -lmupdf_linux_386 -lmupdfthird_linux_386 -lm",
         ],
         "@io_bazel_rules_go//go/platform:android_amd64": [
-            "-Llibs -lmupdf_linux_amd64 -lmupdfthird_linux_amd64 -lm",
+            "-Lexternal/com_github_gen2brain_go_fitz/libs -lmupdf_linux_amd64 -lmupdfthird_linux_amd64 -lm",
         ],
         "@io_bazel_rules_go//go/platform:android_arm": [
-            "-Llibs -lmupdf_android_arm -lmupdfthird_android_arm -lm -llog",
+            "-Lexternal/com_github_gen2brain_go_fitz/libs -lmupdf_android_arm -lmupdfthird_android_arm -lm -llog",
         ],
         "@io_bazel_rules_go//go/platform:android_arm64": [
-            "-Llibs -lmupdf_android_arm64 -lmupdfthird_android_arm64 -lm -llog",
+            "-Lexternal/com_github_gen2brain_go_fitz/libs -lmupdf_android_arm64 -lmupdfthird_android_arm64 -lm -llog",
         ],
         "@io_bazel_rules_go//go/platform:darwin_amd64": [
-            "-Llibs -lmupdf_darwin_amd64 -lmupdfthird_darwin_amd64 -lm",
+            "-Lexternal/com_github_gen2brain_go_fitz/libs -lmupdf_darwin_amd64 -lmupdfthird_darwin_amd64 -lm",
         ],
         "@io_bazel_rules_go//go/platform:darwin_arm64": [
-            "-Llibs -lmupdf_darwin_arm64 -lmupdfthird_darwin_arm64 -lm",
+            "-Lexternal/com_github_gen2brain_go_fitz/libs -lmupdf_darwin_arm64 -lmupdfthird_darwin_arm64 -lm",
         ],
         "@io_bazel_rules_go//go/platform:ios_amd64": [
-            "-Llibs -lmupdf_darwin_amd64 -lmupdfthird_darwin_amd64 -lm",
+            "-Lexternal/com_github_gen2brain_go_fitz/libs -lmupdf_darwin_amd64 -lmupdfthird_darwin_amd64 -lm",
         ],
         "@io_bazel_rules_go//go/platform:ios_arm64": [
-            "-Llibs -lmupdf_darwin_arm64 -lmupdfthird_darwin_arm64 -lm",
+            "-Lexternal/com_github_gen2brain_go_fitz/libs -lmupdf_darwin_arm64 -lmupdfthird_darwin_arm64 -lm",
         ],
         "@io_bazel_rules_go//go/platform:linux_386": [
-            "-Llibs -lmupdf_linux_386 -lmupdfthird_linux_386 -lm",
+            "-Lexternal/com_github_gen2brain_go_fitz/libs -lmupdf_linux_386 -lmupdfthird_linux_386 -lm",
         ],
         "@io_bazel_rules_go//go/platform:linux_amd64": [
-            "-Llibs -lmupdf_linux_amd64 -lmupdfthird_linux_amd64 -lm",
+            "-Lexternal/com_github_gen2brain_go_fitz/libs -lmupdf_linux_amd64 -lmupdfthird_linux_amd64 -lm",
         ],
         "@io_bazel_rules_go//go/platform:linux_arm": [
-            "-Llibs -lmupdf_linux_arm -lmupdfthird_linux_arm -lm",
+            "-Lexternal/com_github_gen2brain_go_fitz/libs -lmupdf_linux_arm -lmupdfthird_linux_arm -lm",
         ],
         "@io_bazel_rules_go//go/platform:linux_arm64": [
-            "-Llibs -lmupdf_linux_arm64 -lmupdfthird_linux_arm64 -lm",
+            "-Lexternal/com_github_gen2brain_go_fitz/libs -lmupdf_linux_arm64 -lmupdfthird_linux_arm64 -lm",
         ],
         "@io_bazel_rules_go//go/platform:windows_386": [
-            "-Llibs -lmupdf_windows_386 -lmupdfthird_windows_386 -lm -lcomdlg32 -lgdi32 -lmsvcr90 -Wl,--allow-multiple-definition",
+            "-Lexternal/com_github_gen2brain_go_fitz/libs -lmupdf_windows_386 -lmupdfthird_windows_386 -lm -lcomdlg32 -lgdi32 -lmsvcr90 -Wl,--allow-multiple-definition",
         ],
         "@io_bazel_rules_go//go/platform:windows_amd64": [
-            "-Llibs -lmupdf_windows_amd64 -lmupdfthird_windows_amd64 -lm -lcomdlg32 -lgdi32 -Wl,--allow-multiple-definition",
+            "-Lexternal/com_github_gen2brain_go_fitz/libs -lmupdf_windows_amd64 -lmupdfthird_windows_amd64 -lm -lcomdlg32 -lgdi32 -Wl,--allow-multiple-definition",
         ],
         "//conditions:default": [],
     }),
-    copts = ["-Iinclude"],
+    copts = ["-Iexternal/com_github_gen2brain_go_fitz/include"],
     importpath = "github.com/gen2brain/go-fitz",
     visibility = ["//visibility:public"],
 )

And add this patch to go-fitz on deps.bzl:

    go_repository(
        name = "com_github_gen2brain_go_fitz",
        importpath = "github.com/gen2brain/go-fitz",
        patches = [
            "//third_party/com_github_gen2brain_go_fitz:root_BUILD_bazel.patch",
        ],
        sum = "h1:HPhzEVzmOINvCKqQgB/DwMzYh4ArIgy3tMwq1eJTcbg=",
        version = "v1.23.7",
    )