I have an app that uses a C (Cython) extension that needs to link against
the OpenGL libs (libGL and libGLU)
Here's the code that used to work:
gl_libraries = ["GL", "GLU"]
...
gl_include_dirs.append(
"/System/Library/Frameworks/OpenGL.framework/Headers",
)
gl_library_dirs.append("/System/Library/Frameworks/OpenGL.framework/Libraries",
)
And this resulted in this linking line that fails:
clang -bundle -undefined dynamic_lookup
-Wl,-rpath,/Users/chris.barker/miniconda3/envs/maproom39/lib
-L/Users/chris.barker/miniconda3/envs/maproom39/lib
-Wl,-rpath,/Users/chris.barker/miniconda3/envs/maproom39/lib
-L/Users/chris.barker/miniconda3/envs/maproom39/lib
build/temp.macosx-10.9-x86_64-3.9/libmaproom/Tessellator.o
-L/System/Library/Frameworks/OpenGL.framework/Libraries -lGL -lGLU -o
build/lib.macosx-10.9-x86_64-3.9/libmaproom/Tessellator.cpython-39-darwin.so
ld: library not found for -lGL
clang: error: linker command failed with exit code 1 (use -v to see
invocation)
error: command '/usr/bin/clang' failed with exit code 1
Some of this makes sense -- as
System/Library/Frameworks/OpenGL.framework doesn't
have Libraries and Headers anymore. However, it also doesn't have the
headers or libraries (that I can tell) anywhere else in there.
Oddly, the compiler is finding the headers somewhere -- not sure where.
Google has failed me here -- but a few hints:
1) ctypes had to be updated to find the libs -- that was done, and ctypes
seems to be working. but what it does is:
In [1]: from ctypes.util import find_library
In [2]: find_library("OpenGL")
Out[2]: '/System/Library/Frameworks/OpenGL.framework/OpenGL'
but /System/Library/Frameworks/OpenGL.framework/OpenGL doesn't exist on my
system at all.
Reading a bit -- it seems that OS-X is doing some kind of cached libs
trickery -- but how do I tell distutils / clang how to find those libs??
Enclosed is the whole setup.py in case I've missed a detail.
Sometimes Apple Drives me crazy! Thanks for any hints --
-CHB
--
Christopher Barker, Ph.D.
Oceanographer
Emergency Response Division
NOAA/NOS/OR&R (206) 526-6959 voice
7600 Sand Point Way NE (206) 526-6329 fax
Seattle, WA 98115 (206) 526-6317 main reception
[email protected]
#!/usr/bin/env python
"""
setup.py for libmaproom to build python extensions
right now - it mostly is to be used as follows:
python setup.py build_ext --inplace
"""
import sys
from Cython.Distutils import build_ext
from setuptools import setup, Extension
from ctypes.util import find_library
version_path = "../maproom/_version.py"
exec(compile(open(version_path).read(), version_path, 'exec'))
# find the various headers, libs, etc.
import numpy
gl_include_dirs = [numpy.get_include()]
gl_library_dirs = []
gl_libraries = ["GL", "GLU"]
if sys.platform.startswith("win"):
gl_libraries = ["opengl32", "glu32"]
elif sys.platform == "darwin":
gl_include_dirs.append(
"/System/Library/Frameworks/OpenGL.framework/Headers",
)
gl_library_dirs.append(
#find_library("OpenGL"),
"/System/Library/Frameworks/OpenGL.framework/Libraries",
)
# Definition of compiled extension code:
bitmap = Extension("libmaproom.Bitmap",
sources=["libmaproom/Bitmap.pyx"],
include_dirs=[numpy.get_include()],
extra_compile_args = ["-O3" ],
)
shape = Extension("libmaproom.Shape",
sources=["libmaproom/Shape.pyx"],
include_dirs=[numpy.get_include()],
extra_compile_args = ["-O3" ],
)
tessellator = Extension("libmaproom.Tessellator",
sources=["libmaproom/Tessellator.pyx"],
include_dirs=gl_include_dirs,
library_dirs=gl_library_dirs,
libraries=gl_libraries,
extra_compile_args = ["-O3" ],
)
render = Extension("libmaproom.Render",
sources=["libmaproom/Render.pyx"],
include_dirs=gl_include_dirs,
library_dirs=gl_library_dirs,
libraries=gl_libraries,
extra_compile_args = ["-O3" ],
)
# pytriangle extension
DEFINES = [("TRILIBRARY", None), # this builds Triangle as a lib, rather than as a command line program.
("NO_TIMER", None), # don't need the timer code (*nix specific anyway)
("REDUCED", None),
]
# Add the defines for disabling the FPU extended precision ]
## fixme: this needs a lot of work!
## it's really compiler dependent, not machine dependent
if sys.platform == 'darwin':
print("adding no CPU flags for mac")
## according to:
## http://www.christian-seiler.de/projekte/fpmath/
## nothing special is required on OS-X !
##
## """
## the precision is always determined by the largest operhand type in C.
##
## Because of this, Mac OS X does not provide any C wrapper macros to
## change the internal precision setting of the x87 FPU. It is simply
## not necessary. Should this really be wanted, inline assembler would
## probably be possible, I haven't tested this, however.
## Simply use the correct datatype and the operations performed will have the
## correct semantics
## """
elif sys.platform == 'win32':
print("adding define for Windows for FPU management")
DEFINES.append(('CPU86', None))
elif 'linux' in sys.platform :# something for linux here...
print("adding CPU flags for Intel Linux")
DEFINES.append(('LINUX', None))
else:
raise RuntimeError("this system isn't supported for building yet")
pytriangle = Extension(
"libmaproom.pytriangle",
sources = [ "libmaproom/pytriangle-1.6.1/src/pytriangle.pyx",
"libmaproom/pytriangle-1.6.1/triangle/triangle.c" ],
include_dirs = [ numpy.get_include(),
"libmaproom/pytriangle-1.6.1/triangle",
],
define_macros = DEFINES,
)
# Extension module is named libmaproom.contour rather than libmaproom.py_contour
# because imports get confused with the py_contour source directory within the libmaproom
# directory (error message "dynamic module doesn't define module export function"), but
# moving the py_contour directory outside of the libmaproom directory doesn't seem to help.
py_contour = Extension(
"libmaproom.contour",
sources = [
"libmaproom/py_contour/py_contour/contour.pyx",
"libmaproom/py_contour/py_contour/conrec.cxx",
],
include_dirs = [
numpy.get_include(),
],
)
ext_modules = [bitmap, shape, tessellator, render, pytriangle, py_contour]
#ext_modules = [tessellator]
data_files = []
options = {}
package_data = {}
install_requires = [
'numpy',
'pyopengl',
'cython',
]
setup(
name="libmaproom",
version=__version__,
description="Compiled support libraries for MapRoom",
author="NOAA",
install_requires=install_requires,
setup_requires=[
'packaging',
],
data_files=data_files,
packages=['libmaproom'],
package_data=package_data,
ext_modules=ext_modules,
options=options,
zip_safe = False,
)
_______________________________________________
Pythonmac-SIG maillist - [email protected]
https://mail.python.org/mailman/listinfo/pythonmac-sig
unsubscribe: https://mail.python.org/mailman/options/Pythonmac-SIG