Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Provide a source build fallback #19

Closed
mara004 opened this issue Dec 4, 2021 · 9 comments · Fixed by #20
Closed

Provide a source build fallback #19

mara004 opened this issue Dec 4, 2021 · 9 comments · Fixed by #20
Assignees
Labels
development General development/contribution discussions enhancement New feature or request

Comments

@mara004
Copy link
Member

mara004 commented Dec 4, 2021

Add a generic source build strategy for platforms where we don't have pre-built binaries:

  • Download DepotTools and PDFium
  • Set configuration, optionally apply patches
  • Perform the build
  • Move header files and binary to data/sourcebuild
  • Package a wheel
@mara004 mara004 added enhancement New feature or request development General development/contribution discussions labels Dec 4, 2021
@mara004 mara004 self-assigned this Dec 4, 2021
@mara004
Copy link
Member Author

mara004 commented Dec 4, 2021

I've started experimenting in the sourcebuild branch.
The build appears to work, but the generated binary - for some peculiar reason - is much smaller than it should be, and not even the FPDF_InitLibrary call works. I'll have to investigate this. My guess is that I need to apply more patches from pdfium-binaries.

@adam-huganir
Copy link
Member

adam-huganir commented Dec 4, 2021

I look forward to seeing out it works, the ctypesgen builds + the binaries are always temperamental for me for any project I use them for

@mara004
Copy link
Member Author

mara004 commented Dec 4, 2021

Yeah, I concur. Being dependent on external binaries is a big limitation, that's why I started working on this...

@mara004
Copy link
Member Author

mara004 commented Dec 4, 2021

@adam-huganir I've pushed a commit incorporating more patches (5319f40). The generated binary now works and our tests pass. (Some of the patches apparently can't be applied, but I guess that's an upstream issue. Update: fixed now - I just used the wrong command to apply the patches.)

@mara004 mara004 linked a pull request Dec 4, 2021 that will close this issue
@mara004
Copy link
Member Author

mara004 commented Dec 9, 2021

@adam-huganir I believe that the source build script should be pretty solid now. In case you haven't done yet, could you maybe try it on your device, to confirm that PDFium builds correctly just by running the script, to make sure I haven't missed any external dependencies?

@adam-huganir
Copy link
Member

adam-huganir commented Dec 9, 2021

Ok, so fresh clone of main, in a fresh python 3.8.12 environment:

  1. Source build works with no issues, though I have a bunch of dev dependencies in general on my computer, so this should probably be tested in a vm at some point
  2. because sourcebuild generates libpdfium.so library instead of one named pdfium I had to change the load line in pypdfium2/_pypdfium.py
   806 # Begin libraries
>> 807 _libs["pdfium"] = load_library("libpdfium.so") # from 'pdfium'

so you will need to change wherever that is generated (I guess cytpesgen call time?)

After changing that and installing Pillow everything worked as expected 👍

@mara004
Copy link
Member Author

mara004 commented Dec 9, 2021

Thanks for testing!

because sourcebuild generates libpdfium.so library instead of one named pdfium I had to change the load line in pypdfium2/_pypdfium.py

I already thought about that when writing the script, and had implemented the option --destname to allow for renaming the binary, e. g. to pdfium. However, on my machine it was also possible to load libpdfium.so, but that might be because I'm using a newer version of ctypesgen that I installed from its current git repository.
From looking at the library loader in the generated bindings file, this naming pattern should be detected:

class PosixLibraryLoader(LibraryLoader):
    """Library loader for POSIX-like systems (including Linux)"""
    _ld_so_cache = None
    _include = re.compile(r"^\s*include\s+(?P<pattern>.*)")
    name_formats = ["lib%s.so", "%s.so", "%s"]

@mara004
Copy link
Member Author

mara004 commented Dec 9, 2021

After changing that and installing Pillow

Oh, that's a good catch - I totally forgot to list Pillow as installation requirement in setup.cfg! I'll fix that soon.

mara004 added a commit that referenced this issue Dec 9, 2021
@mara004
Copy link
Member Author

mara004 commented Dec 10, 2021

Source build works with no issues, though I have a bunch of dev dependencies in general on my computer, so this should probably be tested in a vm at some point

I just successfully built PyPDFium2 in VirtualBox with OpenSUSE Leap 15.3. However, I yet found some important external dependencies that I've listed in DEPS.txt now.

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
development General development/contribution discussions enhancement New feature or request
Projects
None yet
Development

Successfully merging a pull request may close this issue.

2 participants