Error: 'rack::ui::Menu' has not been declared

Hi, wondering if I could get some guidance for this? I can see that Menu is indeed defined, so not sure why this fails.

/Users/ericgao/Documents/Projects/ports/metamodule-plugin-sdk/metamodule-rack-interface/include/app/ParamWidget.hpp:45:40: error: 'rack::ui::Menu' has not been declared
   45 |         virtual void appendContextMenu(ui::Menu* menu) {}
      |                                        ^~
In file included from /Users/ericgao/Documents/Projects/ports/metamodule-plugin-sdk/metamodule-rack-interface/include/rack.hpp:26:
/Users/ericgao/Documents/Projects/ports/metamodule-plugin-sdk/metamodule-rack-interface/include/helpers.hpp: In member function 'rack::ui::Menu* rack::createSubmenuItem(std::string, std::string, std::function<void(ui::Menu*)>, bool)::Item::createChildMenu()':
/Users/ericgao/Documents/Projects/ports/metamodule-plugin-sdk/metamodule-rack-interface/include/helpers.hpp:328:46: error: invalid use of incomplete type 'struct rack::ui::Menu'
  328 |                         auto *menu = new ui::Menu;
      |                                              ^~~~
In file included from /Users/ericgao/Documents/Projects/ports/metamodule-plugin-sdk/metamodule-rack-interface/include/engine/Module.hpp:14,
                 from /Users/ericgao/Documents/Projects/ports/metamodule-plugin-sdk/metamodule-rack-interface/include/app/PortWidget.hpp:5,
                 from /Users/ericgao/Documents/Projects/ports/metamodule-plugin-sdk/metamodule-rack-interface/include/app/SvgPort.hpp:3,
                 from /Users/ericgao/Documents/Projects/ports/metamodule-plugin-sdk/metamodule-rack-interface/include/componentlibrary.hpp:6:
/Users/ericgao/Documents/Projects/ports/metamodule-plugin-sdk/metamodule-rack-interface/include/plugin/Model.hpp:14:8: note: forward declaration of 'struct rack::ui::Menu'
   14 | struct Menu;
      |        ^~~~
/Users/ericgao/Documents/Projects/ports/metamodule-plugin-sdk/metamodule-rack-interface/include/helpers.hpp: In member function 'rack::ui::Menu* rack::createSubmenuItem(std::string, std::function<std::__cxx11::basic_string<char>()>, std::function<void(ui::Menu*)>, bool)::Item::createChildMenu()':
/Users/ericgao/Documents/Projects/ports/metamodule-plugin-sdk/metamodule-rack-interface/include/helpers.hpp:374:46: error: invalid use of incomplete type 'struct rack::ui::Menu'
  374 |                         auto *menu = new ui::Menu;
      |                                              ^~~~
/Users/ericgao/Documents/Projects/ports/metamodule-plugin-sdk/metamodule-rack-interface/include/plugin/Model.hpp:14:8: note: forward declaration of 'struct rack::ui::Menu'
   14 | struct Menu;
      |        ^~~~
/Users/ericgao/Documents/Projects/ports/metamodule-plugin-sdk/metamodule-rack-interface/include/helpers.hpp: In member function 'rack::ui::Menu* rack::createIndexSubmenuItem(std::string, std::vector<std::__cxx11::basic_string<char> >, std::function<unsigned int()>, std::function<void(unsigned int)>, bool, bool)::Item::createChildMenu()':
/Users/ericgao/Documents/Projects/ports/metamodule-plugin-sdk/metamodule-rack-interface/include/helpers.hpp:444:46: error: invalid use of incomplete type 'struct rack::ui::Menu'
  444 |                         auto *menu = new ui::Menu;
      |                                              ^~~~
/Users/ericgao/Documents/Projects/ports/metamodule-plugin-sdk/metamodule-rack-interface/include/plugin/Model.hpp:14:8: note: forward declaration of 'struct rack::ui::Menu'
   14 | struct Menu;
      |        ^~~~
