kpdemetriou/pqcrypto

Fails to install on macOS

mouse07410 opened this issue · 3 comments

macOS 10.15.6, Xcode-11.7, Python-3.8.5.

$ sudo -EH pip3 install pqcrypto
Collecting pqcrypto
  Using cached pqcrypto-0.1.2.tar.gz (1.4 MB)
  Installing build dependencies ... done
  Getting requirements to build wheel ... done
    Preparing wheel metadata ... done
Collecting cffi<2.0.0,>=1.14.2
  Using cached cffi-1.14.2-cp38-cp38-macosx_10_9_x86_64.whl (176 kB)
Requirement already satisfied: pycparser in /opt/local/Library/Frameworks/Python.framework/Versions/3.8/lib/python3.8/site-packages (from cffi<2.0.0,>=1.14.2->pqcrypto) (2.19)
Building wheels for collected packages: pqcrypto
  Building wheel for pqcrypto (PEP 517) ... error
  ERROR: Command errored out with exit status 1:
   command: /opt/local/Library/Frameworks/Python.framework/Versions/3.8/bin/python3.8 /opt/local/Library/Frameworks/Python.framework/Versions/3.8/lib/python3.8/site-packages/pip/_vendor/pep517/_in_process.py build_wheel /var/folders/c6/lnc_0m093ys8w16md_fm1mnxhtfnj8/T/tmpgymhwbqm
       cwd: /private/var/folders/c6/lnc_0m093ys8w16md_fm1mnxhtfnj8/T/pip-install-1hzsrnnj/pqcrypto
  Complete output (476 lines):
  Traceback (most recent call last):
    File "/private/var/folders/c6/lnc_0m093ys8w16md_fm1mnxhtfnj8/T/pip-build-env-h881v55v/overlay/lib/python3.8/site-packages/poetry/utils/env.py", line 912, in _run
      output = subprocess.check_output(
    File "/opt/local/Library/Frameworks/Python.framework/Versions/3.8/lib/python3.8/subprocess.py", line 411, in check_output
      return run(*popenargs, stdout=PIPE, timeout=timeout, check=True,
    File "/private/var/folders/c6/lnc_0m093ys8w16md_fm1mnxhtfnj8/T/pip-build-env-h881v55v/overlay/lib/python3.8/site-packages/poetry/utils/_compat.py", line 205, in run
      raise CalledProcessError(
  poetry.utils._compat.CalledProcessError: Command '['python', 'setup.py', 'build', '-b', 'build']' returned non-zero exit status 1.
  
  During handling of the above exception, another exception occurred:
  
  Traceback (most recent call last):
    File "/opt/local/Library/Frameworks/Python.framework/Versions/3.8/lib/python3.8/site-packages/pip/_vendor/pep517/_in_process.py", line 280, in <module>
      main()
    File "/opt/local/Library/Frameworks/Python.framework/Versions/3.8/lib/python3.8/site-packages/pip/_vendor/pep517/_in_process.py", line 263, in main
      json_out['return_val'] = hook(**hook_input['kwargs'])
    File "/opt/local/Library/Frameworks/Python.framework/Versions/3.8/lib/python3.8/site-packages/pip/_vendor/pep517/_in_process.py", line 204, in build_wheel
      return _build_backend().build_wheel(wheel_directory, config_settings,
    File "/private/var/folders/c6/lnc_0m093ys8w16md_fm1mnxhtfnj8/T/pip-build-env-h881v55v/overlay/lib/python3.8/site-packages/poetry/masonry/api.py", line 62, in build_wheel
      WheelBuilder.make_in(
    File "/private/var/folders/c6/lnc_0m093ys8w16md_fm1mnxhtfnj8/T/pip-build-env-h881v55v/overlay/lib/python3.8/site-packages/poetry/masonry/builders/wheel.py", line 55, in make_in
      wb.build()
    File "/private/var/folders/c6/lnc_0m093ys8w16md_fm1mnxhtfnj8/T/pip-build-env-h881v55v/overlay/lib/python3.8/site-packages/poetry/masonry/builders/wheel.py", line 81, in build
      self._build(zip_file)
    File "/private/var/folders/c6/lnc_0m093ys8w16md_fm1mnxhtfnj8/T/pip-build-env-h881v55v/overlay/lib/python3.8/site-packages/poetry/masonry/builders/wheel.py", line 103, in _build
      self._env.run(
    File "/private/var/folders/c6/lnc_0m093ys8w16md_fm1mnxhtfnj8/T/pip-build-env-h881v55v/overlay/lib/python3.8/site-packages/poetry/utils/env.py", line 879, in run
      return self._run(cmd, **kwargs)
    File "/private/var/folders/c6/lnc_0m093ys8w16md_fm1mnxhtfnj8/T/pip-build-env-h881v55v/overlay/lib/python3.8/site-packages/poetry/utils/env.py", line 916, in _run
      raise EnvCommandError(e, input=input_)
  poetry.utils.env.EnvCommandError: Command ['python', 'setup.py', 'build', '-b', 'build'] errored with the following return code 1, and output:
  WARNING: The pip package is not available, falling back to EasyInstall for handling setup_requires/test_requires; this is deprecated and will be removed in a future version.
  WARNING: The pip package is not available, falling back to EasyInstall for handling setup_requires/test_requires; this is deprecated and will be removed in a future version.
  running build
  running build_py
  creating build
  creating build/lib.macosx-10.15-x86_64-3.8
  creating build/lib.macosx-10.15-x86_64-3.8/pqcrypto
  copying pqcrypto/__init__.py -> build/lib.macosx-10.15-x86_64-3.8/pqcrypto
  copying pqcrypto/common.py -> build/lib.macosx-10.15-x86_64-3.8/pqcrypto
  package init file 'pqcrypto/kem/__init__.py' not found (or not a regular file)
  creating build/lib.macosx-10.15-x86_64-3.8/pqcrypto/kem
  copying pqcrypto/kem/mceliece460896.py -> build/lib.macosx-10.15-x86_64-3.8/pqcrypto/kem
  copying pqcrypto/kem/frodokem1344aes.py -> build/lib.macosx-10.15-x86_64-3.8/pqcrypto/kem
  copying pqcrypto/kem/lightsaber.py -> build/lib.macosx-10.15-x86_64-3.8/pqcrypto/kem
  copying pqcrypto/kem/mceliece6960119f.py -> build/lib.macosx-10.15-x86_64-3.8/pqcrypto/kem
  copying pqcrypto/kem/mceliece8192128f.py -> build/lib.macosx-10.15-x86_64-3.8/pqcrypto/kem
  copying pqcrypto/kem/frodokem976shake.py -> build/lib.macosx-10.15-x86_64-3.8/pqcrypto/kem
. . . . .
  clang -Wno-unused-result -Wsign-compare -Wunreachable-code -fno-common -dynamic -DNDEBUG -g -fwrapv -O3 -Wall -pipe -Os -isysroot/Library/Developer/CommandLineTools/SDKs/MacOSX10.15.sdk -O3 -std=gnu17 -march=native -isysroot /Applications/Xcode.app/Contents/Developer/Platforms/MacOSX.platform/Developer/SDKs/MacOSX.sdk -Isources/common -I/opt/local/Library/Frameworks/Python.framework/Versions/3.8/include/python3.8 -c /private/var/folders/c6/lnc_0m093ys8w16md_fm1mnxhtfnj8/T/pip-install-1hzsrnnj/pqcrypto/sources/mceliece348864/vec/aes256ctr.c -o build/temp.macosx-10.15-x86_64-3.8/private/var/folders/c6/lnc_0m093ys8w16md_fm1mnxhtfnj8/T/pip-install-1hzsrnnj/pqcrypto/sources/mceliece348864/vec/aes256ctr.o -O3 -std=c99
  clang -Wno-unused-result -Wsign-compare -Wunreachable-code -fno-common -dynamic -DNDEBUG -g -fwrapv -O3 -Wall -pipe -Os -isysroot/Library/Developer/CommandLineTools/SDKs/MacOSX10.15.sdk -O3 -std=gnu17 -march=native -isysroot /Applications/Xcode.app/Contents/Developer/Platforms/MacOSX.platform/Developer/SDKs/MacOSX.sdk -Isources/common -I/opt/local/Library/Frameworks/Python.framework/Versions/3.8/include/python3.8 -c /private/var/folders/c6/lnc_0m093ys8w16md_fm1mnxhtfnj8/T/pip-install-1hzsrnnj/pqcrypto/sources/mceliece348864/vec/encrypt.c -o build/temp.macosx-10.15-x86_64-3.8/private/var/folders/c6/lnc_0m093ys8w16md_fm1mnxhtfnj8/T/pip-install-1hzsrnnj/pqcrypto/sources/mceliece348864/vec/encrypt.o -O3 -std=c99
  In file included from /private/var/folders/c6/lnc_0m093ys8w16md_fm1mnxhtfnj8/T/pip-install-1hzsrnnj/pqcrypto/sources/mceliece348864/vec/encrypt.c:9:
  In file included from sources/common/randombytes.h:8:
  /Applications/Xcode.app/Contents/Developer/Platforms/MacOSX.platform/Developer/SDKs/MacOSX.sdk/usr/include/unistd.h:546:7: error: conflicting types for 'encrypt'
  void     encrypt(char *, int) __DARWIN_ALIAS(encrypt);
           ^
  /private/var/folders/c6/lnc_0m093ys8w16md_fm1mnxhtfnj8/T/pip-install-1hzsrnnj/pqcrypto/sources/mceliece348864/vec/encrypt.h:8:6: note: previous declaration is here
  void encrypt(unsigned char * /*s*/, unsigned char * /*e*/, const unsigned char * /*pk*/);
       ^
  1 error generated.
  error: command 'clang' failed with exit status 1
  
  ----------------------------------------
  ERROR: Failed building wheel for pqcrypto
Failed to build pqcrypto
ERROR: Could not build wheels for pqcrypto which use PEP 517 and cannot be installed directly

This fix to the source code allows it to compile:

diff --git a/sources/common/randombytes.h b/sources/common/randombytes.h
index 37353cc..1a2a52f 100644
--- a/sources/common/randombytes.h
+++ b/sources/common/randombytes.h
@@ -5,7 +5,12 @@
 #ifdef _WIN32
 #include <CRTDEFS.H>
 #else
+#ifdef __APPLE__
+#include <stdlib.h>
+#include <stddef.h>
+#else /* __APPLE__ */
 #include <unistd.h>
+#endif /* __APPLE__ */
 #endif
 
 int randombytes(uint8_t *buf, size_t n);

Unfortunately, your README does not tell how to build/install from the local source tree, and until you apply and push the above fix - it won't even compile on Mac.

Thanks for bringing this up; could you confirm that it builds succesfully now? I have updated the README as requested.

Thank you! I confirm that the current pqcrypto builds and installs from PyPI fine.

One more thing: for those proficient with Poetry, it's obvious that poetry build places the "wheel" in the dist/ subdirectory. Those who never touched that tool though - like myself - are stymied.

May I suggest one more enhancement for the README, something like:

    # Using poetry
    pip install poetry
    poetry build
    pip install dist/*.whl

and/or a few words about what poetry build produces, and how to actually get the resulting wheel installed and usable outside of the poetry environment.

Thanks!