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

Meson build system proof-of-concept #8137

Draft
wants to merge 14 commits into
base: master
Choose a base branch
from
Draft

Conversation

AdelKS
Copy link

@AdelKS AdelKS commented Sep 28, 2024

Hey,

I am well aware of #7524 but thought that maybe you'd like to see alternative build systems, in this case meson

Why a build system

Having a proper build system has the following advantages:

  • Makes openFrameworks packageable by distros
  • Makes life easier for its users

Potential disadvantages:

  • Build system lock-in
  • Users and devs need to learn the chosen build system

As I understand it, openFrameworks did in the end develop its homemade build system components (projectGenerator and Apothecary ?) and a way to embed Add-ons, either in-tree or out of tree. So it looks like a "build lock-in" always happens when a project grows big enough.

Why meson

Unfortunately I have no experience whatsoever with cmake so I cannot say anything out of my own experience, except that I decided to learn meson instead because it's way more readable and python-like. Otherwise:

How to define a meson project

The usual process of making meson projects: fill the meson.build file at the root of the project.

  • Define the project, its language, version and default meson built-in build options
    project('openFrameworks', 'cpp',
    version : '0.12.0',
    default_options : [
      'cpp_std=c++20',
      'buildtype=release',
      'optimization=3',
      'default_library=shared',
      # 'prefer_static=true',
      'b_ndebug=if-release',
      'c_args=-pipe',
      'cpp_args=-pipe',
      # 'warning_level=3' # highly recommended
      # 'werror=true' # highly recommended
    ]
    )
    ``
  • Make an array of the files to compile
    • sources = files(...)
  • Define the folders that contain the headers of the project so it can be properly compiled
  • Make an array of the headers that are meant to be installed on the system
    • Not useful for building but useful for packaging, so headers end up in /usr/include/openFrameworks/../foo.h when installed using meson install within a build folder
  • Make array of project dependencies
    • using dependency()
    • deps = [ dependency('foo'), dependency('bar), ...]
  • Define the library (when there is one)
    • using library()
      lib = library('openFrameworks',
      sources,
      include_directories: inc,
      dependencies: deps,
  • Handle how this project can be found and used by downstream projects
    • When installed on the system: can generate a pkgconfig file using the pkgconfig module
      pkg = import('pkgconfig')
      pkg.generate(lib)
    • When pulled directly as meson subproject through wraps
      openframeworks_dep = declare_dependency(link_with: lib, include_directories: inc, dependencies: deps)
      meson.override_dependency('openFrameworks', openframeworks_dep)

How to compile a meson project

# Create build folder within the source folder
meson setup build -D optionA=something -D optionB=somethingelse
# Go in the folder and compile
cd build && meson compile

This PR: proof-of-concept on the usage of meson build system

This PR, on top of adding initial meson build system support to openFrameworks, comes with a mesonified fork of a downstream "user" project to demo how it can be used. The project I chose is interactive-physarum from @Bleuje.

Using a Linux distro with all the required openFrameworks dependencies installed, except libtess2 and kissfft, meson will complain if some are missing. You can clone, pull some deps, compile and run the app without having openframeworks installed nor downloaded anywhere in the system

git clone https://github.com/AdelKS/interactive-physarum.git --depth=1
cd interactive-physarum
meson setup build
cd build
meson compile
meson test # used here to run the app (just so it can properly find the files it wants to load)

The above

  • Uses an out-of-tree add-on ofxGamepad
    • I forked it and mesonified it
      • This showcases how openFrameworks can potentially handle (out-of-tree) Add-ons
  • Can be entirely compiled even if openFrameworks hasn't been installed on the distro machine.
    • Most of the dependencies currently are expected out of the host distro.
      • Except libtess2 and kissfft which have been "meson wrapped" as subprojects
        • It demonstrates how external dependencies could be handled by meson to enable users to just compile the project they want without relying on their distro packaging its dependencies.
          • Requires such projects to be using either cmake or meson.
          • Otherwise one needs to write a meson.build for such projects
            • The community already did with many projects
            • In the case of libtess2 it wasn't the case, and I wrote the meson.build file for it myself (it's in subprojects/projectfiles/libtess2/meson.build)

Limitations of this POC PR

  • I've only tested this project and only on Linux (on Gentoo and Archlinux).
  • The meson.build code is far from being final
    • Needs to be tested on all supported platforms
    • #defines and conditionally compiling some of the sources given the target needs to be done

@AdelKS AdelKS marked this pull request as draft September 28, 2024 16:27
@artificiel
Copy link
Contributor

interesting! NB: zero experience with meson here

  1. are Makefile, addons.make and config.make "generated" and required? if not perhaps remove them from the repository to make it as clean as possible;

  2. is the meson-ificiation (as you put it) of addons something that might be automatable? CMake faces the same problem; 1000+ public addons and countless private ones have an addon_config.mk (potentionally platform-tailored) and won't suddenly sport fresh config files. can meson take the list in addons.make check for presence in $OF_ROOT/addons, and produce things as needed by meson? perhaps it's a role for Project Generator, which could generate a meson.build, but it would be nice to be able to add/reload thing without resetting everything (a bit like QTCreator allows with .qbs, which gets re-parsed on save, including scanning dependencies). i understand the general idea of avoiding build-locking, but even for complex projects, i haven't been unable to re-generate build files on different platforms. in essence i view the build/IDE files as ephemeral/transitionary, and rely on src+addons.make to provide me Makefiles or .xcodeproj or whatever.

  3. the test did not work — ended like this (M1, macOS14.5):

openFrameworks| Project name: openFrameworks
openFrameworks| Project version: 0.12.0
openFrameworks| C++ compiler for the host machine: c++ (clang 15.0.0 "Apple clang version 15.0.0 (clang-1500.3.9.4)")
openFrameworks| C++ linker for the host machine: c++ ld64 1053.12
openFrameworks| Run-time dependency assimp found: YES 5.4.3
openFrameworks| Run-time dependency Boost found: YES 1.86.0 (/opt/homebrew)
openFrameworks| Run-time dependency cairo found: YES 1.18.2
openFrameworks| Run-time dependency egl found: NO (tried pkgconfig, framework and cmake)

subprojects/openFrameworks/meson.build:227:2: ERROR: Dependency "egl" not found, tried pkgconfig, framework and cmake

A full log can be found at /Users/****/Downloads/test/interactive-physarum/build/meson-logs/meson-log.txt

@artificiel
Copy link
Contributor

NB: tried running PG over you test repo and a copy of your ofxGamePad fork and got here:
image
so yes, from a meson point of view you don't need to include the OIS source, but current ofxAddon ecosystem won't find it.

(and yes, the point of something like meson is to not rely on ofxAddon — write a meson.build and get the dependency! but just to be sure nothing here is to be construed as negative — it is very important to explore/discuss build systems and what facilitates usage; i'm really looking at it with the question of "how could OF transparently migrate" while maintaining a core principle which is "garanteed results on the supported platforms in harsh conditions" (think workshop with disparate machines or admin restrictions), where as long as you have a C++17 toolchain, you can download an OF.gzip in a writable directory and get compiling (NB: on linux you might have to get distro-sanctionned packages, which presumes sudo-rights)).

thinking a bit more about PG's role: meson-ification in addons' cases currently means: having a local copy of an addon, start with addon_config.mk and from there gathering source and accumulating flags and libs, perhaps platform-conditional. the problem is the same with all build tools. so i guess a question is: what is the ideal "addon descriptor" (really: a package description) that could translate to different build systems? ideally we'd support CMake, meson, etc, but don't expect addon writers to know about them all — so perhaps think of a kind of universal addon description (what addon_config.mk ends up being, even for non-Make projects such as Xcode).

@AdelKS
Copy link
Author

AdelKS commented Oct 2, 2024

Hey, Thanks for your feedback !

are Makefile, addons.make and config.make "generated" and required? if not perhaps remove them from the repository to make it as clean as possible;

No they are not needed, it's like cmake: it generates a "build folder tree" that ninja understands. I will remove them to showcase that they are not needed anymore as you suggested.

is the meson-ificiation (as you put it) of addons something that might be automatable?

There's nothing magical with meson, this probably applies to any build system, so perhaps this is the "universal addon description" you mention: it needs to know where to look for headers (include folders), what sources to compile (a full list of individual files, not a folder), and what dependencies are needed. Of course there's more to a build system..

So now, if I go back to the meson alternative:
1- If we consider a future where meson is used, then a meson.build template could definitely be offered for add-on makers to simply fill up with that information.
2- So, for the purpose of automatically generating meson files to ease transition from addon_config.mk. I went to have a look in the addons folder, and they all look like they have their sources in an src folder that happens to also be the include folder. So I can imagine one could write a script to take the template and fill up the sources array and the project's name in it, and everything else should look similar (like this meson file)

the test did not work — ended like this (M1, macOS14.5):

Can you tell me what headers in the libs/openFrameworks folder don't apply to Mac ? So I can update the meson.build file to have platform conditional dependencies and headers. I actually have never used openFrameworks before to understand it deeply. Because basically the issue here with your platform is that meson is trying to find linux specific dependencies.

"garanteed results on the supported platforms in harsh conditions" (think workshop with disparate machines or admin restrictions

Meson is really fitting in these situations with the approach with subprojects and wraps: where the needed dependencies can simply be downloaded automatically by meson instead of relying on what the distro provides. When you run this snippet

git clone https://github.com/AdelKS/interactive-physarum.git --depth=1
cd interactive-physarum
meson setup build

you will see that subprojects get automatically and recursively pulled by meson: openFrameworks, kissfft, libtess2 . The projects that can be downloaded automatically by meson are listed here (called wrapdb), and allegedly every mesonified ofx addon. Basically any project that uses either meson or cmake can be pulled directly and built from source, where to pull it from is described in a .wrap file in the subprojects folder. But many projects do not use meson nor cmake, and if your code depends on them, you will need to install them through other means or write a meson.build file for them to "mesonify" them. The later is what the wrapdb actually is: community maintained meson.build files for different projects.

So in your case for example let's say OIS is not available with "homebrew", I will add a .wrap file in the ofxGamepad repo to describe how to use it when the dependency isn't available in the host, since it uses cmake it will just work ™️

@artificiel
Copy link
Contributor

2- So, for the purpose of automatically generating meson files to ease transition from addon_config.mk. I went to have a look in the addons folder, and they all look like they have their sources in an src folder that happens to also be the include folder. So I can imagine one could write a script to take the template and fill up the sources array and the project's name in it, and everything else should look similar

indeed source (.h/.cpp) in src is the common starting point, but addon_config.mk can provide much more info — see this as an example — but basically it configure flags, can include libs, and other features — see the howto and how that all ties into ofxaddons.com

Can you tell me what headers in the libs/openFrameworks folder don't apply to Mac ?

hmm i am not an apothecary expert so i'm not sure how to guide you correctly there (probably look into what kind of insight is implemented in apothecary around the platform?). as a reference here are the macOS "builtin" libraries that are shipped from apothecary (either provided in the bin releases, or via the script download_libs), so they can perhaps be considered "always required"?

FreeImage	curl		freetype	json		openssl		tess2
boost		glew		libpng		pixman		uriparser
brotli		fmod		glfw		pugixml		utf8
cairo		fmt		glm		rtAudio		zlib

(because another design point is not to rely on homebrew on macOS, which is something that can be re-discussed, but again it's thinking about hostile workshop environments where you have 30 minutes to setup 16 machines for people unfamiliar with the command line. on linux it's more lax and download_libs.sh will call the native package manager to install missing OS-level dependencies, but that's not a panacea sometimes version problems occur, especially on rolling releases like Arch).

But we can distinguish 2 distinct clusters of issues — the platform-specific treatment of providing libraries (which can get hairy when dealing with iOS or rPI), and the method of packaging/discovering/acquiring 3rd-party functionalities as supported by the ofxaddon ecosystem and Project Generator (which also solves producing projects files for a bunch of IDEs).

NB: for sure, a problem addon_config does not solve is resolving it's own dependencies — let's say a want to wrap something complex like libpqxx (the postgresql c++ interface): as an addon author i inherit the problem of delivering the library — source? (easy for header-only; but often more complex if flags are needed)... so precompiled libs per platform? (have to do it! for 10-12 different platforms!) so, then... instructions to install separately? depending on the task, it can get complicated quickly. so addon's self-dependencies would obviously gain from any build tool support. but it's another layer down the onion...

@AdelKS AdelKS force-pushed the meson branch 2 times, most recently from f321fbd to 12b06a5 Compare October 3, 2024 22:40
@AdelKS
Copy link
Author

AdelKS commented Oct 3, 2024

Somehow I could build without these

brotli
fmod
fmt
pixman
zlib

Some changes:

  • added many dependencies that wrapdb already offered in this commit
  • restricted some linux specific things
  • added OIS wrap to ofxGamepad

Don't think it will make my example compile for you, but it should go a little bit further. That's how I believe we can handle everything using meson.

@artificiel
Copy link
Contributor

(the packages you mention not needing are not used by "empty" projects but will be needed on a case-by-case (for instance fmod for audio stuff).

but getting further!

| Call Stack (most recent call first):
| /opt/homebrew/Cellar/cmake/3.30.3/share/cmake/Modules/FindPkgConfig.cmake:873 (_pkg_check_modules_internal)
| test/CMakeLists.txt:32 (pkg_check_modules)

| -- Configuring incomplete, errors occurred!

kissfft| CMake configuration: FAILED

subprojects/openFrameworks/meson.build:226:2: ERROR: Failed to configure the CMake subproject: The following required packages were not found:
 - fftw3

for fun, did brew install fftw then got further (although i guess meson should find fftw by itself?)

openFrameworks| Run-time dependency libudev found: NO (tried pkgconfig, framework and cmake)

subprojects/openFrameworks/meson.build:231:2: ERROR: Dependency "libudev" not found, tried pkgconfig, framework and cmake

libudev does not seem provided by brew.

@AdelKS
Copy link
Author

AdelKS commented Oct 4, 2024

the packages you mention not needing are not used by "empty" projects but will be needed on a case-by-case (for instance fmod for audio stuff

I probably did not make it clear, but for now I am focusing on making the "core" library be compilable, i.e. the source files in the libs folder. There are many projects in the "addons" folder that one would need to tackle to achieve a full transition of this repository.

subprojects/openFrameworks/meson.build:226:2: ERROR: Failed to configure the CMake subproject: The following required packages were not found:

  • fftw3

As you can see here, it's a cmake subproject, kissfft, downloaded by meson using the subprojects/kissfft.wrap, that cannot find its fftw3 dependency. I was wondering why it needs FFTW and it turns out that its CMakeLists.txt has tests enabled by default: the tests compares the results with FFTW, so it needs to pull FFTW. So I had to do this change to disable tests and therefore no pull FFTW.

Let's see where the next blocker is.

@artificiel
Copy link
Contributor

ok, still stuck at libudev:

openFrameworks| Run-time dependency libudev found: NO (tried pkgconfig, framework and cmake)

subprojects/openFrameworks/meson.build:231:2: ERROR: Dependency "libudev" not found, tried pkgconfig, framework and cmake

i don't think that makes sense on macOS anyhow? (i'm not sure how to find what triggers the libudev dependency?)

@ofTheo
Copy link
Member

ofTheo commented Oct 5, 2024 via email

@AdelKS
Copy link
Author

AdelKS commented Oct 5, 2024

ok, still stuck at libudev

I moved the dependency('libudev') in line 231 to the Linux specific if block here 11c71a3 (please have a look, meson.build files are very understandable).

You probably didn't get my latest changes, In your downstream local clone of interactive-physarum you should do a git clean -ffdx before doing meson setup build so it will pull again the dependencies at their latest commit.
There's also the command meson subprojects update --reset but sometimes it gets confused by force pushes or big changes in the dependencies.

Was trying out Conan and vcpkg today.

Would love to hear your feedback on them, never tried those either.

@artificiel
Copy link
Contributor

artificiel commented Oct 5, 2024

you should do a git clean -ffdx

got it! next up:

subprojects/openFrameworks/meson.build:236:11: ERROR: C++ header 'FreeImage.h' not found

note that (as far as i know, perhaps that changed recently) OF uses a customized FreeImage fork: https://github.com/danoli3/FreeImage

@AdelKS
Copy link
Author

AdelKS commented Oct 5, 2024

note that (as far as i know, perhaps that changed recently) OF uses a customized FreeImage fork: https://github.com/danoli3/FreeImage

Thanks! I couldn't put it in a wrap before because the original project doesn't use cmake, but this fork does. Had to do some workarounds to use but it should work.

Next issue please 🗡️

AdelKS added 6 commits October 5, 2024 22:37
A wrap file basically tells meson how to download a subproject and what
dependency it fullfills. So when we do dependency('foo') in meson.build
and foo is not available in the host system, it will automatically download
it and configure it so it uses as a "subproject"

More information here https://mesonbuild.com/Wrap-dependency-system-manual.html
e.g. Archlinux doesn't bundle it
Ubuntu / Debian have it called 'glut'
installed using the command
meson wrap install <lib-name>
@artificiel
Copy link
Contributor

| -- Configuring incomplete, errors occurred!
uriparser| CMake configuration: FAILED
subprojects/openFrameworks/meson.build:277:24: ERROR: Failed to configure the CMake subproject: Could NOT find GTest (missing: GTEST_LIBRARY GTEST_INCLUDE_DIR GTEST_MAIN_LIBRARY) (Required is at least version "1.8.0")

AdelKS added 5 commits October 5, 2024 23:10
Quite a few more lines added to handle disabling a cmake define
Unfortunately Meson doesn't offer an easy way to do something like this
dependency('uriparser', default_options: {'URIPARSER_BUILD_DOCS': false})
where the second argument is automatically given to cmake
Just like 'uriparser' we need to disable an option in the cmake
subproject to not pull extra dependencies
Not useful for the core library, but will be useful for ofxAssimp
@artificiel
Copy link
Contributor

@ofTheo a feature of Conan (that as far as i understand vcpkg does not support) is:

Conan supports pushing the libraries and binaries you build to an upstream. For this reason, if someone with the same profile settings as you pushes their prebuild libraries to the upstream (Conan centre, for example), Conan will simply download the prebuilt libraries instead of building from the source code.

which means the equivalent of the apothecary could be published as conan packages, and prebuilt as needed. officially supported platforms could be provided and pinned-to with version numbers, andthey would be assembled for "static" distribution on supported platforms, gathering the libs from conan and tarballing them for the equivalent of the current binary "semver" releases.

hosting a conan upstream is also possible, perhaps a way to envision addons as conan packages. one thing for sure though: a critical aspect is to think how addons themselves can resolve dependencies, to solve the lib-wrapper addon author problem of "should i provide source, or bin-per-platform, or git submodules, or a shell script, or README instructions to install manually". CMake seems to be establishing itself as a kind of universal dependency format (what i was mentionning above as a "generic" addon description file).

if Project Manager can read in addon_config.mk and spit out the corresponding CMakeLists.txt (perhaps localized to the PG user's platform, or in a generic platform-switched manner) it would pave the way to a transition. old addons would be supported via PG, and fresh addons would also sport a CMakeLists and be useable without PG.

@AdelKS
Copy link
Author

AdelKS commented Oct 5, 2024

Fixed. Next !

You can add me in Discord as adelks if you want to handle this quicker.

@artificiel
Copy link
Contributor

OK meson setup is done!

but now meson compile errors... related to NSString / std::string confusion, so probably .mm or some other apple thing (the message "swift unavailable" shows up). this is what comes out after a re-do of 'meson compile', to isolate the problem:

INFO: autodetecting backend as ninja
INFO: calculating backend command to run: /opt/homebrew/bin/ninja
[4/127] Compiling C++ object subprojects/openFrameworks/libopenFrameworks.dylib.p/libs_openFrameworks_app_ofAppGLFWWindow.cpp.o
FAILED: subprojects/openFrameworks/libopenFrameworks.dylib.p/libs_openFrameworks_app_ofAppGLFWWindow.cpp.o 
c++ -Isubprojects/openFrameworks/libopenFrameworks.dylib.p -Isubprojects/openFrameworks -I../subprojects/openFrameworks -I../subprojects/openFrameworks/libs/openFrameworks/3d -I../subprojects/openFrameworks/libs/openFrameworks/app -I../subprojects/openFrameworks/libs/openFrameworks/communication -I../subprojects/openFrameworks/libs/openFrameworks/events -I../subprojects/openFrameworks/libs/openFrameworks/gl -I../subprojects/openFrameworks/libs/openFrameworks/graphics -I../subprojects/openFrameworks/libs/openFrameworks/math -I../subprojects/openFrameworks/libs/openFrameworks/sound -I../subprojects/openFrameworks/libs/openFrameworks/types -I../subprojects/openFrameworks/libs/openFrameworks/utils -I../subprojects/openFrameworks/libs/openFrameworks/video -I../subprojects/openFrameworks/libs/openFrameworks -I../subprojects/libtess2/Include -Isubprojects/rtaudio-6.0.1 -I../subprojects/rtaudio-6.0.1 -I../subprojects/uriparser/include -Isubprojects/uriparser/__CMake_build -I../subprojects/uriparser/__CMake_build -Isubprojects/uriparser -I../subprojects/uriparser -Isubprojects/kissfft -I../subprojects/kissfft -Isubprojects/kissfft/__CMake_build -I../subprojects/kissfft/__CMake_build -I../subprojects/freeimage/Source/LibPNG -I../subprojects/freeimage/Source/ZLib -I../subprojects/freeimage/Source/LibWebP -I../subprojects/freeimage/Source/OpenEXR/Half -I../subprojects/freeimage/Source -I../subprojects/freeimage/Source/Metadata -I../subprojects/freeimage/Source/FreeImageToolkit -I../subprojects/freeimage/Source/LibJPEG -I../subprojects/freeimage/Source/LibTIFF4 -I../subprojects/freeimage/Source/LibOpenJPEG -Isubprojects/freeimage/__CMake_build -I../subprojects/freeimage/__CMake_build -Isubprojects/freeimage -I../subprojects/freeimage -I/opt/homebrew/include -I/opt/homebrew/Cellar/cairo/1.18.2/include/cairo -I/opt/homebrew/Cellar/fontconfig/2.15.0/include -I/opt/homebrew/opt/freetype/include/freetype2 -I/opt/homebrew/opt/libpng/include/libpng16 -I/opt/homebrew/Cellar/libxext/1.3.6/include -I/opt/homebrew/Cellar/libxrender/0.9.11/include -I/opt/homebrew/Cellar/libx11/1.8.10/include -I/opt/homebrew/Cellar/libxcb/1.17.0/include -I/opt/homebrew/Cellar/libxau/1.0.11/include -I/opt/homebrew/Cellar/libxdmcp/1.1.5/include -I/opt/homebrew/Cellar/pixman/0.42.2/include/pixman-1 -I/opt/homebrew/Cellar/xorgproto/2024.1/include -I/opt/homebrew/Cellar/glew/2.2.0_1/include -I/opt/homebrew/Cellar/glfw/3.4/include -I/opt/homebrew/Cellar/glm/1.0.1/include -I/opt/homebrew/Cellar/openssl@3/3.3.2/include -I/opt/homebrew/Cellar/mpg123/1.32.7/include -I/opt/homebrew/Cellar/nlohmann-json/3.11.3/include -I/opt/homebrew/Cellar/pugixml/1.14/include -I/opt/homebrew/Cellar/libsndfile/1.2.2/include -I/opt/homebrew/Cellar/flac/1.4.3/include -I/opt/homebrew/Cellar/libvorbis/1.3.7/include -I/opt/homebrew/Cellar/libogg/1.3.5/include -I/opt/homebrew/Cellar/opus/1.5.2/include/opus -I/opt/homebrew/include/utf8cpp -fdiagnostics-color=always -DNDEBUG -Wall -Winvalid-pch -std=c++20 -O3 -pipe -DDISABLE_PERF_MEASUREMENT -DOPJ_STATIC -DNO_LCMS -DNO_WINDOWS -Dkiss_fft_scalar=float -DKISS_FFT_SHARED -F/Applications/Xcode.app/Contents/Developer/Platforms/MacOSX.platform/Developer/SDKs/MacOSX.sdk/System/Library/Frameworks/OpenAL.framework -idirafter/Applications/Xcode.app/Contents/Developer/Platforms/MacOSX.platform/Developer/SDKs/MacOSX.sdk/System/Library/Frameworks/OpenAL.framework/Headers -F/Applications/Xcode.app/Contents/Developer/Platforms/MacOSX.platform/Developer/SDKs/MacOSX.sdk/System/Library/Frameworks/GLUT.framework -idirafter/Applications/Xcode.app/Contents/Developer/Platforms/MacOSX.platform/Developer/SDKs/MacOSX.sdk/System/Library/Frameworks/GLUT.framework/Headers -DBOOST_ALL_NO_LIB -MD -MQ subprojects/openFrameworks/libopenFrameworks.dylib.p/libs_openFrameworks_app_ofAppGLFWWindow.cpp.o -MF subprojects/openFrameworks/libopenFrameworks.dylib.p/libs_openFrameworks_app_ofAppGLFWWindow.cpp.o.d -o subprojects/openFrameworks/libopenFrameworks.dylib.p/libs_openFrameworks_app_ofAppGLFWWindow.cpp.o -c ../subprojects/openFrameworks/libs/openFrameworks/app/ofAppGLFWWindow.cpp
In file included from ../subprojects/openFrameworks/libs/openFrameworks/app/ofAppGLFWWindow.cpp:26:
In file included from /Applications/Xcode.app/Contents/Developer/Platforms/MacOSX.platform/Developer/SDKs/MacOSX.sdk/System/Library/Frameworks/Cocoa.framework/Headers/Cocoa.h:12:
In file included from /Applications/Xcode.app/Contents/Developer/Platforms/MacOSX.platform/Developer/SDKs/MacOSX.sdk/System/Library/Frameworks/Foundation.framework/Headers/Foundation.h:9:
/Applications/Xcode.app/Contents/Developer/Platforms/MacOSX.platform/Developer/SDKs/MacOSX.sdk/System/Library/Frameworks/Foundation.framework/Headers/NSObjCRuntime.h:601:1: error: expected unqualified-id
@class NSString, Protocol;
^
/Applications/Xcode.app/Contents/Developer/Platforms/MacOSX.platform/Developer/SDKs/MacOSX.sdk/System/Library/Frameworks/Foundation.framework/Headers/NSObjCRuntime.h:603:9: error: unknown type name 'NSString'
typedef NSString * NSExceptionName NS_TYPED_EXTENSIBLE_ENUM;
        ^
/Applications/Xcode.app/Contents/Developer/Platforms/MacOSX.platform/Developer/SDKs/MacOSX.sdk/System/Library/Frameworks/Foundation.framework/Headers/NSObjCRuntime.h:604:9: error: unknown type name 'NSString'
typedef NSString * NSRunLoopMode NS_TYPED_EXTENSIBLE_ENUM;
        ^
/Applications/Xcode.app/Contents/Developer/Platforms/MacOSX.platform/Developer/SDKs/MacOSX.sdk/System/Library/Frameworks/Foundation.framework/Headers/NSObjCRuntime.h:606:19: error: unknown type name 'NSString'
FOUNDATION_EXPORT NSString *NSStringFromSelector(SEL aSelector);
                  ^
/Applications/Xcode.app/Contents/Developer/Platforms/MacOSX.platform/Developer/SDKs/MacOSX.sdk/System/Library/Frameworks/Foundation.framework/Headers/NSObjCRuntime.h:607:44: error: unknown type name 'NSString'
FOUNDATION_EXPORT SEL NSSelectorFromString(NSString *aSelectorName);
                                           ^
/Applications/Xcode.app/Contents/Developer/Platforms/MacOSX.platform/Developer/SDKs/MacOSX.sdk/System/Library/Frameworks/Foundation.framework/Headers/NSObjCRuntime.h:609:19: error: unknown type name 'NSString'
FOUNDATION_EXPORT NSString *NSStringFromClass(Class aClass);
                  ^
/Applications/Xcode.app/Contents/Developer/Platforms/MacOSX.platform/Developer/SDKs/MacOSX.sdk/System/Library/Frameworks/Foundation.framework/Headers/NSObjCRuntime.h:610:53: error: unknown type name 'NSString'
FOUNDATION_EXPORT Class _Nullable NSClassFromString(NSString *aClassName);
                                                    ^
/Applications/Xcode.app/Contents/Developer/Platforms/MacOSX.platform/Developer/SDKs/MacOSX.sdk/System/Library/Frameworks/Foundation.framework/Headers/NSObjCRuntime.h:612:19: error: unknown type name 'NSString'
FOUNDATION_EXPORT NSString *NSStringFromProtocol(Protocol *proto) API_AVAILABLE(macos(10.5), ios(2.0), watchos(2.0), tvos(9.0));
                  ^
/Applications/Xcode.app/Contents/Developer/Platforms/MacOSX.platform/Developer/SDKs/MacOSX.sdk/System/Library/Frameworks/Foundation.framework/Headers/NSObjCRuntime.h:612:50: error: unknown type name 'Protocol'
FOUNDATION_EXPORT NSString *NSStringFromProtocol(Protocol *proto) API_AVAILABLE(macos(10.5), ios(2.0), watchos(2.0), tvos(9.0));
                                                 ^
/Applications/Xcode.app/Contents/Developer/Platforms/MacOSX.platform/Developer/SDKs/MacOSX.sdk/System/Library/Frameworks/Foundation.framework/Headers/NSObjCRuntime.h:613:19: error: unknown type name 'Protocol'
FOUNDATION_EXPORT Protocol * _Nullable NSProtocolFromString(NSString *namestr) API_AVAILABLE(macos(10.5), ios(2.0), watchos(2.0), tvos(9.0));
                  ^
/Applications/Xcode.app/Contents/Developer/Platforms/MacOSX.platform/Developer/SDKs/MacOSX.sdk/System/Library/Frameworks/Foundation.framework/Headers/NSObjCRuntime.h:613:61: error: unknown type name 'NSString'
FOUNDATION_EXPORT Protocol * _Nullable NSProtocolFromString(NSString *namestr) API_AVAILABLE(macos(10.5), ios(2.0), watchos(2.0), tvos(9.0));
                                                            ^
/Applications/Xcode.app/Contents/Developer/Platforms/MacOSX.platform/Developer/SDKs/MacOSX.sdk/System/Library/Frameworks/Foundation.framework/Headers/NSObjCRuntime.h:617:30: error: unknown type name 'NSString'
FOUNDATION_EXPORT void NSLog(NSString *format, ...) NS_FORMAT_FUNCTION(1,2) NS_NO_TAIL_CALL;
                             ^
/Applications/Xcode.app/Contents/Developer/Platforms/MacOSX.platform/Developer/SDKs/MacOSX.sdk/System/Library/Frameworks/Foundation.framework/Headers/NSObjCRuntime.h:617:53: error: format argument not a string type
FOUNDATION_EXPORT void NSLog(NSString *format, ...) NS_FORMAT_FUNCTION(1,2) NS_NO_TAIL_CALL;
                             ~~~~~~~~~~~~~~~~       ^                  ~
/Applications/Xcode.app/Contents/Developer/Platforms/MacOSX.platform/Developer/SDKs/MacOSX.sdk/System/Library/Frameworks/Foundation.framework/Headers/NSObjCRuntime.h:94:49: note: expanded from macro 'NS_FORMAT_FUNCTION'
        #define NS_FORMAT_FUNCTION(F,A) __attribute__((format(__NSString__, F, A)))
                                                       ^                    ~
/Applications/Xcode.app/Contents/Developer/Platforms/MacOSX.platform/Developer/SDKs/MacOSX.sdk/System/Library/Frameworks/Foundation.framework/Headers/NSObjCRuntime.h:618:31: error: unknown type name 'NSString'
FOUNDATION_EXPORT void NSLogv(NSString *format, va_list args) NS_FORMAT_FUNCTION(1,0) NS_NO_TAIL_CALL;
                              ^
/Applications/Xcode.app/Contents/Developer/Platforms/MacOSX.platform/Developer/SDKs/MacOSX.sdk/System/Library/Frameworks/Foundation.framework/Headers/NSObjCRuntime.h:618:63: error: format argument not a string type
FOUNDATION_EXPORT void NSLogv(NSString *format, va_list args) NS_FORMAT_FUNCTION(1,0) NS_NO_TAIL_CALL;
                              ~~~~~~~~~~~~~~~~                ^                  ~
/Applications/Xcode.app/Contents/Developer/Platforms/MacOSX.platform/Developer/SDKs/MacOSX.sdk/System/Library/Frameworks/Foundation.framework/Headers/NSObjCRuntime.h:94:49: note: expanded from macro 'NS_FORMAT_FUNCTION'
        #define NS_FORMAT_FUNCTION(F,A) __attribute__((format(__NSString__, F, A)))
                                                       ^                    ~
In file included from ../subprojects/openFrameworks/libs/openFrameworks/app/ofAppGLFWWindow.cpp:26:
In file included from /Applications/Xcode.app/Contents/Developer/Platforms/MacOSX.platform/Developer/SDKs/MacOSX.sdk/System/Library/Frameworks/Cocoa.framework/Headers/Cocoa.h:12:
In file included from /Applications/Xcode.app/Contents/Developer/Platforms/MacOSX.platform/Developer/SDKs/MacOSX.sdk/System/Library/Frameworks/Foundation.framework/Headers/Foundation.h:11:
In file included from /Applications/Xcode.app/Contents/Developer/Platforms/MacOSX.platform/Developer/SDKs/MacOSX.sdk/System/Library/Frameworks/Foundation.framework/Headers/NSArray.h:5:
In file included from /Applications/Xcode.app/Contents/Developer/Platforms/MacOSX.platform/Developer/SDKs/MacOSX.sdk/System/Library/Frameworks/Foundation.framework/Headers/NSObject.h:7:
/Applications/Xcode.app/Contents/Developer/Platforms/MacOSX.platform/Developer/SDKs/MacOSX.sdk/System/Library/Frameworks/Foundation.framework/Headers/NSZone.h:9:1: error: expected unqualified-id
@class NSString;
^
/Applications/Xcode.app/Contents/Developer/Platforms/MacOSX.platform/Developer/SDKs/MacOSX.sdk/System/Library/Frameworks/Foundation.framework/Headers/NSZone.h:19:63: error: unknown type name 'NSString'
FOUNDATION_EXPORT void NSSetZoneName(NSZone * _Nullable zone, NSString *name)NS_SWIFT_UNAVAILABLE("Zone-based memory management is unavailable");
                                                              ^
/Applications/Xcode.app/Contents/Developer/Platforms/MacOSX.platform/Developer/SDKs/MacOSX.sdk/System/Library/Frameworks/Foundation.framework/Headers/NSZone.h:20:19: error: unknown type name 'NSString'
FOUNDATION_EXPORT NSString *NSZoneName(NSZone * _Nullable zone) NS_SWIFT_UNAVAILABLE("Zone-based memory management is unavailable");
                  ^
In file included from ../subprojects/openFrameworks/libs/openFrameworks/app/ofAppGLFWWindow.cpp:26:
In file included from /Applications/Xcode.app/Contents/Developer/Platforms/MacOSX.platform/Developer/SDKs/MacOSX.sdk/System/Library/Frameworks/Cocoa.framework/Headers/Cocoa.h:12:
In file included from /Applications/Xcode.app/Contents/Developer/Platforms/MacOSX.platform/Developer/SDKs/MacOSX.sdk/System/Library/Frameworks/Foundation.framework/Headers/Foundation.h:11:
In file included from /Applications/Xcode.app/Contents/Developer/Platforms/MacOSX.platform/Developer/SDKs/MacOSX.sdk/System/Library/Frameworks/Foundation.framework/Headers/NSArray.h:5:
/Applications/Xcode.app/Contents/Developer/Platforms/MacOSX.platform/Developer/SDKs/MacOSX.sdk/System/Library/Frameworks/Foundation.framework/Headers/NSObject.h:9:1: error: expected unqualified-id
@class NSInvocation, NSMethodSignature, NSCoder, NSString, NSEnumerator;
^
fatal error: too many errors emitted, stopping now [-ferror-limit=]
20 errors generated.
[13/127] Compiling C++ object subprojects/openFrameworks/libopenFrameworks.dylib.p/libs_openFrameworks_gl_ofShader.cpp.o
ninja: build stopped: subcommand failed.

@AdelKS
Copy link
Author

AdelKS commented Oct 5, 2024

How is this issue currently handled ? It looks like #include <Cocoa/Cocoa.h> in ofAppGLFWWindow.cpp is an Objective-C++ header. So on macos openFrameworks is compiled as an Objective-C++ project ?

@AdelKS
Copy link
Author

AdelKS commented Oct 5, 2024

Okay I just tried something, please try again

@ofTheo
Copy link
Member

ofTheo commented Oct 5, 2024 via email

@artificiel
Copy link
Contributor

OK making progress, now to the linker!

(just so you don't feel left hanging as this thread has a "chat" feel — i must now leave and will not get back to this space before monday noon EST)

[12/37] Linking target subprojects/openFrameworks/libopenFrameworks.dylib
FAILED: subprojects/openFrameworks/libopenFrameworks.dylib 
c++  -o subprojects/openFrameworks/libopenFrameworks.dylib subprojects/openFrameworks/libopenFrameworks.dylib.p/libs_openFrameworks_3d_of3dPrimitives.cpp.o subprojects/openFrameworks/libopenFrameworks.dylib.p/libs_openFrameworks_3d_of3dUtils.cpp.o subprojects/openFrameworks/libopenFrameworks.dylib.p/libs_openFrameworks_3d_ofCamera.cpp.o subprojects/openFrameworks/libopenFrameworks.dylib.p/libs_openFrameworks_3d_ofEasyCam.cpp.o subprojects/openFrameworks/libopenFrameworks.dylib.p/libs_openFrameworks_3d_ofNode.cpp.o subprojects/openFrameworks/libopenFrameworks.dylib.p/libs_openFrameworks_app_ofAppGLFWWindow.cpp.o subprojects/openFrameworks/libopenFrameworks.dylib.p/libs_openFrameworks_app_ofAppNoWindow.cpp.o subprojects/openFrameworks/libopenFrameworks.dylib.p/libs_openFrameworks_app_ofAppRunner.cpp.o subprojects/openFrameworks/libopenFrameworks.dylib.p/libs_openFrameworks_app_ofBaseApp.cpp.o subprojects/openFrameworks/libopenFrameworks.dylib.p/libs_openFrameworks_app_ofMainLoop.cpp.o subprojects/openFrameworks/libopenFrameworks.dylib.p/libs_openFrameworks_communication_ofArduino.cpp.o subprojects/openFrameworks/libopenFrameworks.dylib.p/libs_openFrameworks_communication_ofSerial.cpp.o subprojects/openFrameworks/libopenFrameworks.dylib.p/libs_openFrameworks_events_ofEvents.cpp.o subprojects/openFrameworks/libopenFrameworks.dylib.p/libs_openFrameworks_gl_ofBufferObject.cpp.o subprojects/openFrameworks/libopenFrameworks.dylib.p/libs_openFrameworks_gl_ofCubeMap.cpp.o subprojects/openFrameworks/libopenFrameworks.dylib.p/libs_openFrameworks_gl_ofFbo.cpp.o subprojects/openFrameworks/libopenFrameworks.dylib.p/libs_openFrameworks_gl_ofGLProgrammableRenderer.cpp.o subprojects/openFrameworks/libopenFrameworks.dylib.p/libs_openFrameworks_gl_ofGLRenderer.cpp.o subprojects/openFrameworks/libopenFrameworks.dylib.p/libs_openFrameworks_gl_ofGLUtils.cpp.o subprojects/openFrameworks/libopenFrameworks.dylib.p/libs_openFrameworks_gl_ofLight.cpp.o subprojects/openFrameworks/libopenFrameworks.dylib.p/libs_openFrameworks_gl_ofMaterial.cpp.o subprojects/openFrameworks/libopenFrameworks.dylib.p/libs_openFrameworks_gl_ofShader.cpp.o subprojects/openFrameworks/libopenFrameworks.dylib.p/libs_openFrameworks_gl_ofShadow.cpp.o subprojects/openFrameworks/libopenFrameworks.dylib.p/libs_openFrameworks_gl_ofTexture.cpp.o subprojects/openFrameworks/libopenFrameworks.dylib.p/libs_openFrameworks_gl_ofVbo.cpp.o subprojects/openFrameworks/libopenFrameworks.dylib.p/libs_openFrameworks_gl_ofVboMesh.cpp.o subprojects/openFrameworks/libopenFrameworks.dylib.p/libs_openFrameworks_graphics_of3dGraphics.cpp.o subprojects/openFrameworks/libopenFrameworks.dylib.p/libs_openFrameworks_graphics_ofBitmapFont.cpp.o subprojects/openFrameworks/libopenFrameworks.dylib.p/libs_openFrameworks_graphics_ofCairoRenderer.cpp.o subprojects/openFrameworks/libopenFrameworks.dylib.p/libs_openFrameworks_graphics_ofGraphicsBaseTypes.cpp.o subprojects/openFrameworks/libopenFrameworks.dylib.p/libs_openFrameworks_graphics_ofGraphicsCairo.cpp.o subprojects/openFrameworks/libopenFrameworks.dylib.p/libs_openFrameworks_graphics_ofGraphics.cpp.o subprojects/openFrameworks/libopenFrameworks.dylib.p/libs_openFrameworks_graphics_ofImage.cpp.o subprojects/openFrameworks/libopenFrameworks.dylib.p/libs_openFrameworks_graphics_ofPath.cpp.o subprojects/openFrameworks/libopenFrameworks.dylib.p/libs_openFrameworks_graphics_ofPixels.cpp.o subprojects/openFrameworks/libopenFrameworks.dylib.p/libs_openFrameworks_graphics_ofRendererCollection.cpp.o subprojects/openFrameworks/libopenFrameworks.dylib.p/libs_openFrameworks_graphics_ofTessellator.cpp.o subprojects/openFrameworks/libopenFrameworks.dylib.p/libs_openFrameworks_graphics_ofTrueTypeFont.cpp.o subprojects/openFrameworks/libopenFrameworks.dylib.p/libs_openFrameworks_math_ofMath.cpp.o subprojects/openFrameworks/libopenFrameworks.dylib.p/libs_openFrameworks_math_ofMatrix3x3.cpp.o subprojects/openFrameworks/libopenFrameworks.dylib.p/libs_openFrameworks_math_ofMatrix4x4.cpp.o subprojects/openFrameworks/libopenFrameworks.dylib.p/libs_openFrameworks_math_ofQuaternion.cpp.o subprojects/openFrameworks/libopenFrameworks.dylib.p/libs_openFrameworks_math_ofVec2f.cpp.o subprojects/openFrameworks/libopenFrameworks.dylib.p/libs_openFrameworks_math_ofVec4f.cpp.o subprojects/openFrameworks/libopenFrameworks.dylib.p/libs_openFrameworks_sound_ofFmodSoundPlayer.cpp.o subprojects/openFrameworks/libopenFrameworks.dylib.p/libs_openFrameworks_sound_ofMediaFoundationSoundPlayer.cpp.o subprojects/openFrameworks/libopenFrameworks.dylib.p/libs_openFrameworks_sound_ofOpenALSoundPlayer.cpp.o subprojects/openFrameworks/libopenFrameworks.dylib.p/libs_openFrameworks_sound_ofRtAudioSoundStream.cpp.o subprojects/openFrameworks/libopenFrameworks.dylib.p/libs_openFrameworks_sound_ofSoundBaseTypes.cpp.o subprojects/openFrameworks/libopenFrameworks.dylib.p/libs_openFrameworks_sound_ofSoundBuffer.cpp.o subprojects/openFrameworks/libopenFrameworks.dylib.p/libs_openFrameworks_sound_ofSoundPlayer.cpp.o subprojects/openFrameworks/libopenFrameworks.dylib.p/libs_openFrameworks_sound_ofSoundStream.cpp.o subprojects/openFrameworks/libopenFrameworks.dylib.p/libs_openFrameworks_types_ofBaseTypes.cpp.o subprojects/openFrameworks/libopenFrameworks.dylib.p/libs_openFrameworks_types_ofColor.cpp.o subprojects/openFrameworks/libopenFrameworks.dylib.p/libs_openFrameworks_types_ofParameter.cpp.o subprojects/openFrameworks/libopenFrameworks.dylib.p/libs_openFrameworks_types_ofParameterGroup.cpp.o subprojects/openFrameworks/libopenFrameworks.dylib.p/libs_openFrameworks_types_ofRectangle.cpp.o subprojects/openFrameworks/libopenFrameworks.dylib.p/libs_openFrameworks_utils_ofFileUtils.cpp.o subprojects/openFrameworks/libopenFrameworks.dylib.p/libs_openFrameworks_utils_ofFpsCounter.cpp.o subprojects/openFrameworks/libopenFrameworks.dylib.p/libs_openFrameworks_utils_ofLog.cpp.o subprojects/openFrameworks/libopenFrameworks.dylib.p/libs_openFrameworks_utils_ofMatrixStack.cpp.o subprojects/openFrameworks/libopenFrameworks.dylib.p/libs_openFrameworks_utils_ofSystemUtils.cpp.o subprojects/openFrameworks/libopenFrameworks.dylib.p/libs_openFrameworks_utils_ofThread.cpp.o subprojects/openFrameworks/libopenFrameworks.dylib.p/libs_openFrameworks_utils_ofTimer.cpp.o subprojects/openFrameworks/libopenFrameworks.dylib.p/libs_openFrameworks_utils_ofTimerFps.cpp.o subprojects/openFrameworks/libopenFrameworks.dylib.p/libs_openFrameworks_utils_ofURLFileLoader.cpp.o subprojects/openFrameworks/libopenFrameworks.dylib.p/libs_openFrameworks_utils_ofUtils.cpp.o subprojects/openFrameworks/libopenFrameworks.dylib.p/libs_openFrameworks_utils_ofXml.cpp.o subprojects/openFrameworks/libopenFrameworks.dylib.p/libs_openFrameworks_video_ofDirectShowGrabber.cpp.o subprojects/openFrameworks/libopenFrameworks.dylib.p/libs_openFrameworks_video_ofDirectShowPlayer.cpp.o subprojects/openFrameworks/libopenFrameworks.dylib.p/libs_openFrameworks_video_ofMediaFoundationPlayer.cpp.o subprojects/openFrameworks/libopenFrameworks.dylib.p/libs_openFrameworks_video_ofVideoGrabber.cpp.o subprojects/openFrameworks/libopenFrameworks.dylib.p/libs_openFrameworks_video_ofVideoPlayer.cpp.o -Wl,-dead_strip_dylibs -Wl,-headerpad_max_install_names -shared -install_name @rpath/libopenFrameworks.dylib -Wl,-rpath,@loader_path/../rtaudio-6.0.1 -Wl,-rpath,@loader_path/../uriparser -Wl,-rpath,@loader_path/../kissfft -Wl,-rpath,/opt/homebrew/Cellar/cairo/1.18.2/lib -Wl,-rpath,/opt/homebrew/Cellar/fontconfig/2.15.0/lib -Wl,-rpath,/opt/homebrew/opt/freetype/lib -Wl,-rpath,/opt/homebrew/Cellar/glew/2.2.0_1/lib -Wl,-rpath,/opt/homebrew/Cellar/glfw/3.4/lib -Wl,-rpath,/opt/homebrew/Cellar/openssl@3/3.3.2/lib -Wl,-rpath,/opt/homebrew/Cellar/mpg123/1.32.7/lib -Wl,-rpath,/opt/homebrew/Cellar/pugixml/1.14/lib -Wl,-rpath,/opt/homebrew/Cellar/libsndfile/1.2.2/lib -Wl,-rpath,/opt/homebrew/Cellar/jack/1.9.22_1/lib subprojects/libtess2/libtess2.a subprojects/rtaudio-6.0.1/librtaudio.7.dylib subprojects/uriparser/liburiparser.dylib subprojects/kissfft/libkissfft.dylib subprojects/freeimage/libFreeImage.a /opt/homebrew/Cellar/cairo/1.18.2/lib/libcairo.dylib /opt/homebrew/Cellar/fontconfig/2.15.0/lib/libfontconfig.dylib /opt/homebrew/opt/freetype/lib/libfreetype.dylib -F/Applications/Xcode.app/Contents/Developer/Platforms/MacOSX.platform/Developer/SDKs/MacOSX.sdk/System/Library/Frameworks -framework glut /opt/homebrew/Cellar/glew/2.2.0_1/lib/libGLEW.dylib /opt/homebrew/Cellar/glfw/3.4/lib/libglfw.dylib /opt/homebrew/Cellar/openssl@3/3.3.2/lib/libcrypto.dylib -lcurl /opt/homebrew/Cellar/mpg123/1.32.7/lib/libmpg123.dylib -F/Applications/Xcode.app/Contents/Developer/Platforms/MacOSX.platform/Developer/SDKs/MacOSX.sdk/System/Library/Frameworks -framework openal /opt/homebrew/Cellar/pugixml/1.14/lib/libpugixml.dylib /opt/homebrew/Cellar/libsndfile/1.2.2/lib/libsndfile.dylib -framework AppKit -framework Foundation
Undefined symbols for architecture arm64:
  "ofAVFoundationPlayer::ofAVFoundationPlayer()", referenced from:
      ofVideoPlayer::load(std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char>>) in libs_openFrameworks_video_ofVideoPlayer.cpp.o
      ofVideoPlayer::getPlayer() in libs_openFrameworks_video_ofVideoPlayer.cpp.o
      ofVideoPlayer::loadAsync(std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char>>) in libs_openFrameworks_video_ofVideoPlayer.cpp.o
  "ofAVEngineSoundPlayer::ofAVEngineSoundPlayer()", referenced from:
      ofSoundPlayer::ofSoundPlayer() in libs_openFrameworks_sound_ofSoundPlayer.cpp.o
  "ofAVFoundationGrabber::ofAVFoundationGrabber()", referenced from:
      ofVideoGrabber::getGrabber() in libs_openFrameworks_video_ofVideoGrabber.cpp.o
      ofVideoGrabber::setup(int, int, bool) in libs_openFrameworks_video_ofVideoGrabber.cpp.o
      ofVideoGrabber::listDevices() const in libs_openFrameworks_video_ofVideoGrabber.cpp.o
  "_glAlphaFunc", referenced from:
      ofGLRenderer::drawString(std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char>>, float, float, float) const in libs_openFrameworks_gl_ofGLRenderer.cpp.o
  "_glBindTexture", referenced from:
      ofCubeMap::load(ofCubeMap::ofCubeMapSettings) in libs_openFrameworks_gl_ofCubeMap.cpp.o
      ofCubeMap::load(ofCubeMap::ofCubeMapSettings) in libs_openFrameworks_gl_ofCubeMap.cpp.o
      ofCubeMap::_createCubeMap(unsigned int) in libs_openFrameworks_gl_ofCubeMap.cpp.o
      ofCubeMap::_createCubeMap(unsigned int) in libs_openFrameworks_gl_ofCubeMap.cpp.o
      ofCubeMap::_createCubeMap(unsigned int) in libs_openFrameworks_gl_ofCubeMap.cpp.o
      ofCubeMap::_createCubeMap(unsigned int) in libs_openFrameworks_gl_ofCubeMap.cpp.o
      ofCubeMap::_createCubeMap(unsigned int) in libs_openFrameworks_gl_ofCubeMap.cpp.o
      ofCubeMap::_createCubeMap(unsigned int) in libs_openFrameworks_gl_ofCubeMap.cpp.o
      ...
  "_glBlendFunc", referenced from:
      ofGLProgrammableRenderer::setBlendMode(ofBlendMode) in libs_openFrameworks_gl_ofGLProgrammableRenderer.cpp.o
      ofGLProgrammableRenderer::setBlendMode(ofBlendMode) in libs_openFrameworks_gl_ofGLProgrammableRenderer.cpp.o
      ofGLProgrammableRenderer::setBlendMode(ofBlendMode) in libs_openFrameworks_gl_ofGLProgrammableRenderer.cpp.o
      ofGLProgrammableRenderer::setBlendMode(ofBlendMode) in libs_openFrameworks_gl_ofGLProgrammableRenderer.cpp.o
      ofGLRenderer::draw(ofMesh_<glm::vec<3, float, (glm::qualifier)0>, glm::vec<3, float, (glm::qualifier)0>, ofColor_<float>, glm::vec<2, float, (glm::qualifier)0>> const&, ofPolyRenderMode, bool, bool, bool) const in libs_openFrameworks_gl_ofGLRenderer.cpp.o
      ofGLRenderer::startSmoothing() in libs_openFrameworks_gl_ofGLRenderer.cpp.o
      ofGLRenderer::draw(ofPolyline_<glm::vec<3, float, (glm::qualifier)0>> const&) const in libs_openFrameworks_gl_ofGLRenderer.cpp.o
      ...
  "_glClear", referenced from:
      ofCubeMap::_equiRectToCubeMap(unsigned int&, unsigned int, int, bool) in libs_openFrameworks_gl_ofCubeMap.cpp.o
      ofCubeMap::_equiRectToCubeMap(unsigned int&, unsigned int, int, bool) in libs_openFrameworks_gl_ofCubeMap.cpp.o
      ofCubeMap::_equiRectToCubeMap(unsigned int&, unsigned int, int, bool) in libs_openFrameworks_gl_ofCubeMap.cpp.o
      ofCubeMap::_equiRectToCubeMap(unsigned int&, unsigned int, int, bool) in libs_openFrameworks_gl_ofCubeMap.cpp.o
      ofCubeMap::_equiRectToCubeMap(unsigned int&, unsigned int, int, bool) in libs_openFrameworks_gl_ofCubeMap.cpp.o
      ofCubeMap::_equiRectToCubeMap(unsigned int&, unsigned int, int, bool) in libs_openFrameworks_gl_ofCubeMap.cpp.o
      ofGLProgrammableRenderer::clear() in libs_openFrameworks_gl_ofGLProgrammableRenderer.cpp.o
      ...
  "_glClearColor", referenced from:
      ofGLProgrammableRenderer::clear(float, float, float, float) in libs_openFrameworks_gl_ofGLProgrammableRenderer.cpp.o
      ofGLProgrammableRenderer::clearAlpha() in libs_openFrameworks_gl_ofGLProgrammableRenderer.cpp.o
      ofGLProgrammableRenderer::setBackgroundColor(ofColor_<float> const&) in libs_openFrameworks_gl_ofGLProgrammableRenderer.cpp.o
      ofGLRenderer::clear(float, float, float, float) in libs_openFrameworks_gl_ofGLRenderer.cpp.o
      ofGLRenderer::clearAlpha() in libs_openFrameworks_gl_ofGLRenderer.cpp.o
      ofGLRenderer::setBackgroundColor(ofColor_<float> const&) in libs_openFrameworks_gl_ofGLRenderer.cpp.o
  "_glColor4f", referenced from:
      ofGLRenderer::setColor(float, float, float) in libs_openFrameworks_gl_ofGLRenderer.cpp.o
      ofGLRenderer::setColor(float, float, float, float) in libs_openFrameworks_gl_ofGLRenderer.cpp.o
  "_glColorMask", referenced from:
      ofGLProgrammableRenderer::clearAlpha() in libs_openFrameworks_gl_ofGLProgrammableRenderer.cpp.o
      ofGLProgrammableRenderer::clearAlpha() in libs_openFrameworks_gl_ofGLProgrammableRenderer.cpp.o
      ofGLRenderer::clearAlpha() in libs_openFrameworks_gl_ofGLRenderer.cpp.o
      ofGLRenderer::clearAlpha() in libs_openFrameworks_gl_ofGLRenderer.cpp.o
  "_glColorMaterial", referenced from:
      ofGLRenderer::setColor(float, float, float) in libs_openFrameworks_gl_ofGLRenderer.cpp.o
      ofGLRenderer::setColor(float, float, float, float) in libs_openFrameworks_gl_ofGLRenderer.cpp.o
  "_glColorPointer", referenced from:
      ofGLRenderer::draw(ofMesh_<glm::vec<3, float, (glm::qualifier)0>, glm::vec<3, float, (glm::qualifier)0>, ofColor_<float>, glm::vec<2, float, (glm::qualifier)0>> const&, ofPolyRenderMode, bool, bool, bool) const in libs_openFrameworks_gl_ofGLRenderer.cpp.o
      ofVbo::bind() const in libs_openFrameworks_gl_ofVbo.cpp.o
  "_glCopyTexSubImage2D", referenced from:
      ofTexture::loadScreenData(int, int, int, int) in libs_openFrameworks_gl_ofTexture.cpp.o
  "_glCullFace", referenced from:
      ofShadow::beginDepth() in libs_openFrameworks_gl_ofShadow.cpp.o
      ofShadow::beginDepth(unsigned int) in libs_openFrameworks_gl_ofShadow.cpp.o
  "_glDeleteTextures", referenced from:
      release(unsigned int) in libs_openFrameworks_gl_ofCubeMap.cpp.o
      release(unsigned int) in libs_openFrameworks_gl_ofCubeMap.cpp.o
      ofCubeMap::load(ofCubeMap::ofCubeMapSettings) in libs_openFrameworks_gl_ofCubeMap.cpp.o
      ofCubeMap::load(ofCubeMap::ofCubeMapSettings) in libs_openFrameworks_gl_ofCubeMap.cpp.o
      releaseFBO(int) in libs_openFrameworks_gl_ofShadow.cpp.o
      release(unsigned int) in libs_openFrameworks_gl_ofTexture.cpp.o
      release(unsigned int) in libs_openFrameworks_gl_ofTexture.cpp.o
      ...
  "_glDepthFunc", referenced from:
      ofCubeMap::drawCubeMap() in libs_openFrameworks_gl_ofCubeMap.cpp.o
      ofCubeMap::_drawCubeStart(unsigned int) in libs_openFrameworks_gl_ofCubeMap.cpp.o
      ofCubeMap::_drawCubeEnd() in libs_openFrameworks_gl_ofCubeMap.cpp.o
      ofCubeMap::drawIrradiance() in libs_openFrameworks_gl_ofCubeMap.cpp.o
      ofCubeMap::drawPrefilteredCube(float) in libs_openFrameworks_gl_ofCubeMap.cpp.o
  "_glDepthMask", referenced from:
      ofBackgroundGradient(ofColor_<float> const&, ofColor_<float> const&, ofGradientMode) in libs_openFrameworks_graphics_ofGraphics.cpp.o
      ofBackgroundGradient(ofColor_<float> const&, ofColor_<float> const&, ofGradientMode) in libs_openFrameworks_graphics_ofGraphics.cpp.o
      ofDrawBitmapStringHighlight(std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char>>, int, int, ofColor_<unsigned char> const&, ofColor_<unsigned char> const&) in libs_openFrameworks_graphics_ofGraphics.cpp.o
      ofDrawBitmapStringHighlight(std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char>>, int, int, ofColor_<unsigned char> const&, ofColor_<unsigned char> const&) in libs_openFrameworks_graphics_ofGraphics.cpp.o
  "_glDisable", referenced from:
      ofGLProgrammableRenderer::setDepthTest(bool) in libs_openFrameworks_gl_ofGLProgrammableRenderer.cpp.o
      ofGLProgrammableRenderer::setBlendMode(ofBlendMode) in libs_openFrameworks_gl_ofGLProgrammableRenderer.cpp.o
      ofGLProgrammableRenderer::disablePointSprites() in libs_openFrameworks_gl_ofGLProgrammableRenderer.cpp.o
      ofGLProgrammableRenderer::disableAntiAliasing() in libs_openFrameworks_gl_ofGLProgrammableRenderer.cpp.o
      ofGLRenderer::bind(ofBaseMaterial const&) in libs_openFrameworks_gl_ofGLRenderer.cpp.o
      ofGLRenderer::setDepthTest(bool) in libs_openFrameworks_gl_ofGLRenderer.cpp.o
      ofGLRenderer::setBlendMode(ofBlendMode) in libs_openFrameworks_gl_ofGLRenderer.cpp.o
      ...
  "_glDisableClientState", referenced from:
      ofGLRenderer::draw(ofMesh_<glm::vec<3, float, (glm::qualifier)0>, glm::vec<3, float, (glm::qualifier)0>, ofColor_<float>, glm::vec<2, float, (glm::qualifier)0>> const&, ofPolyRenderMode, bool, bool, bool) const in libs_openFrameworks_gl_ofGLRenderer.cpp.o
      ofGLRenderer::draw(ofMesh_<glm::vec<3, float, (glm::qualifier)0>, glm::vec<3, float, (glm::qualifier)0>, ofColor_<float>, glm::vec<2, float, (glm::qualifier)0>> const&, ofPolyRenderMode, bool, bool, bool) const in libs_openFrameworks_gl_ofGLRenderer.cpp.o
      ofGLRenderer::draw(ofMesh_<glm::vec<3, float, (glm::qualifier)0>, glm::vec<3, float, (glm::qualifier)0>, ofColor_<float>, glm::vec<2, float, (glm::qualifier)0>> const&, ofPolyRenderMode, bool, bool, bool) const in libs_openFrameworks_gl_ofGLRenderer.cpp.o
      ofGLRenderer::setupGraphicDefaults() in libs_openFrameworks_gl_ofGLRenderer.cpp.o
      ofGLRenderer::setupGraphicDefaults() in libs_openFrameworks_gl_ofGLRenderer.cpp.o
      ofGLRenderer::setupGraphicDefaults() in libs_openFrameworks_gl_ofGLRenderer.cpp.o
      ofVbo::unbind() const in libs_openFrameworks_gl_ofVbo.cpp.o
      ofVbo::unbind() const in libs_openFrameworks_gl_ofVbo.cpp.o
      ofVbo::unbind() const in libs_openFrameworks_gl_ofVbo.cpp.o
      ...
  "_glDrawArrays", referenced from:
      ofGLProgrammableRenderer::draw(ofVbo const&, unsigned int, int, int) const in libs_openFrameworks_gl_ofGLProgrammableRenderer.cpp.o
      ofGLRenderer::draw(ofMesh_<glm::vec<3, float, (glm::qualifier)0>, glm::vec<3, float, (glm::qualifier)0>, ofColor_<float>, glm::vec<2, float, (glm::qualifier)0>> const&, ofPolyRenderMode, bool, bool, bool) const in libs_openFrameworks_gl_ofGLRenderer.cpp.o
      ofGLRenderer::draw(ofPolyline_<glm::vec<3, float, (glm::qualifier)0>> const&) const in libs_openFrameworks_gl_ofGLRenderer.cpp.o
      ofGLRenderer::draw(ofVbo const&, unsigned int, int, int) const in libs_openFrameworks_gl_ofGLRenderer.cpp.o
      ofGLRenderer::drawLine(float, float, float, float, float, float) const in libs_openFrameworks_gl_ofGLRenderer.cpp.o
      ofGLRenderer::drawRectangle(float, float, float, float, float) const in libs_openFrameworks_gl_ofGLRenderer.cpp.o
      ofGLRenderer::drawTriangle(float, float, float, float, float, float, float, float, float) const in libs_openFrameworks_gl_ofGLRenderer.cpp.o
      ...
  "_glDrawBuffer", referenced from:
      ofFbo::allocate(ofFboSettings) in libs_openFrameworks_gl_ofFbo.cpp.o
      ofGLProgrammableRenderer::bindForBlitting(ofFbo const&, ofFbo&, int) in libs_openFrameworks_gl_ofGLProgrammableRenderer.cpp.o
      ofGLRenderer::bindForBlitting(ofFbo const&, ofFbo&, int) in libs_openFrameworks_gl_ofGLRenderer.cpp.o
      ofShadow::_allocateFbo() in libs_openFrameworks_gl_ofShadow.cpp.o
  "_glDrawElements", referenced from:
      ofGLProgrammableRenderer::drawElements(ofVbo const&, unsigned int, int, int) const in libs_openFrameworks_gl_ofGLProgrammableRenderer.cpp.o
      ofGLRenderer::draw(ofMesh_<glm::vec<3, float, (glm::qualifier)0>, glm::vec<3, float, (glm::qualifier)0>, ofColor_<float>, glm::vec<2, float, (glm::qualifier)0>> const&, ofPolyRenderMode, bool, bool, bool) const in libs_openFrameworks_gl_ofGLRenderer.cpp.o
      ofGLRenderer::drawElements(ofVbo const&, unsigned int, int, int) const in libs_openFrameworks_gl_ofGLRenderer.cpp.o
  "_glEnable", referenced from:
      ofCubeMap::load(ofCubeMap::ofCubeMapSettings) in libs_openFrameworks_gl_ofCubeMap.cpp.o
      ofGLProgrammableRenderer::setDepthTest(bool) in libs_openFrameworks_gl_ofGLProgrammableRenderer.cpp.o
      ofGLProgrammableRenderer::setBlendMode(ofBlendMode) in libs_openFrameworks_gl_ofGLProgrammableRenderer.cpp.o
      ofGLProgrammableRenderer::setBlendMode(ofBlendMode) in libs_openFrameworks_gl_ofGLProgrammableRenderer.cpp.o
      ofGLProgrammableRenderer::setBlendMode(ofBlendMode) in libs_openFrameworks_gl_ofGLProgrammableRenderer.cpp.o
      ofGLProgrammableRenderer::setBlendMode(ofBlendMode) in libs_openFrameworks_gl_ofGLProgrammableRenderer.cpp.o
      ofGLProgrammableRenderer::setBlendMode(ofBlendMode) in libs_openFrameworks_gl_ofGLProgrammableRenderer.cpp.o
      ofGLProgrammableRenderer::setBlendMode(ofBlendMode) in libs_openFrameworks_gl_ofGLProgrammableRenderer.cpp.o
      ofGLProgrammableRenderer::setBlendMode(ofBlendMode) in libs_openFrameworks_gl_ofGLProgrammableRenderer.cpp.o
      ...
  "_glEnableClientState", referenced from:
      ofGLRenderer::draw(ofMesh_<glm::vec<3, float, (glm::qualifier)0>, glm::vec<3, float, (glm::qualifier)0>, ofColor_<float>, glm::vec<2, float, (glm::qualifier)0>> const&, ofPolyRenderMode, bool, bool, bool) const in libs_openFrameworks_gl_ofGLRenderer.cpp.o
      ofGLRenderer::draw(ofMesh_<glm::vec<3, float, (glm::qualifier)0>, glm::vec<3, float, (glm::qualifier)0>, ofColor_<float>, glm::vec<2, float, (glm::qualifier)0>> const&, ofPolyRenderMode, bool, bool, bool) const in libs_openFrameworks_gl_ofGLRenderer.cpp.o
      ofGLRenderer::draw(ofMesh_<glm::vec<3, float, (glm::qualifier)0>, glm::vec<3, float, (glm::qualifier)0>, ofColor_<float>, glm::vec<2, float, (glm::qualifier)0>> const&, ofPolyRenderMode, bool, bool, bool) const in libs_openFrameworks_gl_ofGLRenderer.cpp.o
      ofGLRenderer::draw(ofMesh_<glm::vec<3, float, (glm::qualifier)0>, glm::vec<3, float, (glm::qualifier)0>, ofColor_<float>, glm::vec<2, float, (glm::qualifier)0>> const&, ofPolyRenderMode, bool, bool, bool) const in libs_openFrameworks_gl_ofGLRenderer.cpp.o
      ofGLRenderer::draw(ofMesh_<glm::vec<3, float, (glm::qualifier)0>, glm::vec<3, float, (glm::qualifier)0>, ofColor_<float>, glm::vec<2, float, (glm::qualifier)0>> const&, ofPolyRenderMode, bool, bool, bool) const in libs_openFrameworks_gl_ofGLRenderer.cpp.o
      ofGLRenderer::draw(ofPolyline_<glm::vec<3, float, (glm::qualifier)0>> const&) const in libs_openFrameworks_gl_ofGLRenderer.cpp.o
      ofGLRenderer::setupGraphicDefaults() in libs_openFrameworks_gl_ofGLRenderer.cpp.o
      ...
  "_glFlush", referenced from:
      ofAppGLFWWindow::draw() in libs_openFrameworks_app_ofAppGLFWWindow.cpp.o
  "_glFrontFace", referenced from:
      ofShadow::beginDepth() in libs_openFrameworks_gl_ofShadow.cpp.o
      ofShadow::beginDepth(unsigned int) in libs_openFrameworks_gl_ofShadow.cpp.o
  "_glGenTextures", referenced from:
      ofCubeMap::load(ofCubeMap::ofCubeMapSettings) in libs_openFrameworks_gl_ofCubeMap.cpp.o
      ofCubeMap::_createCubeMap(unsigned int) in libs_openFrameworks_gl_ofCubeMap.cpp.o
      ofCubeMap::_createFloatCubeMap(unsigned int, int) in libs_openFrameworks_gl_ofCubeMap.cpp.o
      ofCubeMap::_loadIrradianceMap(std::__1::__fs::filesystem::path const&) in libs_openFrameworks_gl_ofCubeMap.cpp.o
      ofCubeMap::_loadPrefilterMap(std::__1::__fs::filesystem::path const&) in libs_openFrameworks_gl_ofCubeMap.cpp.o
      ofCubeMap::_createIrradianceMap(unsigned int, bool, std::__1::__fs::filesystem::path const&) in libs_openFrameworks_gl_ofCubeMap.cpp.o
      ofCubeMap::_createPrefilteredCubeMap(unsigned int, int, bool, std::__1::__fs::filesystem::path const&) in libs_openFrameworks_gl_ofCubeMap.cpp.o
      ...
  "_glGetBooleanv", referenced from:
      ofBackgroundGradient(ofColor_<float> const&, ofColor_<float> const&, ofGradientMode) in libs_openFrameworks_graphics_ofGraphics.cpp.o
  "_glGetError", referenced from:
      ofGLProgrammableRenderer::setup(int, int) in libs_openFrameworks_gl_ofGLProgrammableRenderer.cpp.o
      ofShader::setupShaderFromSource(ofShader::Source&&) in libs_openFrameworks_gl_ofShader.cpp.o
      ofShader::setupShaderFromSource(ofShader::Source&&) in libs_openFrameworks_gl_ofShader.cpp.o
      ofShader::checkProgramLinkStatus() in libs_openFrameworks_gl_ofShader.cpp.o
  "_glGetFloatv", referenced from:
      ofGLRenderer::begin(ofFbo const&, ofFboMode) in libs_openFrameworks_gl_ofGLRenderer.cpp.o
      ofGLRenderer::pushView() in libs_openFrameworks_gl_ofGLRenderer.cpp.o
      ofGLRenderer::pushView() in libs_openFrameworks_gl_ofGLRenderer.cpp.o
      ofGLRenderer::getCurrentMatrix(ofMatrixMode) const in libs_openFrameworks_gl_ofGLRenderer.cpp.o
      ofGLRenderer::getCurrentMatrix(ofMatrixMode) const in libs_openFrameworks_gl_ofGLRenderer.cpp.o
      ofGLRenderer::getCurrentMatrix(ofMatrixMode) const in libs_openFrameworks_gl_ofGLRenderer.cpp.o
      ofGLRenderer::multMatrix(glm::mat<4, 4, float, (glm::qualifier)0> const&) in libs_openFrameworks_gl_ofGLRenderer.cpp.o
      ...
  "_glGetIntegerv", referenced from:
      ofFbo::checkGLSupport() in libs_openFrameworks_gl_ofFbo.cpp.o
      ofFbo::checkGLSupport() in libs_openFrameworks_gl_ofFbo.cpp.o
      ofFbo::checkGLSupport() in libs_openFrameworks_gl_ofFbo.cpp.o
      ofFbo::allocate(ofFboSettings) in libs_openFrameworks_gl_ofFbo.cpp.o
      ofFbo::attachTexture(ofTexture&, unsigned int, unsigned int) in libs_openFrameworks_gl_ofFbo.cpp.o
      ofFbo::updateTexture(int) in libs_openFrameworks_gl_ofFbo.cpp.o
      ofGLRenderer::getNativeViewport() const in libs_openFrameworks_gl_ofGLRenderer.cpp.o
      ...
  "_glGetString", referenced from:
      ofAppGLFWWindow::setup(ofGLFWWindowSettings const&) in libs_openFrameworks_app_ofAppGLFWWindow.cpp.o
  "_glGetTexImage", referenced from:
      ofTexture::readToPixels(ofPixels_<unsigned char>&) const in libs_openFrameworks_gl_ofTexture.cpp.o
      ofTexture::readToPixels(ofPixels_<unsigned short>&) const in libs_openFrameworks_gl_ofTexture.cpp.o
      ofTexture::readToPixels(ofPixels_<float>&) const in libs_openFrameworks_gl_ofTexture.cpp.o
      ofTexture::copyTo(ofBufferObject&) const in libs_openFrameworks_gl_ofTexture.cpp.o
  "_glHint", referenced from:
      ofGLRenderer::draw(ofMesh_<glm::vec<3, float, (glm::qualifier)0>, glm::vec<3, float, (glm::qualifier)0>, ofColor_<float>, glm::vec<2, float, (glm::qualifier)0>> const&, ofPolyRenderMode, bool, bool, bool) const in libs_openFrameworks_gl_ofGLRenderer.cpp.o
      ofGLRenderer::startSmoothing() in libs_openFrameworks_gl_ofGLRenderer.cpp.o
      ofGLRenderer::draw(ofPolyline_<glm::vec<3, float, (glm::qualifier)0>> const&) const in libs_openFrameworks_gl_ofGLRenderer.cpp.o
      ofGLRenderer::drawLine(float, float, float, float, float, float) const in libs_openFrameworks_gl_ofGLRenderer.cpp.o
      ofGLRenderer::drawRectangle(float, float, float, float, float) const in libs_openFrameworks_gl_ofGLRenderer.cpp.o
      ofGLRenderer::drawTriangle(float, float, float, float, float, float, float, float, float) const in libs_openFrameworks_gl_ofGLRenderer.cpp.o
      ofGLRenderer::drawCircle(float, float, float, float) const in libs_openFrameworks_gl_ofGLRenderer.cpp.o
      ...
  "_glIsEnabled", referenced from:
      ofGLRenderer::drawString(ofTrueTypeFont const&, std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char>>, float, float) const in libs_openFrameworks_gl_ofGLRenderer.cpp.o
      ofGLRenderer::enableLighting() in libs_openFrameworks_gl_ofGLRenderer.cpp.o
      ofGLRenderer::getLightingEnabled() in libs_openFrameworks_gl_ofGLRenderer.cpp.o
  "_glLightModelfv", referenced from:
      ofGLRenderer::setGlobalAmbientColor(ofColor_<float> const&) in libs_openFrameworks_gl_ofGLRenderer.cpp.o
  "_glLightModeli", referenced from:
      ofGLRenderer::enableSeparateSpecularLight() in libs_openFrameworks_gl_ofGLRenderer.cpp.o
      ofGLRenderer::disableSeparateSpecularLight() in libs_openFrameworks_gl_ofGLRenderer.cpp.o
  "_glLightf", referenced from:
      ofGLRenderer::setLightSpotlightCutOff(int, float) in libs_openFrameworks_gl_ofGLRenderer.cpp.o
      ofGLRenderer::setLightSpotConcentration(int, float) in libs_openFrameworks_gl_ofGLRenderer.cpp.o
      ofGLRenderer::setLightAttenuation(int, float, float, float) in libs_openFrameworks_gl_ofGLRenderer.cpp.o
      ofGLRenderer::setLightAttenuation(int, float, float, float) in libs_openFrameworks_gl_ofGLRenderer.cpp.o
      ofGLRenderer::setLightAttenuation(int, float, float, float) in libs_openFrameworks_gl_ofGLRenderer.cpp.o
  "_glLightfv", referenced from:
      ofGLRenderer::loadViewMatrix(glm::mat<4, 4, float, (glm::qualifier)0> const&) in libs_openFrameworks_gl_ofGLRenderer.cpp.o
      ofGLRenderer::loadViewMatrix(glm::mat<4, 4, float, (glm::qualifier)0> const&) in libs_openFrameworks_gl_ofGLRenderer.cpp.o
      ofGLRenderer::enableLighting() in libs_openFrameworks_gl_ofGLRenderer.cpp.o
      ofGLRenderer::enableLighting() in libs_openFrameworks_gl_ofGLRenderer.cpp.o
      ofGLRenderer::setLightAmbientColor(int, ofColor_<float> const&) in libs_openFrameworks_gl_ofGLRenderer.cpp.o
      ofGLRenderer::setLightDiffuseColor(int, ofColor_<float> const&) in libs_openFrameworks_gl_ofGLRenderer.cpp.o
      ofGLRenderer::setLightSpecularColor(int, ofColor_<float> const&) in libs_openFrameworks_gl_ofGLRenderer.cpp.o
      ...
  "_glLineWidth", referenced from:
      ofGLRenderer::setLineWidth(float) in libs_openFrameworks_gl_ofGLRenderer.cpp.o
      ofGLRenderer::setLineWidth(float) in libs_openFrameworks_gl_ofGLRenderer.cpp.o
  "_glLoadMatrixf", referenced from:
      ofGLRenderer::begin(ofFbo const&, ofFboMode) in libs_openFrameworks_gl_ofGLRenderer.cpp.o
      ofGLRenderer::loadMatrix(glm::mat<4, 4, float, (glm::qualifier)0> const&) in libs_openFrameworks_gl_ofGLRenderer.cpp.o
      ofGLRenderer::multMatrix(glm::mat<4, 4, float, (glm::qualifier)0> const&) in libs_openFrameworks_gl_ofGLRenderer.cpp.o
      ofGLRenderer::loadViewMatrix(glm::mat<4, 4, float, (glm::qualifier)0> const&) in libs_openFrameworks_gl_ofGLRenderer.cpp.o
      ofGLRenderer::enableLighting() in libs_openFrameworks_gl_ofGLRenderer.cpp.o
      ofGLRenderer::setLightPosition(int, glm::vec<4, float, (glm::qualifier)0> const&) in libs_openFrameworks_gl_ofGLRenderer.cpp.o
      ofGLRenderer::setLightSpotDirection(int, glm::vec<4, float, (glm::qualifier)0> const&) in libs_openFrameworks_gl_ofGLRenderer.cpp.o
      ...
  "_glMaterialfv", referenced from:
      ofGLRenderer::bind(ofBaseMaterial const&) in libs_openFrameworks_gl_ofGLRenderer.cpp.o
      ofGLRenderer::bind(ofBaseMaterial const&) in libs_openFrameworks_gl_ofGLRenderer.cpp.o
      ofGLRenderer::bind(ofBaseMaterial const&) in libs_openFrameworks_gl_ofGLRenderer.cpp.o
      ofGLRenderer::bind(ofBaseMaterial const&) in libs_openFrameworks_gl_ofGLRenderer.cpp.o
      ofGLRenderer::bind(ofBaseMaterial const&) in libs_openFrameworks_gl_ofGLRenderer.cpp.o
      ofGLRenderer::unbind(ofBaseMaterial const&) in libs_openFrameworks_gl_ofGLRenderer.cpp.o
      ofGLRenderer::unbind(ofBaseMaterial const&) in libs_openFrameworks_gl_ofGLRenderer.cpp.o
      ofGLRenderer::unbind(ofBaseMaterial const&) in libs_openFrameworks_gl_ofGLRenderer.cpp.o
      ofGLRenderer::unbind(ofBaseMaterial const&) in libs_openFrameworks_gl_ofGLRenderer.cpp.o
      ofGLRenderer::unbind(ofBaseMaterial const&) in libs_openFrameworks_gl_ofGLRenderer.cpp.o
      ...
  "_glMatrixMode", referenced from:
      ofGLRenderer::begin(ofFbo const&, ofFboMode) in libs_openFrameworks_gl_ofGLRenderer.cpp.o
      ofGLRenderer::matrixMode(ofMatrixMode) in libs_openFrameworks_gl_ofGLRenderer.cpp.o
      ofGLRenderer::loadViewMatrix(glm::mat<4, 4, float, (glm::qualifier)0> const&) in libs_openFrameworks_gl_ofGLRenderer.cpp.o
      ofGLRenderer::loadViewMatrix(glm::mat<4, 4, float, (glm::qualifier)0> const&) in libs_openFrameworks_gl_ofGLRenderer.cpp.o
      ofGLRenderer::enableLighting() in libs_openFrameworks_gl_ofGLRenderer.cpp.o
      ofGLRenderer::enableLighting() in libs_openFrameworks_gl_ofGLRenderer.cpp.o
      ofGLRenderer::setLightPosition(int, glm::vec<4, float, (glm::qualifier)0> const&) in libs_openFrameworks_gl_ofGLRenderer.cpp.o
      ofGLRenderer::setLightPosition(int, glm::vec<4, float, (glm::qualifier)0> const&) in libs_openFrameworks_gl_ofGLRenderer.cpp.o
      ...
  "_glMultMatrixf", referenced from:
      ofGLRenderer::multMatrix(glm::mat<4, 4, float, (glm::qualifier)0> const&) in libs_openFrameworks_gl_ofGLRenderer.cpp.o
  "_glNormalPointer", referenced from:
      ofGLRenderer::draw(ofMesh_<glm::vec<3, float, (glm::qualifier)0>, glm::vec<3, float, (glm::qualifier)0>, ofColor_<float>, glm::vec<2, float, (glm::qualifier)0>> const&, ofPolyRenderMode, bool, bool, bool) const in libs_openFrameworks_gl_ofGLRenderer.cpp.o
      ofVbo::bind() const in libs_openFrameworks_gl_ofVbo.cpp.o
  "_glPixelStorei", referenced from:
      ofSetPixelStoreiAlignment(unsigned int, int, int, int) in libs_openFrameworks_gl_ofGLUtils.cpp.o
      ofSetPixelStoreiAlignment(unsigned int, int, int, int) in libs_openFrameworks_gl_ofGLUtils.cpp.o
      ofSetPixelStoreiAlignment(unsigned int, int, int, int) in libs_openFrameworks_gl_ofGLUtils.cpp.o
      ofSetPixelStoreiAlignment(unsigned int, int) in libs_openFrameworks_gl_ofGLUtils.cpp.o
  "_glPointSize", referenced from:
      ofGLRenderer::setPointSize(float) in libs_openFrameworks_gl_ofGLRenderer.cpp.o
  "_glPolygonMode", referenced from:
      ofGLProgrammableRenderer::draw(ofMesh_<glm::vec<3, float, (glm::qualifier)0>, glm::vec<3, float, (glm::qualifier)0>, ofColor_<float>, glm::vec<2, float, (glm::qualifier)0>> const&, ofPolyRenderMode, bool, bool, bool) const in libs_openFrameworks_gl_ofGLProgrammableRenderer.cpp.o
      ofGLProgrammableRenderer::draw(ofMesh_<glm::vec<3, float, (glm::qualifier)0>, glm::vec<3, float, (glm::qualifier)0>, ofColor_<float>, glm::vec<2, float, (glm::qualifier)0>> const&, ofPolyRenderMode, bool, bool, bool) const in libs_openFrameworks_gl_ofGLProgrammableRenderer.cpp.o
      ofGLProgrammableRenderer::drawInstanced(ofVboMesh const&, ofPolyRenderMode, int) const in libs_openFrameworks_gl_ofGLProgrammableRenderer.cpp.o
      ofGLProgrammableRenderer::drawInstanced(ofVboMesh const&, ofPolyRenderMode, int) const in libs_openFrameworks_gl_ofGLProgrammableRenderer.cpp.o
      ofGLProgrammableRenderer::setFillMode(ofFillFlag) in libs_openFrameworks_gl_ofGLProgrammableRenderer.cpp.o
      ofGLRenderer::draw(ofMesh_<glm::vec<3, float, (glm::qualifier)0>, glm::vec<3, float, (glm::qualifier)0>, ofColor_<float>, glm::vec<2, float, (glm::qualifier)0>> const&, ofPolyRenderMode, bool, bool, bool) const in libs_openFrameworks_gl_ofGLRenderer.cpp.o
      ofGLRenderer::draw(ofMesh_<glm::vec<3, float, (glm::qualifier)0>, glm::vec<3, float, (glm::qualifier)0>, ofColor_<float>, glm::vec<2, float, (glm::qualifier)0>> const&, ofPolyRenderMode, bool, bool, bool) const in libs_openFrameworks_gl_ofGLRenderer.cpp.o
      ...
  "_glPopAttrib", referenced from:
      ofFbo::updateTexture(int) in libs_openFrameworks_gl_ofFbo.cpp.o
      ofGLRenderer::draw(ofMesh_<glm::vec<3, float, (glm::qualifier)0>, glm::vec<3, float, (glm::qualifier)0>, ofColor_<float>, glm::vec<2, float, (glm::qualifier)0>> const&, ofPolyRenderMode, bool, bool, bool) const in libs_openFrameworks_gl_ofGLRenderer.cpp.o
      ofGLRenderer::endSmoothing() in libs_openFrameworks_gl_ofGLRenderer.cpp.o
      ofGLRenderer::draw(ofPolyline_<glm::vec<3, float, (glm::qualifier)0>> const&) const in libs_openFrameworks_gl_ofGLRenderer.cpp.o
      ofGLRenderer::drawLine(float, float, float, float, float, float) const in libs_openFrameworks_gl_ofGLRenderer.cpp.o
      ofGLRenderer::drawRectangle(float, float, float, float, float) const in libs_openFrameworks_gl_ofGLRenderer.cpp.o
      ofGLRenderer::drawTriangle(float, float, float, float, float, float, float, float, float) const in libs_openFrameworks_gl_ofGLRenderer.cpp.o
      ...
  "_glPopMatrix", referenced from:
      ofGLRenderer::popMatrix() in libs_openFrameworks_gl_ofGLRenderer.cpp.o
      ofGLRenderer::enableLighting() in libs_openFrameworks_gl_ofGLRenderer.cpp.o
      ofGLRenderer::setLightPosition(int, glm::vec<4, float, (glm::qualifier)0> const&) in libs_openFrameworks_gl_ofGLRenderer.cpp.o
      ofGLRenderer::setLightSpotDirection(int, glm::vec<4, float, (glm::qualifier)0> const&) in libs_openFrameworks_gl_ofGLRenderer.cpp.o
  "_glPushAttrib", referenced from:
      ofFbo::updateTexture(int) in libs_openFrameworks_gl_ofFbo.cpp.o
      ofGLRenderer::draw(ofMesh_<glm::vec<3, float, (glm::qualifier)0>, glm::vec<3, float, (glm::qualifier)0>, ofColor_<float>, glm::vec<2, float, (glm::qualifier)0>> const&, ofPolyRenderMode, bool, bool, bool) const in libs_openFrameworks_gl_ofGLRenderer.cpp.o
      ofGLRenderer::startSmoothing() in libs_openFrameworks_gl_ofGLRenderer.cpp.o
      ofGLRenderer::draw(ofPolyline_<glm::vec<3, float, (glm::qualifier)0>> const&) const in libs_openFrameworks_gl_ofGLRenderer.cpp.o
      ofGLRenderer::drawLine(float, float, float, float, float, float) const in libs_openFrameworks_gl_ofGLRenderer.cpp.o
      ofGLRenderer::drawRectangle(float, float, float, float, float) const in libs_openFrameworks_gl_ofGLRenderer.cpp.o
      ofGLRenderer::drawTriangle(float, float, float, float, float, float, float, float, float) const in libs_openFrameworks_gl_ofGLRenderer.cpp.o
      ...
  "_glPushMatrix", referenced from:
      ofGLRenderer::pushMatrix() in libs_openFrameworks_gl_ofGLRenderer.cpp.o
      ofGLRenderer::enableLighting() in libs_openFrameworks_gl_ofGLRenderer.cpp.o
      ofGLRenderer::setLightPosition(int, glm::vec<4, float, (glm::qualifier)0> const&) in libs_openFrameworks_gl_ofGLRenderer.cpp.o
      ofGLRenderer::setLightSpotDirection(int, glm::vec<4, float, (glm::qualifier)0> const&) in libs_openFrameworks_gl_ofGLRenderer.cpp.o
  "_glReadBuffer", referenced from:
      ofFbo::updateTexture(int) in libs_openFrameworks_gl_ofFbo.cpp.o
      ofGLProgrammableRenderer::bindForBlitting(ofFbo const&, ofFbo&, int) in libs_openFrameworks_gl_ofGLProgrammableRenderer.cpp.o
      ofGLRenderer::bindForBlitting(ofFbo const&, ofFbo&, int) in libs_openFrameworks_gl_ofGLRenderer.cpp.o
      ofShadow::_allocateFbo() in libs_openFrameworks_gl_ofShadow.cpp.o
  "_glReadPixels", referenced from:
      ofFbo::copyTo(ofBufferObject&) const in libs_openFrameworks_gl_ofFbo.cpp.o
      ofGLProgrammableRenderer::saveScreen(int, int, int, int, ofPixels_<unsigned char>&) in libs_openFrameworks_gl_ofGLProgrammableRenderer.cpp.o
      ofGLRenderer::saveScreen(int, int, int, int, ofPixels_<unsigned char>&) in libs_openFrameworks_gl_ofGLRenderer.cpp.o
  "_glRotatef", referenced from:
      ofGLRenderer::rotateDeg(float, float, float, float) in libs_openFrameworks_gl_ofGLRenderer.cpp.o
      ofGLRenderer::rotateXDeg(float) in libs_openFrameworks_gl_ofGLRenderer.cpp.o
      ofGLRenderer::rotateYDeg(float) in libs_openFrameworks_gl_ofGLRenderer.cpp.o
      ofGLRenderer::rotateZDeg(float) in libs_openFrameworks_gl_ofGLRenderer.cpp.o
      ofGLRenderer::rotateDeg(float) in libs_openFrameworks_gl_ofGLRenderer.cpp.o
      ofGLRenderer::rotateRad(float, float, float, float) in libs_openFrameworks_gl_ofGLRenderer.cpp.o
      ofGLRenderer::rotateXRad(float) in libs_openFrameworks_gl_ofGLRenderer.cpp.o
      ...
  "_glScalef", referenced from:
      ofGLRenderer::scale(float, float, float) in libs_openFrameworks_gl_ofGLRenderer.cpp.o
  "_glShadeModel", referenced from:
      ofGLRenderer::setSmoothLighting(bool) in libs_openFrameworks_gl_ofGLRenderer.cpp.o
  "_glTexCoordPointer", referenced from:
      ofGLRenderer::draw(ofMesh_<glm::vec<3, float, (glm::qualifier)0>, glm::vec<3, float, (glm::qualifier)0>, ofColor_<float>, glm::vec<2, float, (glm::qualifier)0>> const&, ofPolyRenderMode, bool, bool, bool) const in libs_openFrameworks_gl_ofGLRenderer.cpp.o
      ofGLRenderer::draw(ofMesh_<glm::vec<3, float, (glm::qualifier)0>, glm::vec<3, float, (glm::qualifier)0>, ofColor_<float>, glm::vec<2, float, (glm::qualifier)0>> const&, ofPolyRenderMode, bool, bool, bool) const in libs_openFrameworks_gl_ofGLRenderer.cpp.o
      ofVbo::bind() const in libs_openFrameworks_gl_ofVbo.cpp.o
  "_glTexEnvf", referenced from:
      ofTexture::allocate(ofTextureData const&, int, int) in libs_openFrameworks_gl_ofTexture.cpp.o
  "_glTexEnvi", referenced from:
      ofGLRenderer::enablePointSprites() in libs_openFrameworks_gl_ofGLRenderer.cpp.o
  "_glTexImage2D", referenced from:
      ofCubeMap::load(ofCubeMap::ofCubeMapSettings) in libs_openFrameworks_gl_ofCubeMap.cpp.o
      ofCubeMap::_createCubeMap(unsigned int) in libs_openFrameworks_gl_ofCubeMap.cpp.o
      ofCubeMap::_createCubeMap(unsigned int) in libs_openFrameworks_gl_ofCubeMap.cpp.o
      ofCubeMap::_createCubeMap(unsigned int) in libs_openFrameworks_gl_ofCubeMap.cpp.o
      ofCubeMap::_createCubeMap(unsigned int) in libs_openFrameworks_gl_ofCubeMap.cpp.o
      ofCubeMap::_createCubeMap(unsigned int) in libs_openFrameworks_gl_ofCubeMap.cpp.o
      ofCubeMap::_createCubeMap(unsigned int) in libs_openFrameworks_gl_ofCubeMap.cpp.o
      ...
  "_glTexParameterf", referenced from:
      ofCubeMap::load(ofCubeMap::ofCubeMapSettings) in libs_openFrameworks_gl_ofCubeMap.cpp.o
      ofCubeMap::load(ofCubeMap::ofCubeMapSettings) in libs_openFrameworks_gl_ofCubeMap.cpp.o
      ofCubeMap::load(ofCubeMap::ofCubeMapSettings) in libs_openFrameworks_gl_ofCubeMap.cpp.o
      ofCubeMap::load(ofCubeMap::ofCubeMapSettings) in libs_openFrameworks_gl_ofCubeMap.cpp.o
      ofSetTextureWrap(float, float) in libs_openFrameworks_gl_ofTexture.cpp.o
      ofSetTextureWrap(float, float) in libs_openFrameworks_gl_ofTexture.cpp.o
      ofSetMinMagFilters(float, float) in libs_openFrameworks_gl_ofTexture.cpp.o
      ofSetMinMagFilters(float, float) in libs_openFrameworks_gl_ofTexture.cpp.o
      ...
  "_glTexParameterfv", referenced from:
      ofShadow::_allocateFbo() in libs_openFrameworks_gl_ofShadow.cpp.o
      ofShadow::_allocateFbo() in libs_openFrameworks_gl_ofShadow.cpp.o
  "_glTexParameteri", referenced from:
      ofCubeMap::_createCubeMap(unsigned int) in libs_openFrameworks_gl_ofCubeMap.cpp.o
      ofCubeMap::_createCubeMap(unsigned int) in libs_openFrameworks_gl_ofCubeMap.cpp.o
      ofCubeMap::_createCubeMap(unsigned int) in libs_openFrameworks_gl_ofCubeMap.cpp.o
      ofCubeMap::_createCubeMap(unsigned int) in libs_openFrameworks_gl_ofCubeMap.cpp.o
      ofCubeMap::_createCubeMap(unsigned int) in libs_openFrameworks_gl_ofCubeMap.cpp.o
      ofCubeMap::_createFloatCubeMap(unsigned int, int) in libs_openFrameworks_gl_ofCubeMap.cpp.o
      ofCubeMap::_createFloatCubeMap(unsigned int, int) in libs_openFrameworks_gl_ofCubeMap.cpp.o
      ofCubeMap::_createFloatCubeMap(unsigned int, int) in libs_openFrameworks_gl_ofCubeMap.cpp.o
      ofCubeMap::_createFloatCubeMap(unsigned int, int) in libs_openFrameworks_gl_ofCubeMap.cpp.o
      ofCubeMap::_createFloatCubeMap(unsigned int, int) in libs_openFrameworks_gl_ofCubeMap.cpp.o
      ...
  "_glTexSubImage2D", referenced from:
      ofCubeMap::_loadPrefilterMap(std::__1::__fs::filesystem::path const&) in libs_openFrameworks_gl_ofCubeMap.cpp.o
      ofCubeMap::_loadPrefilterMap(std::__1::__fs::filesystem::path const&) in libs_openFrameworks_gl_ofCubeMap.cpp.o
      ofCubeMap::_loadPrefilterMap(std::__1::__fs::filesystem::path const&) in libs_openFrameworks_gl_ofCubeMap.cpp.o
      ofCubeMap::_loadPrefilterMap(std::__1::__fs::filesystem::path const&) in libs_openFrameworks_gl_ofCubeMap.cpp.o
      ofCubeMap::_loadPrefilterMap(std::__1::__fs::filesystem::path const&) in libs_openFrameworks_gl_ofCubeMap.cpp.o
      ofCubeMap::_loadPrefilterMap(std::__1::__fs::filesystem::path const&) in libs_openFrameworks_gl_ofCubeMap.cpp.o
      ofCubeMap::_createPrefilteredCubeMap(unsigned int, int, bool, std::__1::__fs::filesystem::path const&) in libs_openFrameworks_gl_ofCubeMap.cpp.o
      ofCubeMap::_createPrefilteredCubeMap(unsigned int, int, bool, std::__1::__fs::filesystem::path const&) in libs_openFrameworks_gl_ofCubeMap.cpp.o
      ofCubeMap::_createPrefilteredCubeMap(unsigned int, int, bool, std::__1::__fs::filesystem::path const&) in libs_openFrameworks_gl_ofCubeMap.cpp.o
      ofCubeMap::_createPrefilteredCubeMap(unsigned int, int, bool, std::__1::__fs::filesystem::path const&) in libs_openFrameworks_gl_ofCubeMap.cpp.o
      ofCubeMap::_createPrefilteredCubeMap(unsigned int, int, bool, std::__1::__fs::filesystem::path const&) in libs_openFrameworks_gl_ofCubeMap.cpp.o
      ofCubeMap::_createPrefilteredCubeMap(unsigned int, int, bool, std::__1::__fs::filesystem::path const&) in libs_openFrameworks_gl_ofCubeMap.cpp.o
      ...
  "_glTranslatef", referenced from:
      ofGLRenderer::translate(glm::vec<3, float, (glm::qualifier)0> const&) in libs_openFrameworks_gl_ofGLRenderer.cpp.o
      ofGLRenderer::translate(float, float, float) in libs_openFrameworks_gl_ofGLRenderer.cpp.o
  "_glVertexPointer", referenced from:
      ofGLRenderer::draw(ofMesh_<glm::vec<3, float, (glm::qualifier)0>, glm::vec<3, float, (glm::qualifier)0>, ofColor_<float>, glm::vec<2, float, (glm::qualifier)0>> const&, ofPolyRenderMode, bool, bool, bool) const in libs_openFrameworks_gl_ofGLRenderer.cpp.o
      ofGLRenderer::draw(ofPolyline_<glm::vec<3, float, (glm::qualifier)0>> const&) const in libs_openFrameworks_gl_ofGLRenderer.cpp.o
      ofGLRenderer::drawLine(float, float, float, float, float, float) const in libs_openFrameworks_gl_ofGLRenderer.cpp.o
      ofGLRenderer::drawRectangle(float, float, float, float, float) const in libs_openFrameworks_gl_ofGLRenderer.cpp.o
      ofGLRenderer::drawTriangle(float, float, float, float, float, float, float, float, float) const in libs_openFrameworks_gl_ofGLRenderer.cpp.o
      ofGLRenderer::drawCircle(float, float, float, float) const in libs_openFrameworks_gl_ofGLRenderer.cpp.o
      ofGLRenderer::drawEllipse(float, float, float, float, float) const in libs_openFrameworks_gl_ofGLRenderer.cpp.o
      ...
  "_glViewport", referenced from:
      ofGLProgrammableRenderer::viewport(float, float, float, float, bool) in libs_openFrameworks_gl_ofGLProgrammableRenderer.cpp.o
      ofGLRenderer::viewport(float, float, float, float, bool) in libs_openFrameworks_gl_ofGLRenderer.cpp.o
ld: symbol(s) not found for architecture arm64

@AdelKS
Copy link
Author

AdelKS commented Oct 5, 2024

I added some dependencies, that should fix these errors. Let's see on Monday 🗡️

@AdelKS AdelKS force-pushed the meson branch 2 times, most recently from f63cfb7 to 75079bc Compare October 5, 2024 22:43
@artificiel
Copy link
Contributor

same linking error (but it's task 6/40 instead of 12/37, so something changed) link_error.txt

@AdelKS
Copy link
Author

AdelKS commented Oct 7, 2024

Okay, I added the Cocoa framework as a linked against framework and I just discovered that I missed some .mm source files.

@artificiel
Copy link
Contributor

there were some missing commas near:

subprojects/openFrameworks/meson.build:272:4: ERROR: Expecting rparen got string.
    'libs/openFrameworks/video/ofAVFoundationGrabber.mm'
    ^
For a block that started at 270,18
  sources += files(
                  ^

fixed that but then stuck on:

subprojects/openFrameworks/meson.build:321:6: ERROR: No host machine compiler for 'subprojects/openFrameworks/libs/openFrameworks/sound/ofAVEngineSoundPlayer.mm'

meson-log.txt

tried forcing clang++ with export CXX=clang++ and it seems to be picked up instead of g++ (don't know if g++ does objc++) but does not help with the ofAVEngineSoundPlayer.mm error

@AdelKS
Copy link
Author

AdelKS commented Oct 7, 2024

Ah yeah, I added add_languages('objcpp', native: false) in the darwin (macos) if block. That should fix it.

@artificiel
Copy link
Contributor

more objc++ compile fun:

it's about weak references which are related to retain-release and there is a note to enabling ARC Automatic Reference Counting — it means adding -fobjc-arc but not sure where to stick that in the pipeline.

[1/6] Compiling Objective-C++ object subprojects/openFrameworks/libopenFrameworks.dylib.p/libs_openFrameworks_sound_ofAVEngineSoundPlayer.mm.o
FAILED: subprojects/openFrameworks/libopenFrameworks.dylib.p/libs_openFrameworks_sound_ofAVEngineSoundPlayer.mm.o 
clang++ -Isubprojects/openFrameworks/libopenFrameworks.dylib.p -Isubprojects/openFrameworks -I../subprojects/openFrameworks -I../subprojects/openFrameworks/libs/openFrameworks/3d -I../subprojects/openFrameworks/libs/openFrameworks/app -I../subprojects/openFrameworks/libs/openFrameworks/communication -I../subprojects/openFrameworks/libs/openFrameworks/events -I../subprojects/openFrameworks/libs/openFrameworks/gl -I../subprojects/openFrameworks/libs/openFrameworks/graphics -I../subprojects/openFrameworks/libs/openFrameworks/math -I../subprojects/openFrameworks/libs/openFrameworks/sound -I../subprojects/openFrameworks/libs/openFrameworks/types -I../subprojects/openFrameworks/libs/openFrameworks/utils -I../subprojects/openFrameworks/libs/openFrameworks/video -I../subprojects/openFrameworks/libs/openFrameworks -I../subprojects/libtess2/Include -Isubprojects/rtaudio-6.0.1 -I../subprojects/rtaudio-6.0.1 -I../subprojects/uriparser/include -Isubprojects/uriparser/__CMake_build -I../subprojects/uriparser/__CMake_build -Isubprojects/uriparser -I../subprojects/uriparser -Isubprojects/kissfft -I../subprojects/kissfft -Isubprojects/kissfft/__CMake_build -I../subprojects/kissfft/__CMake_build -I../subprojects/freeimage/Source/LibPNG -I../subprojects/freeimage/Source/ZLib -I../subprojects/freeimage/Source/LibWebP -I../subprojects/freeimage/Source/OpenEXR/Half -I../subprojects/freeimage/Source -I../subprojects/freeimage/Source/Metadata -I../subprojects/freeimage/Source/FreeImageToolkit -I../subprojects/freeimage/Source/LibJPEG -I../subprojects/freeimage/Source/LibTIFF4 -I../subprojects/freeimage/Source/LibOpenJPEG -Isubprojects/freeimage/__CMake_build -I../subprojects/freeimage/__CMake_build -Isubprojects/freeimage -I../subprojects/freeimage -I/opt/homebrew/include -I/opt/homebrew/Cellar/cairo/1.18.2/include/cairo -I/opt/homebrew/Cellar/fontconfig/2.15.0/include -I/opt/homebrew/opt/freetype/include/freetype2 -I/opt/homebrew/opt/libpng/include/libpng16 -I/opt/homebrew/Cellar/libxext/1.3.6/include -I/opt/homebrew/Cellar/libxrender/0.9.11/include -I/opt/homebrew/Cellar/libx11/1.8.10/include -I/opt/homebrew/Cellar/libxcb/1.17.0/include -I/opt/homebrew/Cellar/libxau/1.0.11/include -I/opt/homebrew/Cellar/libxdmcp/1.1.5/include -I/opt/homebrew/Cellar/pixman/0.42.2/include/pixman-1 -I/opt/homebrew/Cellar/xorgproto/2024.1/include -I/opt/homebrew/Cellar/glew/2.2.0_1/include -I/opt/homebrew/Cellar/glfw/3.4/include -I/opt/homebrew/Cellar/glm/1.0.1/include -I/opt/homebrew/Cellar/openssl@3/3.3.2/include -I/opt/homebrew/Cellar/mpg123/1.32.7/include -I/opt/homebrew/Cellar/nlohmann-json/3.11.3/include -I/opt/homebrew/Cellar/pugixml/1.14/include -I/opt/homebrew/Cellar/libsndfile/1.2.2/include -I/opt/homebrew/Cellar/flac/1.4.3/include -I/opt/homebrew/Cellar/libvorbis/1.3.7/include -I/opt/homebrew/Cellar/libogg/1.3.5/include -I/opt/homebrew/Cellar/opus/1.5.2/include/opus -I/opt/homebrew/include/utf8cpp -fdiagnostics-color=always -DNDEBUG -Wall -Winvalid-pch -std=c++20 -O3 -DDISABLE_PERF_MEASUREMENT -DOPJ_STATIC -DNO_LCMS -DNO_WINDOWS -Dkiss_fft_scalar=float -DKISS_FFT_SHARED -F/Applications/Xcode.app/Contents/Developer/Platforms/MacOSX.platform/Developer/SDKs/MacOSX.sdk/System/Library/Frameworks/OpenAL.framework -idirafter/Applications/Xcode.app/Contents/Developer/Platforms/MacOSX.platform/Developer/SDKs/MacOSX.sdk/System/Library/Frameworks/OpenAL.framework/Headers -F/Applications/Xcode.app/Contents/Developer/Platforms/MacOSX.platform/Developer/SDKs/MacOSX.sdk/System/Library/Frameworks/GLUT.framework -idirafter/Applications/Xcode.app/Contents/Developer/Platforms/MacOSX.platform/Developer/SDKs/MacOSX.sdk/System/Library/Frameworks/GLUT.framework/Headers -DBOOST_ALL_NO_LIB -MD -MQ subprojects/openFrameworks/libopenFrameworks.dylib.p/libs_openFrameworks_sound_ofAVEngineSoundPlayer.mm.o -MF subprojects/openFrameworks/libopenFrameworks.dylib.p/libs_openFrameworks_sound_ofAVEngineSoundPlayer.mm.o.d -o subprojects/openFrameworks/libopenFrameworks.dylib.p/libs_openFrameworks_sound_ofAVEngineSoundPlayer.mm.o -c ../subprojects/openFrameworks/libs/openFrameworks/sound/ofAVEngineSoundPlayer.mm
In file included from ../subprojects/openFrameworks/libs/openFrameworks/sound/ofAVEngineSoundPlayer.mm:8:
In file included from ../subprojects/openFrameworks/libs/openFrameworks/sound/ofAVEngineSoundPlayer.h:11:
../subprojects/openFrameworks/libs/openFrameworks/utils/ofConstants.h:222:4: warning: "Please enable ARC (Automatic Reference Counting) at the project level" [-W#warnings]
                #warning "Please enable ARC (Automatic Reference Counting) at the project level"
                 ^
../subprojects/openFrameworks/libs/openFrameworks/sound/ofAVEngineSoundPlayer.mm:310:24: error: cannot create __weak reference in file using manual reference counting
        __typeof(self) __weak weak_self = self;
                       ^
../subprojects/openFrameworks/libs/openFrameworks/sound/ofAVEngineSoundPlayer.mm:317:26: warning: unused variable 'isPlaying' [-Wunused-variable]
                    bool isPlaying = [weak_self isPlaying] || weak_self.bIsPlaying == YES;
                         ^
../subprojects/openFrameworks/libs/openFrameworks/sound/ofAVEngineSoundPlayer.mm:355:61: warning: implicit conversion from 'float' to 'int64_t' (aka 'long long') changes value from 0.033 to 0 [-Wliteral-conversion]
            dispatch_after(dispatch_time(DISPATCH_TIME_NOW, 0.033f), dispatch_get_main_queue(), ^{
                           ~~~~~~~~~~~~~                    ^~~~~~
../subprojects/openFrameworks/libs/openFrameworks/sound/ofAVEngineSoundPlayer.mm:249:13: warning: unused variable 'error' [-Wunused-variable]
                NSError * error = nil;
                          ^
../subprojects/openFrameworks/libs/openFrameworks/sound/ofAVEngineSoundPlayer.mm:371:16: warning: unused variable 'interruptionType' [-Wunused-variable]
    NSUInteger interruptionType;
               ^
../subprojects/openFrameworks/libs/openFrameworks/sound/ofAVEngineSoundPlayer.mm:372:11: warning: unused variable 'reasonValue' [-Wunused-variable]
    UInt8 reasonValue;
          ^
../subprojects/openFrameworks/libs/openFrameworks/sound/ofAVEngineSoundPlayer.mm:402:16: warning: unused variable 'interruptionType' [-Wunused-variable]
    NSUInteger interruptionType;
               ^
../subprojects/openFrameworks/libs/openFrameworks/sound/ofAVEngineSoundPlayer.mm:559:24: error: cannot create __weak reference in file using manual reference counting
        __typeof(self) __weak weak_self = self;
                       ^
../subprojects/openFrameworks/libs/openFrameworks/sound/ofAVEngineSoundPlayer.mm:561:61: warning: implicit conversion from 'float' to 'int64_t' (aka 'long long') changes value from 0.017000001 to 0 [-Wliteral-conversion]
            dispatch_after(dispatch_time(DISPATCH_TIME_NOW, 0.017f), dispatch_get_main_queue(), ^{
                           ~~~~~~~~~~~~~                    ^~~~~~
../subprojects/openFrameworks/libs/openFrameworks/sound/ofAVEngineSoundPlayer.mm:524:14: warning: unused variable 'error' [-Wunused-variable]
    NSError *error;
             ^
../subprojects/openFrameworks/libs/openFrameworks/sound/ofAVEngineSoundPlayer.mm:608:10: warning: variable 'engineRunning' set but not used [-Wunused-but-set-variable]
    BOOL engineRunning = NO;
         ^
../subprojects/openFrameworks/libs/openFrameworks/sound/ofAVEngineSoundPlayer.mm:685:1: warning: method possibly missing a [super dealloc] call [-Wobjc-missing-super-calls]
}
^
../subprojects/openFrameworks/libs/openFrameworks/sound/ofAVEngineSoundPlayer.mm:725:24: error: cannot create __weak reference in file using manual reference counting
        __typeof(self) __weak weak_self = self;
                       ^
../subprojects/openFrameworks/libs/openFrameworks/sound/ofAVEngineSoundPlayer.mm:726:57: warning: implicit conversion from 'float' to 'int64_t' (aka 'long long') changes value from 0.30000001 to 0 [-Wliteral-conversion]
        dispatch_after(dispatch_time(DISPATCH_TIME_NOW, 0.3f), dispatch_get_main_queue(), ^{
                       ~~~~~~~~~~~~~                    ^~~~
../subprojects/openFrameworks/libs/openFrameworks/sound/ofAVEngineSoundPlayer.mm:792:24: error: cannot create __weak reference in file using manual reference counting
        __typeof(self) __weak weak_self = self;
                       ^
../subprojects/openFrameworks/libs/openFrameworks/sound/ofAVEngineSoundPlayer.mm:859:28: error: cannot create __weak reference in file using manual reference counting
            __typeof(self) __weak weak_self = self;
                           ^
../subprojects/openFrameworks/libs/openFrameworks/sound/ofAVEngineSoundPlayer.mm:858:57: warning: implicit conversion from 'float' to 'int64_t' (aka 'long long') changes value from 0.30000001 to 0 [-Wliteral-conversion]
        dispatch_after(dispatch_time(DISPATCH_TIME_NOW, 0.3f), dispatch_get_main_queue(), ^{
                       ~~~~~~~~~~~~~                    ^~~~
13 warnings and 5 errors generated.
ninja: build stopped: subcommand failed.

@AdelKS
Copy link
Author

AdelKS commented Oct 7, 2024

I added it in the line add_project_arguments(['-ObjC++', '-fobjc-arc'], language: ['cpp', 'objcpp']), in that same if block, should work.

@AdelKS AdelKS force-pushed the meson branch 2 times, most recently from 6226351 to aeabf3e Compare October 7, 2024 22:04
@ofTheo
Copy link
Member

ofTheo commented Oct 8, 2024

Loving to see the progress on all of this.
I think realistically moving away from custom systems and towards more widely supported standards would be a healthy move.

Apothecary is a Herculean effort at this point and it's so refreshing on linux to run install_dependencies.sh and take care of 90% of the library needs of OF.

which means the equivalent of the apothecary could be published as conan packages, and prebuilt as needed. officially supported platforms could be provided and pinned-to with version numbers, andthey would be assembled for "static" distribution on supported platforms, gathering the libs from conan and tarballing them for the equivalent of the current binary "semver" releases.

Ah interesting @artificiel - I did try requesting static packages with Conan and they didn't exist for macOS but nice that they can be shared publicly if we did build them.

@artificiel
Copy link
Contributor

artificiel commented Oct 8, 2024

still had some errors and decided to actually look into meson.build then...

🍾

attached is a modified OF build file (was missing some more frameworks and also .m support for the single pure objc file we have...) it's probably not perfect but it got past the problems meson.build.zip

now, unfortunately no compute shaders on macOS hah so your demo app can't run sorry about that. also not sure but it does not seem to find the data stuff (but the directory is there). testlog.txt

some questions / refinements to further develop this proof of concept:

  1. let's say we want to build examples/3d/3dprimitives out of thin air, with a meson file, how would that look? (i tried a quick hack starting from the demo app meson.build but i don't know how to specify the OF dependency. (is OF pulled by the ofxGamePad? so would it only need a .wrap for OF?)

  2. also on the toplevel meson.build, there are many settings like c++20 — should that be pulled from the dependencies, and OF would provide most? with the idea of making the project files as simple and streamlined as possible, containing nothing more than the absolute minimum requirements

  3. i understand the meson argument for "no wildcard/scanning" rationale for the source tree, but for assets, having to provide a catalog for bin/data is a bit of a bummer, especially since it's runtime files and unrelated to compile time. is there a way not to have to specify the contents?

  4. and (related to (1)) let's say we want to compile multiple projects (like all the examples) against a single copy of OF, how would that work?

Treat files as Objective-C++ instead of C++
because some included macos headers are Objective-C++
Objective-C++ apparently is a superset of C++
so we should be all good

Co-authored-by: Alexandre Burton <[email protected]>
Co-authored-by: Adel KARA SLIMANE <[email protected]>
AdelKS added 2 commits October 8, 2024 21:30
Not strictly required, can be tuned e.g. for each build folder
So it can be cached with MESON_PACKAGE_CACHE_DIR
@AdelKS
Copy link
Author

AdelKS commented Oct 8, 2024

🍾

Awesome ! I am happy you found it easy to hack.

So in the end you only needed Xcode installed and no other dependency ? Everything was pulled by meson ?

now, unfortunately no compute shaders on macOS hah so your demo app can't run sorry about that

Did not know that it doesn't handle OpenGL compute shaders, but I suppose it can still cross-compile those GLSL shaders to Metal Shading Language. I was reading recently about how Qt handles multi-platform, with QSB and QShader.

also not sure but it does not seem to find the data stuff (but the directory is there)

It probably comes from differences on how OF handles loading relative paths in different platforms.

i don't know how to specify the OF dependency.

You can check the ofxGamepad project which depends directly on OF. But it's basically the same approach:

  1. meson.build contains a dependency('openFrameworks') that is either satisfied by being installed in the host, or provided by the .wrap in the subprojects folder.
  2. That dependency is fed to every executable() and library() meson calls.

as simple and streamlined as possible, containing nothing more than the absolute minimum requirements

I just pulled that part from my own projects, this block can be entirely removed, except maybe cpp_std which is by default on c++17. Those options apply only on compiling the source files of the meson project they belong to.

default_options : [
  'cpp_std=c++20',
  'buildtype=release',
  'optimization=3',
  'default_library=shared',
  # 'prefer_static=true',
  'b_ndebug=if-release',
  'c_args=-pipe',
  'cpp_args=-pipe',
  # 'warning_level=3'
]

is there a way not to have to specify the contents?

The rationale still applies to those unfortunately (how to quickly track changes?). You can do this with some caveats.

Now let's question this approach:

  • I had to do move some runtime files over to the build folder in my case because the code expects a data folder at the same level of the executable. But you can e.g. give it a path of where the data folder is without moving, if we are talking about a use case were the exe is meant to be run directly from the build folder.
  • In theory, one does meson install to install the library or the compiled program. And in that case, yeah it applies (each file must explicitly be stated).

and (related to (1)) let's say we want to compile multiple projects (like all the examples) against a single copy of OF, how would that work?

Two possibilities:

  1. Install OF on the host machine by doing meson install after meson compile. In which case meson will find the library as "host installed" using pkg-config.
  2. Use MESON_PACKAGE_CACHE_DIR env var which makes meson put a copy of every subproject it downloads, and check that folder first before downloading a project from the internet. It doesn't work with git wraps.

An interesting extra information about shipping prebuilt libraries directly with wraps

@artificiel
Copy link
Contributor

artificiel commented Oct 9, 2024

ok thanks for all this! it helps and is great to see an OF binary out of meson/ninja. obviously as @ofTheo mentions the whole OF package/addon/PG system needs a refresh, and it's difficult to define the correct solution as while the philosophy of things can evolve, they still have to work unilaterally on day 1, be backwards-compatible, stay simple for beginners to get code compiled, ultimately be an improvement, and with less maintaining.

then once that's decided there is a CHUNK of work to be done... which must not be underestimated as in that kind of refactoring, 95% completion is a failure, and it's not really something that can be done progressively.

so let's keep this issue floating for quick reference as the various tendrils of thought weave and tighten around the subject matter.

@dimitre
Copy link
Member

dimitre commented Oct 22, 2024

Great initiative!
I also have a proof of concept of a different way of building OF libraries (apothecary alternative)
It doesn't have all the libraries yet but it is already building and deploying with github actions.
https://github.com/dimitre/ofChalet

and some related discussion
openframeworks/apothecary#379

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
None yet
Projects
None yet
Development

Successfully merging this pull request may close these issues.

4 participants