neo icon indicating copy to clipboard operation
neo copied to clipboard

MAC OSX install Instructions

Open never00rei opened this issue 1 year ago • 13 comments

The OSX Install instructions are incorrect, if you're using brew to install ncurses - you should use the following flags:

export LDFLAGS="-L/usr/local/opt/ncurses/lib"
export CPPFLAGS="-I/usr/local/opt/ncurses/include"

Your README is incorrectly stating:

export LDFLAGS="-L/opt/homebrew/opt/ncurses/lib"
export CPPFLAGS="-I/opt/homebrew/opt/ncurses/include"

never00rei avatar Dec 17 '23 19:12 never00rei

To be fair, the previous instructions are for Intel Macs, while the new ones are for ARM ones. I would leave both for users to choose from

AlKhrulev avatar Mar 07 '24 22:03 AlKhrulev

@never00rei Have you succeeded in compiling for Mac with M1 series? I keep getting

ld: symbol(s) not found for architecture arm64

I tried the official release as well as cloning the repo, but the linker fails in both cases.

realhackcraft avatar Jul 10 '24 16:07 realhackcraft

@realhackcraft I've compiled for M3 Max recently without any issues. Are you using clang or gcc?

AlKhrulev avatar Jul 12 '24 14:07 AlKhrulev

@AlKhrulev I'm not sure. ~I was following the instructions on the readme and ran:~

./configure
make
sudo make install

Edit: I am using clang++.

clang++: error: linker command failed with exit code 1 (use -v to see invocation)

I'm on M2

realhackcraft avatar Jul 12 '24 20:07 realhackcraft

@realhackcraft I'm facing the same issue as you.

I'm on M2 Pro

kr4t0z avatar Jul 13 '24 02:07 kr4t0z

@realhackcraft @kr4t0z to double-check, you have downloaded a different ncurses implementation, say via Homebrew's brew install ncurses and ran all command with the following set up?

export LDFLAGS="-L/opt/homebrew/opt/ncurses/lib"
export CPPFLAGS="-I/opt/homebrew/opt/ncurses/include"

I've just placed this before ./configure; make; sudo make install in the same shell script and ran the whole thing together. Give it a try and let me know

AlKhrulev avatar Jul 13 '24 19:07 AlKhrulev

Warning: ncurses 6.5 is already installed and up-to-date.

And I made sure to run those two lines just before running ./configure

Perhaps the M2 series has some problems, or maybe because my SIP is disabled.

realhackcraft avatar Jul 14 '24 03:07 realhackcraft

Is there a way of enabling verbose mode on clang++ from the make file? I don't know which one to edit.

realhackcraft avatar Jul 14 '24 03:07 realhackcraft

@realhackcraft I've looked through the original INSTALL file, and it looks like you can pass customs compiler flags to ./configure. This is a just a sample example below:

./configure CXXFLAGS="-Os -march=native -mtune=native -DNDEBUG -fno-exceptions -ffunction-sections -fdata-sections -flto" LDFLAGS="-Wl,--gc-sections -flto" CXX="clang++"
make -j3
sudo make install-strip

I would probably assume that you can try something like ./configure CXXFLAGS="-v" CXX="clang++" to get verbose output and try to identify the problem

AlKhrulev avatar Jul 14 '24 17:07 AlKhrulev

I added the verbose output flag and tried to compile it, but it still showed clang++: error: linker command failed with exit code 1 (use -v to see invocation), so I'm not sure if ./configure CXXFLAGS="-v" CXX="clang++" made a diffrence.

Upon inspecting the error closer, it appears that _endwin$NCURSES60, _init_color$NCURSES60, _init_pair$NCURSES60 and many more ncurses function are undefined, for some reason. I have cded into /usr/local/opt/ncurses/include and confirmed that the header files are there. In the /lib directory, all the .o binaries are present too.

When I removed the LDFLAGS and CPPFLAGS, the linker complains that COLOR and various other ncurses macros are undefined, which is expected.

Full log
Making all in doc
make[1]: Nothing to be done for `all'.
Making all in src
clang++ -std=gnu++11 -DNCURSES_WIDECHAR -std=c++11 -v  -L/opt/homebrew/opt/ncurses/lib -o neo cloud.o droplet.o neo.o  -lncursesw
Apple clang version 16.0.0 (clang-1600.0.22.7)
Target: arm64-apple-darwin24.0.0
Thread model: posix
InstalledDir: /Library/Developer/CommandLineTools/usr/bin
 "/Library/Developer/CommandLineTools/usr/bin/ld" -demangle -lto_library /Library/Developer/CommandLineTools/usr/lib/libLTO.dylib -dynamic -arch arm64 -platform_version macos 15.0.0 15.0 -syslibroot /Library/Developer/CommandLineTools/SDKs/MacOSX.sdk -mllvm -enable-linkonceodr-outlining -o neo -L/opt/homebrew/opt/ncurses/lib -L/usr/local/lib cloud.o droplet.o neo.o -lncursesw -lc++ -lSystem /Library/Developer/CommandLineTools/usr/lib/clang/16/lib/darwin/libclang_rt.osx.a
Undefined symbols for architecture arm64:
  "_endwin$NCURSES60", referenced from:
      Cleanup() in neo.o
      ParseArgs(int, char**, Cloud*, double*, bool*) in neo.o
      ParseArgs(int, char**, Cloud*, double*, bool*) in neo.o
      ParseArgs(int, char**, Cloud*, double*, bool*) in neo.o
      _main in neo.o
  "_init_color$NCURSES60", referenced from:
      Cloud::SetColor(Color) in cloud.o
      Cloud::SetColor(Color) in cloud.o
      Cloud::SetColor(Color) in cloud.o
      Cloud::SetColor(Color) in cloud.o
      Cloud::SetColor(Color) in cloud.o
      Cloud::SetColor(Color) in cloud.o
      Cloud::SetColor(Color) in cloud.o
      Cloud::SetColor(Color) in cloud.o
      Cloud::SetColor(Color) in cloud.o
      Cloud::SetColor(Color) in cloud.o
      Cloud::SetColor(Color) in cloud.o
      Cloud::SetColor(Color) in cloud.o
      Cloud::SetColor(Color) in cloud.o
      Cloud::SetColor(Color) in cloud.o
      Cloud::SetColor(Color) in cloud.o
      Cloud::SetColor(Color) in cloud.o
      Cloud::SetColor(Color) in cloud.o
      Cloud::SetColor(Color) in cloud.o
      Cloud::SetColor(Color) in cloud.o
      Cloud::SetColor(Color) in cloud.o
      Cloud::SetColor(Color) in cloud.o
      Cloud::SetColor(Color) in cloud.o
      Cloud::SetColor(Color) in cloud.o
      Cloud::SetColor(Color) in cloud.o
      Cloud::SetColor(Color) in cloud.o
      Cloud::SetColor(Color) in cloud.o
      Cloud::SetColor(Color) in cloud.o
      Cloud::SetColor(Color) in cloud.o
      ...
  "_init_pair$NCURSES60", referenced from:
      Cloud::SetColor(Color) in cloud.o
      Cloud::SetColor(Color) in cloud.o
      Cloud::SetColor(Color) in cloud.o
      Cloud::SetColor(Color) in cloud.o
      Cloud::SetColor(Color) in cloud.o
      Cloud::SetColor(Color) in cloud.o
      Cloud::SetColor(Color) in cloud.o
      Cloud::SetColor(Color) in cloud.o
      Cloud::SetColor(Color) in cloud.o
      Cloud::SetColor(Color) in cloud.o
      Cloud::SetColor(Color) in cloud.o
      Cloud::SetColor(Color) in cloud.o
      Cloud::SetColor(Color) in cloud.o
      Cloud::SetColor(Color) in cloud.o
      Cloud::SetColor(Color) in cloud.o
      Cloud::SetColor(Color) in cloud.o
      Cloud::SetColor(Color) in cloud.o
      Cloud::SetColor(Color) in cloud.o
      Cloud::SetColor(Color) in cloud.o
      Cloud::SetColor(Color) in cloud.o
      Cloud::SetColor(Color) in cloud.o
      Cloud::SetColor(Color) in cloud.o
      Cloud::SetColor(Color) in cloud.o
      Cloud::SetColor(Color) in cloud.o
      Cloud::SetColor(Color) in cloud.o
      Cloud::SetColor(Color) in cloud.o
      Cloud::SetColor(Color) in cloud.o
      Cloud::SetColor(Color) in cloud.o
      Cloud::SetColor(Color) in cloud.o
      Cloud::SetColor(Color) in cloud.o
      Cloud::SetColor(Color) in cloud.o
      Cloud::SetColor(Color) in cloud.o
      Cloud::SetColor(Color) in cloud.o
      Cloud::SetColor(Color) in cloud.o
      Cloud::SetColor(Color) in cloud.o
      Cloud::SetColor(Color) in cloud.o
      Cloud::SetColor(Color) in cloud.o
      Cloud::SetColor(Color) in cloud.o
      Cloud::SetColor(Color) in cloud.o
      Cloud::SetColor(Color) in cloud.o
      Cloud::SetColor(Color) in cloud.o
      Cloud::SetColor(Color) in cloud.o
      Cloud::SetColor(Color) in cloud.o
      Cloud::SetColor(Color) in cloud.o
      Cloud::SetColor(Color) in cloud.o
      Cloud::SetColor(Color) in cloud.o
      Cloud::SetColor(Color) in cloud.o
      Cloud::SetColor(Color) in cloud.o
      Cloud::SetColor(Color) in cloud.o
      Cloud::SetColor(Color) in cloud.o
      Cloud::SetColor(Color) in cloud.o
      Cloud::SetColor(Color) in cloud.o
      Cloud::SetColor(Color) in cloud.o
      Cloud::SetColor(Color) in cloud.o
      Cloud::SetColor(Color) in cloud.o
      Cloud::SetColor(Color) in cloud.o
      Cloud::SetColor(Color) in cloud.o
      Cloud::SetColor(Color) in cloud.o
      Cloud::SetColor(Color) in cloud.o
      Cloud::SetColor(Color) in cloud.o
      Cloud::SetColor(Color) in cloud.o
      Cloud::SetColor(Color) in cloud.o
      Cloud::SetColor(Color) in cloud.o
      Cloud::SetColor(Color) in cloud.o
      Cloud::SetColor(Color) in cloud.o
      Cloud::SetColor(Color) in cloud.o
      Cloud::SetColor(Color) in cloud.o
      Cloud::SetColor(Color) in cloud.o
      Cloud::SetColor(Color) in cloud.o
      Cloud::SetColor(Color) in cloud.o
      Cloud::SetColor(Color) in cloud.o
      Cloud::SetColor(Color) in cloud.o
      Cloud::SetColor(Color) in cloud.o
      Cloud::SetColor(Color) in cloud.o
      Cloud::SetColor(Color) in cloud.o
      Cloud::SetColor(Color) in cloud.o
      Cloud::SetColor(Color) in cloud.o
      Cloud::SetColor(Color) in cloud.o
      Cloud::SetColor(Color) in cloud.o
      Cloud::SetColor(Color) in cloud.o
      Cloud::SetColor(Color) in cloud.o
      Cloud::SetColor(Color) in cloud.o
      Cloud::SetColor(Color) in cloud.o
      Cloud::SetColor(Color) in cloud.o
      Cloud::SetColor(Color) in cloud.o
      Cloud::SetColor(Color) in cloud.o
      Cloud::SetColor(Color) in cloud.o
      Cloud::SetColor(Color) in cloud.o
      Cloud::SetColor(Color) in cloud.o
      Cloud::SetColor(Color) in cloud.o
      Cloud::SetColor(Color) in cloud.o
      Cloud::SetColor(Color) in cloud.o
      Cloud::SetColor(Color) in cloud.o
      Cloud::SetColor(Color) in cloud.o
      Cloud::SetColor(Color) in cloud.o
      Cloud::SetColor(Color) in cloud.o
      Cloud::SetColor(Color) in cloud.o
      Cloud::SetColor(Color) in cloud.o
      Cloud::SetColor(Color) in cloud.o
      Cloud::SetColor(Color) in cloud.o
      Cloud::SetColor(Color) in cloud.o
      Cloud::SetColor(Color) in cloud.o
      Cloud::SetColor(Color) in cloud.o
      Cloud::SetColor(Color) in cloud.o
      Cloud::SetColor(Color) in cloud.o
      Cloud::SetColor(Color) in cloud.o
      Cloud::SetColor(Color) in cloud.o
      Cloud::SetColor(Color) in cloud.o
      Cloud::SetColor(Color) in cloud.o
      Cloud::SetColor(Color) in cloud.o
      Cloud::SetColor(Color) in cloud.o
      Cloud::SetColor(Color) in cloud.o
      Cloud::SetColor(Color) in cloud.o
      Cloud::SetColor(Color) in cloud.o
      Cloud::SetColor(Color) in cloud.o
      Cloud::SetColor(Color) in cloud.o
      Cloud::SetColor(Color) in cloud.o
      Cloud::SetColor(Color) in cloud.o
      Cloud::SetColor(Color) in cloud.o
      Cloud::SetColor(Color) in cloud.o
      ...
  "_initscr$NCURSES60", referenced from:
      InitCurses(ColorMode, ColorMode*) in neo.o
  "_keypad$NCURSES60", referenced from:
      InitCurses(ColorMode, ColorMode*) in neo.o
  "_refresh$NCURSES60", referenced from:
      InitCurses(ColorMode, ColorMode*) in neo.o
      Profiler(Cloud&) in neo.o
      MainLoop(Cloud&, double) in neo.o
  "_start_color$NCURSES60", referenced from:
      InitCurses(ColorMode, ColorMode*) in neo.o
  "_use_default_colors$NCURSES60", referenced from:
      Cloud::SetColor(Color) in cloud.o
  "_wadd_wch$NCURSES60", referenced from:
      Cloud::DrawMessage() const in cloud.o
      Droplet::Draw(std::__1::chrono::time_point<:__1::chrono::steady_clock std::__1::chrono::duration long std::__1::ratio>>>, bool) in droplet.o
      Droplet::Draw(std::__1::chrono::time_point<:__1::chrono::steady_clock std::__1::chrono::duration long std::__1::ratio>>>, bool) in droplet.o
  "_waddch$NCURSES60", referenced from:
      Droplet::Draw(std::__1::chrono::time_point<:__1::chrono::steady_clock std::__1::chrono::duration long std::__1::ratio>>>, bool) in droplet.o
  "_wattr_off$NCURSES60", referenced from:
      Cloud::DrawMessage() const in cloud.o
      Droplet::Draw(std::__1::chrono::time_point<:__1::chrono::steady_clock std::__1::chrono::duration long std::__1::ratio>>>, bool) in droplet.o
  "_wattr_on$NCURSES60", referenced from:
      Cloud::DrawMessage() const in cloud.o
      Droplet::Draw(std::__1::chrono::time_point<:__1::chrono::steady_clock std::__1::chrono::duration long std::__1::ratio>>>, bool) in droplet.o
  "_wbkgd$NCURSES60", referenced from:
      Cloud::SetColor(Color) in cloud.o
  "_wgetch$NCURSES60", referenced from:
      HandleInput(Cloud*) in neo.o
  "_winnwstr$NCURSES60", referenced from:
      Cloud::Rain() in cloud.o
      Cloud::CalcMessage() in cloud.o
ld: symbol(s) not found for architecture arm64
clang++: error: linker command failed with exit code 1 (use -v to see invocation)
make[1]: *** [neo] Error 1
make: *** [all-recursive] Error 1

realhackcraft avatar Jul 15 '24 14:07 realhackcraft

@realhackcraft @kr4t0z to double-check, you have downloaded a different ncurses implementation, say via Homebrew's brew install ncurses and ran all command with the following set up?

export LDFLAGS="-L/opt/homebrew/opt/ncurses/lib"
export CPPFLAGS="-I/opt/homebrew/opt/ncurses/include"

I've just placed this before ./configure; make; sudo make install in the same shell script and ran the whole thing together. Give it a try and let me know

Did that and just worked!!! Thanks guys, y'all are awesome

kr4t0z avatar Jul 19 '24 16:07 kr4t0z

Ok, it worked after I re cloned the repo. I think it was because the compiler puts the compiled binary into src and I didn't remove them.

realhackcraft avatar Jul 19 '24 17:07 realhackcraft

Glad to heat it got resolved, it would be sad if no one could compile this anymore on (some?) Macs.

AlKhrulev avatar Jul 19 '24 17:07 AlKhrulev