ninja: build stopped: subcommand failed.```

I missed this earlier… Yeah, it’s defined in include/ui/Menu.hpp which is included by some of the headers mentioned in the error.

This is strange… I do see errors like this when the plugin-sdk submodule is updated. And/or it needs a fresh build (rm -rf build/)

Or, it is possible somewhere else something is declaring a struct called Menu?

Or… some header file has an issue, missing a closing }, so that when ui/Menu.hpp gets included, it ends up in the wrong namespace. You’d see other errors too if this was the case (probably)

Ah there definitely is a ui/Menu.hpp.

Here is the full error

-- Build files have been written to: /Users/ericgao/Documents/Projects/ports/FrozenWasteland/build
[1/7] Building CXX object CMakeFiles/FrozenWasteland.dir/FrozenWasteland/src/BPMLFO.cpp.obj
FAILED: CMakeFiles/FrozenWasteland.dir/FrozenWasteland/src/BPMLFO.cpp.obj 
/Applications/ArmGNUToolchain/12.3.rel1/arm-none-eabi/bin/arm-none-eabi-g++ -DMETAMODULE -D__PLUGIN -D__V1x -I/Users/ericgao/Documents/Projects/ports/FrozenWasteland/FrozenWasteland -I/Users/ericgao/Documents/Projects/ports/FrozenWasteland/FrozenWasteland/src -I/Users/ericgao/Documents/Projects/ports/FrozenWasteland/FrozenWasteland/dsp -I/Users/ericgao/Documents/Projects/ports/metamodule-plugin-sdk/metamodule-core-interface/. -I/Users/ericgao/Documents/Projects/ports/metamodule-plugin-sdk/metamodule-core-interface/./filesystem -I/Users/ericgao/Documents/Projects/ports/metamodule-plugin-sdk/metamodule-plugin-libc/include -I/Users/ericgao/Documents/Projects/ports/metamodule-plugin-sdk/cpputil/. -isystem /Users/ericgao/Documents/Projects/ports/metamodule-plugin-sdk/metamodule-rack-interface/include -isystem /Users/ericgao/Documents/Projects/ports/metamodule-plugin-sdk/metamodule-rack-interface/dep/include -O2 -g -DNDEBUG -std=c++23 -fdata-sections -ffunction-sections -fno-exceptions -fno-threadsafe-statics -fno-use-cxa-atexit -fvisibility=hidden -fvisibility-inlines-hidden -fno-math-errno -mcpu=cortex-a7 -mlittle-endian -mfpu=neon-vfpv4 -mfloat-abi=hard -mthumb-interwork -mno-unaligned-access -mtune=cortex-a7 -mvectorize-with-neon-quad --param l1-cache-size=32 --param l1-cache-line-size=64 --param l2-cache-size=256 -O3 -g3 -fno-common -nostdlib -nostartfiles -fno-unwind-tables -Wall -Werror=return-type -Wno-psabi -Wno-double-promotion -Wno-attributes -shared -fPIC -Wno-register -Wno-volatile -ffold-simple-inlines -MD -MT CMakeFiles/FrozenWasteland.dir/FrozenWasteland/src/BPMLFO.cpp.obj -MF CMakeFiles/FrozenWasteland.dir/FrozenWasteland/src/BPMLFO.cpp.obj.d -o CMakeFiles/FrozenWasteland.dir/FrozenWasteland/src/BPMLFO.cpp.obj -c /Users/ericgao/Documents/Projects/ports/FrozenWasteland/FrozenWasteland/src/BPMLFO.cpp
In file included from /Users/ericgao/Documents/Projects/ports/metamodule-plugin-sdk/metamodule-rack-interface/include/app/ParamWidget.hpp:5,
                 from /Users/ericgao/Documents/Projects/ports/metamodule-plugin-sdk/metamodule-rack-interface/include/app/Knob.hpp:3,
                 from /Users/ericgao/Documents/Projects/ports/metamodule-plugin-sdk/metamodule-rack-interface/include/app/SvgKnob.hpp:3,
                 from /Users/ericgao/Documents/Projects/ports/metamodule-plugin-sdk/metamodule-rack-interface/include/componentlibrary.hpp:4,
                 from /Users/ericgao/Documents/Projects/ports/metamodule-plugin-sdk/metamodule-rack-interface/include/rack.hpp:24,
                 from /Users/ericgao/Documents/Projects/ports/FrozenWasteland/FrozenWasteland/src/FrozenWasteland.hpp:1,
                 from /Users/ericgao/Documents/Projects/ports/FrozenWasteland/FrozenWasteland/src/BPMLFO.cpp:2:
/Users/ericgao/Documents/Projects/ports/FrozenWasteland/FrozenWasteland/src/ui/Menu.hpp:15:35: error: invalid use of incomplete type 'struct rack::ui::MenuItem'
   15 | struct OptionMenuItem : rack::ui::MenuItem {
      |                                   ^~~~~~~~
/Users/ericgao/Documents/Projects/ports/FrozenWasteland/FrozenWasteland/src/ui/Menu.hpp:11:8: note: forward declaration of 'struct rack::ui::MenuItem'
   11 | struct MenuItem;
      |        ^~~~~~~~
/Users/ericgao/Documents/Projects/ports/FrozenWasteland/FrozenWasteland/src/ui/Menu.hpp: In constructor 'OptionMenuItem::OptionMenuItem(const char*, std::function<bool()>, std::function<void()>)':
/Users/ericgao/Documents/Projects/ports/FrozenWasteland/FrozenWasteland/src/ui/Menu.hpp:23:23: error: 'struct OptionMenuItem' has no member named 'text'
   23 |                 this->text = label;
      |                       ^~~~
/Users/ericgao/Documents/Projects/ports/FrozenWasteland/FrozenWasteland/src/ui/Menu.hpp: In member function 'void OptionMenuItem::step()':
/Users/ericgao/Documents/Projects/ports/FrozenWasteland/FrozenWasteland/src/ui/Menu.hpp:31:37: error: incomplete type 'rack::ui::MenuItem' used in nested name specifier
   31 |                 rack::ui::MenuItem::step();
      |                                     ^~~~
/Users/ericgao/Documents/Projects/ports/FrozenWasteland/FrozenWasteland/src/ui/Menu.hpp:32:17: error: 'rightText' was not declared in this scope
   32 |                 rightText = _check() ? "✔" : "";
      |                 ^~~~~~~~~
/Users/ericgao/Documents/Projects/ports/FrozenWasteland/FrozenWasteland/src/ui/Menu.hpp: At global scope:
/Users/ericgao/Documents/Projects/ports/FrozenWasteland/FrozenWasteland/src/ui/Menu.hpp:42:36: error: invalid use of incomplete type 'struct rack::ui::MenuItem'
   42 | struct OptionsMenuItem : rack::ui::MenuItem {
      |                                    ^~~~~~~~
/Users/ericgao/Documents/Projects/ports/FrozenWasteland/FrozenWasteland/src/ui/Menu.hpp:11:8: note: forward declaration of 'struct rack::ui::MenuItem'
   11 | struct MenuItem;
      |        ^~~~~~~~
/Users/ericgao/Documents/Projects/ports/FrozenWasteland/FrozenWasteland/src/ui/Menu.hpp:54:25: error: 'rack::ui::Menu* OptionsMenuItem::createChildMenu()' marked 'override', but does not override
   54 |         rack::ui::Menu* createChildMenu() override {
      |                         ^~~~~~~~~~~~~~~
/Users/ericgao/Documents/Projects/ports/FrozenWasteland/FrozenWasteland/src/ui/Menu.hpp: In constructor 'OptionsMenuItem::OptionsMenuItem(const char*)':
/Users/ericgao/Documents/Projects/ports/FrozenWasteland/FrozenWasteland/src/ui/Menu.hpp:46:23: error: 'struct OptionsMenuItem' has no member named 'text'
   46 |                 this->text = label;
      |                       ^~~~
/Users/ericgao/Documents/Projects/ports/FrozenWasteland/FrozenWasteland/src/ui/Menu.hpp:47:23: error: 'struct OptionsMenuItem' has no member named 'rightText'
   47 |                 this->rightText = "▸";
      |                       ^~~~~~~~~
/Users/ericgao/Documents/Projects/ports/FrozenWasteland/FrozenWasteland/src/ui/Menu.hpp: In member function 'rack::ui::Menu* OptionsMenuItem::createChildMenu()':
/Users/ericgao/Documents/Projects/ports/FrozenWasteland/FrozenWasteland/src/ui/Menu.hpp:55:54: error: invalid use of incomplete type 'struct rack::ui::Menu'
   55 |                 rack::ui::Menu* menu = new rack::ui::Menu;
      |                                                      ^~~~
/Users/ericgao/Documents/Projects/ports/FrozenWasteland/FrozenWasteland/src/ui/Menu.hpp:10:8: note: forward declaration of 'struct rack::ui::Menu'
   10 | struct Menu;
      |        ^~~~
/Users/ericgao/Documents/Projects/ports/FrozenWasteland/FrozenWasteland/src/ui/Menu.hpp:57:29: error: invalid use of incomplete type 'struct rack::ui::Menu'
   57 |                         menu->addChild(new OptionMenuItem(item));
      |                             ^~
/Users/ericgao/Documents/Projects/ports/FrozenWasteland/FrozenWasteland/src/ui/Menu.hpp:10:8: note: forward declaration of 'struct rack::ui::Menu'
   10 | struct Menu;
      |        ^~~~
In file included from /Users/ericgao/Documents/Projects/ports/metamodule-plugin-sdk/metamodule-rack-interface/include/rack.hpp:26:
/Users/ericgao/Documents/Projects/ports/metamodule-plugin-sdk/metamodule-rack-interface/include/helpers.hpp: In member function 'rack::ui::Menu* rack::createSubmenuItem(std::string, std::string, std::function<void(ui::Menu*)>, bool)::Item::createChildMenu()':
/Users/ericgao/Documents/Projects/ports/metamodule-plugin-sdk/metamodule-rack-interface/include/helpers.hpp:328:46: error: invalid use of incomplete type 'struct rack::ui::Menu'
  328 |                         auto *menu = new ui::Menu;
      |                                              ^~~~
/Users/ericgao/Documents/Projects/ports/FrozenWasteland/FrozenWasteland/src/ui/Menu.hpp:10:8: note: forward declaration of 'struct rack::ui::Menu'
   10 | struct Menu;
      |        ^~~~
/Users/ericgao/Documents/Projects/ports/metamodule-plugin-sdk/metamodule-rack-interface/include/helpers.hpp: In member function 'rack::ui::Menu* rack::createSubmenuItem(std::string, std::function<std::__cxx11::basic_string<char>()>, std::function<void(ui::Menu*)>, bool)::Item::createChildMenu()':
/Users/ericgao/Documents/Projects/ports/metamodule-plugin-sdk/metamodule-rack-interface/include/helpers.hpp:374:46: error: invalid use of incomplete type 'struct rack::ui::Menu'
  374 |                         auto *menu = new ui::Menu;
      |                                              ^~~~
/Users/ericgao/Documents/Projects/ports/FrozenWasteland/FrozenWasteland/src/ui/Menu.hpp:10:8: note: forward declaration of 'struct rack::ui::Menu'
   10 | struct Menu;
      |        ^~~~
/Users/ericgao/Documents/Projects/ports/metamodule-plugin-sdk/metamodule-rack-interface/include/helpers.hpp: In member function 'rack::ui::Menu* rack::createIndexSubmenuItem(std::string, std::vector<std::__cxx11::basic_string<char> >, std::function<unsigned int()>, std::function<void(unsigned int)>, bool, bool)::Item::createChildMenu()':
/Users/ericgao/Documents/Projects/ports/metamodule-plugin-sdk/metamodule-rack-interface/include/helpers.hpp:444:46: error: invalid use of incomplete type 'struct rack::ui::Menu'
  444 |                         auto *menu = new ui::Menu;
      |                                              ^~~~
/Users/ericgao/Documents/Projects/ports/FrozenWasteland/FrozenWasteland/src/ui/Menu.hpp:10:8: note: forward declaration of 'struct rack::ui::Menu'
   10 | struct Menu;
      |        ^~~~
ninja: build stopped: subcommand failed.
(base) ericgao@Erics-MBP-2 FrozenWasteland % cmake -B build -G Ninja -DTOOLCHAIN_BASE_DIR=/Applications/ArmGNUToolchain/12.3.rel1/arm-none-eabi/bin; cmake --build build
-- Configuring done (0.1s)
-- Generating done (0.1s)
-- Build files have been written to: /Users/ericgao/Documents/Projects/ports/FrozenWasteland/build
[1/7] Building CXX object CMakeFiles/FrozenWasteland.dir/FrozenWasteland/src/BPMLFO.cpp.obj
FAILED: CMakeFiles/FrozenWasteland.dir/FrozenWasteland/src/BPMLFO.cpp.obj 
/Applications/ArmGNUToolchain/12.3.rel1/arm-none-eabi/bin/arm-none-eabi-g++ -DMETAMODULE -D__PLUGIN -D__V1x -I/Users/ericgao/Documents/Projects/ports/FrozenWasteland/FrozenWasteland -I/Users/ericgao/Documents/Projects/ports/FrozenWasteland/FrozenWasteland/src -I/Users/ericgao/Documents/Projects/ports/FrozenWasteland/FrozenWasteland/dsp -I/Users/ericgao/Documents/Projects/ports/metamodule-plugin-sdk/metamodule-core-interface/. -I/Users/ericgao/Documents/Projects/ports/metamodule-plugin-sdk/metamodule-core-interface/./filesystem -I/Users/ericgao/Documents/Projects/ports/metamodule-plugin-sdk/metamodule-plugin-libc/include -I/Users/ericgao/Documents/Projects/ports/metamodule-plugin-sdk/cpputil/. -isystem /Users/ericgao/Documents/Projects/ports/metamodule-plugin-sdk/metamodule-rack-interface/include -isystem /Users/ericgao/Documents/Projects/ports/metamodule-plugin-sdk/metamodule-rack-interface/dep/include -O2 -g -DNDEBUG -std=c++23 -fdata-sections -ffunction-sections -fno-exceptions -fno-threadsafe-statics -fno-use-cxa-atexit -fvisibility=hidden -fvisibility-inlines-hidden -fno-math-errno -mcpu=cortex-a7 -mlittle-endian -mfpu=neon-vfpv4 -mfloat-abi=hard -mthumb-interwork -mno-unaligned-access -mtune=cortex-a7 -mvectorize-with-neon-quad --param l1-cache-size=32 --param l1-cache-line-size=64 --param l2-cache-size=256 -O3 -g3 -fno-common -nostdlib -nostartfiles -fno-unwind-tables -Wall -Werror=return-type -Wno-psabi -Wno-double-promotion -Wno-attributes -shared -fPIC -Wno-register -Wno-volatile -ffold-simple-inlines -MD -MT CMakeFiles/FrozenWasteland.dir/FrozenWasteland/src/BPMLFO.cpp.obj -MF CMakeFiles/FrozenWasteland.dir/FrozenWasteland/src/BPMLFO.cpp.obj.d -o CMakeFiles/FrozenWasteland.dir/FrozenWasteland/src/BPMLFO.cpp.obj -c /Users/ericgao/Documents/Projects/ports/FrozenWasteland/FrozenWasteland/src/BPMLFO.cpp
In file included from /Users/ericgao/Documents/Projects/ports/FrozenWasteland/FrozenWasteland/src/ui/Menu.hpp:9,
                 from /Users/ericgao/Documents/Projects/ports/metamodule-plugin-sdk/metamodule-rack-interface/include/app/ParamWidget.hpp:5,
                 from /Users/ericgao/Documents/Projects/ports/metamodule-plugin-sdk/metamodule-rack-interface/include/app/Knob.hpp:3,
                 from /Users/ericgao/Documents/Projects/ports/metamodule-plugin-sdk/metamodule-rack-interface/include/app/SvgKnob.hpp:3,
                 from /Users/ericgao/Documents/Projects/ports/metamodule-plugin-sdk/metamodule-rack-interface/include/componentlibrary.hpp:4,
                 from /Users/ericgao/Documents/Projects/ports/metamodule-plugin-sdk/metamodule-rack-interface/include/rack.hpp:24,
                 from /Users/ericgao/Documents/Projects/ports/FrozenWasteland/FrozenWasteland/src/FrozenWasteland.hpp:1,
                 from /Users/ericgao/Documents/Projects/ports/FrozenWasteland/FrozenWasteland/src/BPMLFO.cpp:2:
/Users/ericgao/Documents/Projects/ports/metamodule-plugin-sdk/metamodule-rack-interface/include/ui/MenuItem.hpp:23:17: error: 'Menu' does not name a type
   23 |         virtual Menu* createChildMenu() {
      |                 ^~~~
/Users/ericgao/Documents/Projects/ports/FrozenWasteland/FrozenWasteland/src/ui/Menu.hpp: In member function 'rack::ui::MenuItem* OptionMenuItem::createMenuItem()':
/Users/ericgao/Documents/Projects/ports/FrozenWasteland/FrozenWasteland/src/ui/Menu.hpp:41:51: error: 'event' in namespace 'rack' does not name a type
   41 |                         void onAction(const rack::event::Action& e) override {
      |                                                   ^~~~~
/Users/ericgao/Documents/Projects/ports/FrozenWasteland/FrozenWasteland/src/ui/Menu.hpp:41:64: error: expected unqualified-id before '&' token
   41 |                         void onAction(const rack::event::Action& e) override {
      |                                                                ^
/Users/ericgao/Documents/Projects/ports/FrozenWasteland/FrozenWasteland/src/ui/Menu.hpp:41:64: error: expected ')' before '&' token
/Users/ericgao/Documents/Projects/ports/FrozenWasteland/FrozenWasteland/src/ui/Menu.hpp:41:38: note: to match this '('
   41 |                         void onAction(const rack::event::Action& e) override {
      |                                      ^
/Users/ericgao/Documents/Projects/ports/FrozenWasteland/FrozenWasteland/src/ui/Menu.hpp:41:64: error: expected ';' at end of member declaration
   41 |                         void onAction(const rack::event::Action& e) override {
      |                                                                ^
      |                                                                 ;
/Users/ericgao/Documents/Projects/ports/FrozenWasteland/FrozenWasteland/src/ui/Menu.hpp:41:66: error: 'e' does not name a type
   41 |                         void onAction(const rack::event::Action& e) override {
      |                                                                  ^
/Users/ericgao/Documents/Projects/ports/FrozenWasteland/FrozenWasteland/src/ui/Menu.hpp: At global scope:
/Users/ericgao/Documents/Projects/ports/FrozenWasteland/FrozenWasteland/src/ui/Menu.hpp:100:54: error: 'rack::ui::Menu' has not been declared
  100 |         static void addToMenu(OptionsMenuItem* item, rack::ui::Menu* menu) {
      |                                                      ^~~~
/Users/ericgao/Documents/Projects/ports/FrozenWasteland/FrozenWasteland/src/ui/Menu.hpp: In member function 'rack::ui::MenuItem* OptionsMenuItem::createMenuItem()':
/Users/ericgao/Documents/Projects/ports/FrozenWasteland/FrozenWasteland/src/ui/Menu.hpp:84:35: error: 'Menu' in namespace 'rack::ui' does not name a type
   84 |                         rack::ui::Menu* createChildMenu() override {
      |                                   ^~~~
/Users/ericgao/Documents/Projects/ports/FrozenWasteland/FrozenWasteland/src/ui/Menu.hpp: In static member function 'static void OptionsMenuItem::addToMenu(OptionsMenuItem*, int*)':
/Users/ericgao/Documents/Projects/ports/FrozenWasteland/FrozenWasteland/src/ui/Menu.hpp:101:23: error: request for member 'addChild' in '* menu', which is of non-class type 'int'
  101 |                 menu->addChild(item->createMenuItem());
      |                       ^~~~~~~~
/Users/ericgao/Documents/Projects/ports/metamodule-plugin-sdk/metamodule-rack-interface/include/app/ParamWidget.hpp: At global scope:
/Users/ericgao/Documents/Projects/ports/metamodule-plugin-sdk/metamodule-rack-interface/include/app/ParamWidget.hpp:45:40: error: 'rack::ui::Menu' has not been declared
   45 |         virtual void appendContextMenu(ui::Menu* menu) {}
      |                                        ^~
In file included from /Users/ericgao/Documents/Projects/ports/metamodule-plugin-sdk/metamodule-rack-interface/include/rack.hpp:26:
/Users/ericgao/Documents/Projects/ports/metamodule-plugin-sdk/metamodule-rack-interface/include/helpers.hpp: In member function 'rack::ui::Menu* rack::createSubmenuItem(std::string, std::string, std::function<void(ui::Menu*)>, bool)::Item::createChildMenu()':
/Users/ericgao/Documents/Projects/ports/metamodule-plugin-sdk/metamodule-rack-interface/include/helpers.hpp:328:46: error: invalid use of incomplete type 'struct rack::ui::Menu'
  328 |                         auto *menu = new ui::Menu;
      |                                              ^~~~
In file included from /Users/ericgao/Documents/Projects/ports/metamodule-plugin-sdk/metamodule-rack-interface/include/engine/Module.hpp:14,
                 from /Users/ericgao/Documents/Projects/ports/metamodule-plugin-sdk/metamodule-rack-interface/include/app/PortWidget.hpp:5,
                 from /Users/ericgao/Documents/Projects/ports/metamodule-plugin-sdk/metamodule-rack-interface/include/app/SvgPort.hpp:3,
                 from /Users/ericgao/Documents/Projects/ports/metamodule-plugin-sdk/metamodule-rack-interface/include/componentlibrary.hpp:6:
/Users/ericgao/Documents/Projects/ports/metamodule-plugin-sdk/metamodule-rack-interface/include/plugin/Model.hpp:14:8: note: forward declaration of 'struct rack::ui::Menu'
   14 | struct Menu;
      |        ^~~~
/Users/ericgao/Documents/Projects/ports/metamodule-plugin-sdk/metamodule-rack-interface/include/helpers.hpp: In member function 'rack::ui::Menu* rack::createSubmenuItem(std::string, std::function<std::__cxx11::basic_string<char>()>, std::function<void(ui::Menu*)>, bool)::Item::createChildMenu()':
/Users/ericgao/Documents/Projects/ports/metamodule-plugin-sdk/metamodule-rack-interface/include/helpers.hpp:374:46: error: invalid use of incomplete type 'struct rack::ui::Menu'
  374 |                         auto *menu = new ui::Menu;
      |                                              ^~~~
/Users/ericgao/Documents/Projects/ports/metamodule-plugin-sdk/metamodule-rack-interface/include/plugin/Model.hpp:14:8: note: forward declaration of 'struct rack::ui::Menu'
   14 | struct Menu;
      |        ^~~~
/Users/ericgao/Documents/Projects/ports/metamodule-plugin-sdk/metamodule-rack-interface/include/helpers.hpp: In member function 'rack::ui::Menu* rack::createIndexSubmenuItem(std::string, std::vector<std::__cxx11::basic_string<char> >, std::function<unsigned int()>, std::function<void(unsigned int)>, bool, bool)::Item::createChildMenu()':
/Users/ericgao/Documents/Projects/ports/metamodule-plugin-sdk/metamodule-rack-interface/include/helpers.hpp:444:46: error: invalid use of incomplete type 'struct rack::ui::Menu'
  444 |                         auto *menu = new ui::Menu;
      |                                              ^~~~
/Users/ericgao/Documents/Projects/ports/metamodule-plugin-sdk/metamodule-rack-interface/include/plugin/Model.hpp:14:8: note: forward declaration of 'struct rack::ui::Menu'
   14 | struct Menu;
      |        ^~~~
ninja: build stopped: subcommand failed.
(base) ericgao@Erics-MBP-2 FrozenWasteland % cmake -B build -G Ninja -DTOOLCHAIN_BASE_DIR=/Applications/ArmGNUToolchain/12.3.rel1/arm-none-eabi/bin; cmake --build build
-- Configuring done (0.1s)
-- Generating done (0.1s)
-- Build files have been written to: /Users/ericgao/Documents/Projects/ports/FrozenWasteland/build
[1/7] Building CXX object CMakeFiles/FrozenWasteland.dir/FrozenWasteland/src/BPMLFO.cpp.obj
FAILED: CMakeFiles/FrozenWasteland.dir/FrozenWasteland/src/BPMLFO.cpp.obj 
/Applications/ArmGNUToolchain/12.3.rel1/arm-none-eabi/bin/arm-none-eabi-g++ -DMETAMODULE -D__PLUGIN -D__V1x -I/Users/ericgao/Documents/Projects/ports/FrozenWasteland/FrozenWasteland -I/Users/ericgao/Documents/Projects/ports/FrozenWasteland/FrozenWasteland/src -I/Users/ericgao/Documents/Projects/ports/FrozenWasteland/FrozenWasteland/dsp -I/Users/ericgao/Documents/Projects/ports/metamodule-plugin-sdk/metamodule-core-interface/. -I/Users/ericgao/Documents/Projects/ports/metamodule-plugin-sdk/metamodule-core-interface/./filesystem -I/Users/ericgao/Documents/Projects/ports/metamodule-plugin-sdk/metamodule-plugin-libc/include -I/Users/ericgao/Documents/Projects/ports/metamodule-plugin-sdk/cpputil/. -isystem /Users/ericgao/Documents/Projects/ports/metamodule-plugin-sdk/metamodule-rack-interface/include -isystem /Users/ericgao/Documents/Projects/ports/metamodule-plugin-sdk/metamodule-rack-interface/dep/include -O2 -g -DNDEBUG -std=c++23 -fdata-sections -ffunction-sections -fno-exceptions -fno-threadsafe-statics -fno-use-cxa-atexit -fvisibility=hidden -fvisibility-inlines-hidden -fno-math-errno -mcpu=cortex-a7 -mlittle-endian -mfpu=neon-vfpv4 -mfloat-abi=hard -mthumb-interwork -mno-unaligned-access -mtune=cortex-a7 -mvectorize-with-neon-quad --param l1-cache-size=32 --param l1-cache-line-size=64 --param l2-cache-size=256 -O3 -g3 -fno-common -nostdlib -nostartfiles -fno-unwind-tables -Wall -Werror=return-type -Wno-psabi -Wno-double-promotion -Wno-attributes -shared -fPIC -Wno-register -Wno-volatile -ffold-simple-inlines -MD -MT CMakeFiles/FrozenWasteland.dir/FrozenWasteland/src/BPMLFO.cpp.obj -MF CMakeFiles/FrozenWasteland.dir/FrozenWasteland/src/BPMLFO.cpp.obj.d -o CMakeFiles/FrozenWasteland.dir/FrozenWasteland/src/BPMLFO.cpp.obj -c /Users/ericgao/Documents/Projects/ports/FrozenWasteland/FrozenWasteland/src/BPMLFO.cpp
In file included from /Users/ericgao/Documents/Projects/ports/metamodule-plugin-sdk/metamodule-rack-interface/include/app/ParamWidget.hpp:5,
                 from /Users/ericgao/Documents/Projects/ports/metamodule-plugin-sdk/metamodule-rack-interface/include/app/Knob.hpp:3,
                 from /Users/ericgao/Documents/Projects/ports/metamodule-plugin-sdk/metamodule-rack-interface/include/app/SvgKnob.hpp:3,
                 from /Users/ericgao/Documents/Projects/ports/metamodule-plugin-sdk/metamodule-rack-interface/include/componentlibrary.hpp:4,
                 from /Users/ericgao/Documents/Projects/ports/metamodule-plugin-sdk/metamodule-rack-interface/include/rack.hpp:24,
                 from /Users/ericgao/Documents/Projects/ports/FrozenWasteland/FrozenWasteland/src/FrozenWasteland.hpp:1,
                 from /Users/ericgao/Documents/Projects/ports/FrozenWasteland/FrozenWasteland/src/BPMLFO.cpp:2:
/Users/ericgao/Documents/Projects/ports/FrozenWasteland/FrozenWasteland/src/ui/Menu.hpp:7:34: error: expected class-name before '{' token
    7 | struct OptionMenuItem : MenuItem {
      |                                  ^
/Users/ericgao/Documents/Projects/ports/FrozenWasteland/FrozenWasteland/src/ui/Menu.hpp:18:14: error: 'void OptionMenuItem::onAction(const event::Action&)' marked 'override', but does not override
   18 |         void onAction(const event::Action& e) override {
      |              ^~~~~~~~
/Users/ericgao/Documents/Projects/ports/FrozenWasteland/FrozenWasteland/src/ui/Menu.hpp:22:14: error: 'void OptionMenuItem::step()' marked 'override', but does not override
   22 |         void step() override {
      |              ^~~~
/Users/ericgao/Documents/Projects/ports/FrozenWasteland/FrozenWasteland/src/ui/Menu.hpp: In constructor 'OptionMenuItem::OptionMenuItem(const char*, std::function<bool()>, std::function<void()>)':
/Users/ericgao/Documents/Projects/ports/FrozenWasteland/FrozenWasteland/src/ui/Menu.hpp:15:23: error: 'struct OptionMenuItem' has no member named 'text'
   15 |                 this->text = label;
      |                       ^~~~
/Users/ericgao/Documents/Projects/ports/FrozenWasteland/FrozenWasteland/src/ui/Menu.hpp: In member function 'void OptionMenuItem::step()':
/Users/ericgao/Documents/Projects/ports/FrozenWasteland/FrozenWasteland/src/ui/Menu.hpp:23:17: error: 'MenuItem' has not been declared
   23 |                 MenuItem::step();
      |                 ^~~~~~~~
/Users/ericgao/Documents/Projects/ports/FrozenWasteland/FrozenWasteland/src/ui/Menu.hpp:24:17: error: 'rightText' was not declared in this scope
   24 |                 rightText = _check() ? "✔" : "";
      |                 ^~~~~~~~~
/Users/ericgao/Documents/Projects/ports/FrozenWasteland/FrozenWasteland/src/ui/Menu.hpp: At global scope:
/Users/ericgao/Documents/Projects/ports/FrozenWasteland/FrozenWasteland/src/ui/Menu.hpp:34:35: error: expected class-name before '{' token
   34 | struct OptionsMenuItem : MenuItem {
      |                                   ^
/Users/ericgao/Documents/Projects/ports/FrozenWasteland/FrozenWasteland/src/ui/Menu.hpp:46:9: error: 'Menu' does not name a type
   46 |         Menu* createChildMenu() override {
      |         ^~~~
/Users/ericgao/Documents/Projects/ports/FrozenWasteland/FrozenWasteland/src/ui/Menu.hpp:54:54: error: 'Menu' has not been declared
   54 |         static void addToMenu(OptionsMenuItem* item, Menu* menu);
      |                                                      ^~~~
/Users/ericgao/Documents/Projects/ports/FrozenWasteland/FrozenWasteland/src/ui/Menu.hpp: In constructor 'OptionsMenuItem::OptionsMenuItem(const char*)':
/Users/ericgao/Documents/Projects/ports/FrozenWasteland/FrozenWasteland/src/ui/Menu.hpp:38:23: error: 'struct OptionsMenuItem' has no member named 'text'
   38 |                 this->text = label;
      |                       ^~~~
/Users/ericgao/Documents/Projects/ports/FrozenWasteland/FrozenWasteland/src/ui/Menu.hpp:39:23: error: 'struct OptionsMenuItem' has no member named 'rightText'
   39 |                 this->rightText = "▸";
      |                       ^~~~~~~~~
/Users/ericgao/Documents/Projects/ports/metamodule-plugin-sdk/metamodule-rack-interface/include/app/ParamWidget.hpp: At global scope:
/Users/ericgao/Documents/Projects/ports/metamodule-plugin-sdk/metamodule-rack-interface/include/app/ParamWidget.hpp:45:40: error: 'rack::ui::Menu' has not been declared
   45 |         virtual void appendContextMenu(ui::Menu* menu) {}
      |                                        ^~
In file included from /Users/ericgao/Documents/Projects/ports/metamodule-plugin-sdk/metamodule-rack-interface/include/rack.hpp:26:
/Users/ericgao/Documents/Projects/ports/metamodule-plugin-sdk/metamodule-rack-interface/include/helpers.hpp: In member function 'rack::ui::Menu* rack::createSubmenuItem(std::string, std::string, std::function<void(ui::Menu*)>, bool)::Item::createChildMenu()':
/Users/ericgao/Documents/Projects/ports/metamodule-plugin-sdk/metamodule-rack-interface/include/helpers.hpp:328:46: error: invalid use of incomplete type 'struct rack::ui::Menu'
  328 |                         auto *menu = new ui::Menu;
      |                                              ^~~~
In file included from /Users/ericgao/Documents/Projects/ports/metamodule-plugin-sdk/metamodule-rack-interface/include/engine/Module.hpp:14,
                 from /Users/ericgao/Documents/Projects/ports/metamodule-plugin-sdk/metamodule-rack-interface/include/app/PortWidget.hpp:5,
                 from /Users/ericgao/Documents/Projects/ports/metamodule-plugin-sdk/metamodule-rack-interface/include/app/SvgPort.hpp:3,
                 from /Users/ericgao/Documents/Projects/ports/metamodule-plugin-sdk/metamodule-rack-interface/include/componentlibrary.hpp:6:
/Users/ericgao/Documents/Projects/ports/metamodule-plugin-sdk/metamodule-rack-interface/include/plugin/Model.hpp:14:8: note: forward declaration of 'struct rack::ui::Menu'
   14 | struct Menu;
      |        ^~~~
/Users/ericgao/Documents/Projects/ports/metamodule-plugin-sdk/metamodule-rack-interface/include/helpers.hpp: In member function 'rack::ui::Menu* rack::createSubmenuItem(std::string, std::function<std::__cxx11::basic_string<char>()>, std::function<void(ui::Menu*)>, bool)::Item::createChildMenu()':
/Users/ericgao/Documents/Projects/ports/metamodule-plugin-sdk/metamodule-rack-interface/include/helpers.hpp:374:46: error: invalid use of incomplete type 'struct rack::ui::Menu'
  374 |                         auto *menu = new ui::Menu;
      |                                              ^~~~
/Users/ericgao/Documents/Projects/ports/metamodule-plugin-sdk/metamodule-rack-interface/include/plugin/Model.hpp:14:8: note: forward declaration of 'struct rack::ui::Menu'
   14 | struct Menu;
      |        ^~~~
/Users/ericgao/Documents/Projects/ports/metamodule-plugin-sdk/metamodule-rack-interface/include/helpers.hpp: In member function 'rack::ui::Menu* rack::createIndexSubmenuItem(std::string, std::vector<std::__cxx11::basic_string<char> >, std::function<unsigned int()>, std::function<void(unsigned int)>, bool, bool)::Item::createChildMenu()':
/Users/ericgao/Documents/Projects/ports/metamodule-plugin-sdk/metamodule-rack-interface/include/helpers.hpp:444:46: error: invalid use of incomplete type 'struct rack::ui::Menu'
  444 |                         auto *menu = new ui::Menu;
      |                                              ^~~~
/Users/ericgao/Documents/Projects/ports/metamodule-plugin-sdk/metamodule-rack-interface/include/plugin/Model.hpp:14:8: note: forward declaration of 'struct rack::ui::Menu'
   14 | struct Menu;
      |        ^~~~
ninja: build stopped: subcommand failed.

Ok, so that ui/Menu.hpp is getting included instead of the ui/Menu.hpp in the MM Rack interface

I can see from the build command that it’s searching
/Users/ericgao/Documents/Projects/ports/FrozenWasteland/FrozenWasteland/src

before

-isystem /Users/ericgao/Documents/Projects/ports/metamodule-plugin-sdk/metamodule-rack-interface/include

So that’s why. You could try taking out path to src in target_include_directories(), it might still work since the preprocessor will search the same path as the source file anyways.

Or change the #include “ui/Menu.hpp” to <ui/Menu.hpp> so that it’ll use the system path.