Skip to content

[DIY] Build from source on Apple Chip M1 using rosetta2 #726

Open
@soknifedev

Description

@soknifedev

This is not an issue, is just a tip to build the compiler and run it on Apple M1 Chip computers.

Issue description:

There were multiple people trying to build and run the compiler in macOS ARM/M1: #663 #662 #79 #76 #75 And me, of course.

Instructions

  1. First, you must install Rosetta2, open your Terminal and type:
softwareupdate --install-rosetta --agree-to-license
  1. Follow the guide Building on macOS but do not execute these commands:
cmake ../source/compiler -DCMAKE_C_FLAGS=-m32 -DCMAKE_BUILD_TYPE=Release
make
  1. We will use rosetta2 to compile a 64-bit compatible binary, in your terminal type:
arch -x86_64 zsh -l

(Note that I'm using zsh as shell, if you use bash or anything else, replace it with yours)
4. Verify that your current terminal is using rosetta:

arch

Should output:

i386
  1. Force 32-bit cells

First, modify source/amx/amx.h:
Replace this:

#if !defined PAWN_CELL_SIZE
  #define PAWN_CELL_SIZE 32     /* by default, use 32-bit cells */
#endif
#if PAWN_CELL_SIZE==16
  typedef uint16_t  ucell;
  typedef int16_t   cell;
#elif PAWN_CELL_SIZE==32
  typedef uint32_t  ucell;
  typedef int32_t   cell;
#elif PAWN_CELL_SIZE==64
  typedef uint64_t  ucell;
  typedef int64_t   cell;
#else
  #error Unsupported cell size (PAWN_CELL_SIZE)
#endif

With this:

#if !defined PAWN_CELL_SIZE
  #define PAWN_CELL_SIZE 32     /* by default, use 32-bit cells */
#endif
#if PAWN_CELL_SIZE==32
  typedef uint32_t  ucell;
  typedef int32_t   cell;
#else
  #error Unsupported cell size (PAWN_CELL_SIZE)
#endif

And now you will need to comment the line 493 of file source/amx/amx.c

assert_static(sizeof(f)<=sizeof(cell)); /* function pointer must fit in a cell */

It should look like this:

  if (amx->sysreq_d!=0) {
    /* at the point of the call, the CIP pseudo-register points directly
     * behind the SYSREQ instruction and its parameter(s)
     */
....
    // <--- HERE IS IT: I COMMENTED IT TO AVOID ERRORS ON COMPILATION ---->
    // assert_static(sizeof(f)<=sizeof(cell)); /* function pointer must fit in a cell */
    // <--- --------------------------------------------------------- ---->
....

Once you comment this line, you will be able to compile, type this in your terminal:

cmake ../source/compiler -DCMAKE_C_FLAGS=-m64 -DCMAKE_BUILD_TYPE=Release
make
  1. Once compiled, copy the files to your pawno folder, and enjoy!
  • build/pawncc
  • build/pawndisasm
  • build/libpawnc.dylib

By doing this, I was able to code and compile my scripts on M1.

Workspace Information:

  • Compiler version: Pawn compiler 3.10.10
  • Command line arguments provided (or sampctl version):
./pawno/pawncc /path/to/your/gamemodes/MyGame.pwn -Dgamemodes '-;+' '-(+' '-d3' '-Z' '-i/path/to/your/includes'
  • Operating System: macOS Ventura 13 on Apple M1

Metadata

Metadata

Assignees

No one assigned

    Labels

    No labels
    No labels

    Type

    No type

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions