So, THAT 35000-times-faster-than-python language, mojo, released its SDK today. This means you can install Mojo in your own environment and run mojo programs.

And here in this post, I will show you how to do it on Ubuntu.

System Requirements

  • Ubuntu 20.04 and later
  • x86-64 CPU and minimum 4 GB RAM
  • Python 3.8 - 3.10
  • g++ or clang++ compiler

My environment

  • Kubuntu 22.04.3
  • AMD CPU with 16GB RAM
  • Python 3.10.12
  • g++ 11.4.0

Install steps

1. Install Modular CLI

# switch to root first
sudo -u root -i

# then run the following command
apt-get install -y apt-transport-https &&
  keyring_location=/usr/share/keyrings/modular-installer-archive-keyring.gpg &&
  curl -1sLf 'https://dl.modular.com/bBNWiLZX5igwHXeu/installer/gpg.0E4925737A3895AD.key' |  gpg --dearmor >> ${keyring_location} &&
  curl -1sLf 'https://dl.modular.com/bBNWiLZX5igwHXeu/installer/config.deb.txt?distro=debian&codename=wheezy' > /etc/apt/sources.list.d/modular-installer.list &&
  apt-get update &&
  apt-get install -y modular

# switch back to normal user
exit

2. Verify modular is installed

which modular

/usr/bin/modular

3. Install Mojo SDK

modular auth <YOUR AUTH KEY> && modular install mojo
# Found release for https://packages.modular.com/mojo @ 0.2.1, installing to /home/******/.modular/pkg/packages.modular.com_mojo
# Downloads complete, setting configs...
# Configs complete, running post-install hooks...

..................<OMITTED>

Successfully installed ansiwrap-0.8.4 attrs-23.1.0 certifi-2023.7.22 charset-normalizer-3.2.0 entrypoints-0.4 fastjsonschema-2.18.0 find_libpython-0.3.0 idna-3.4 jsonschema-4.19.0 jsonschema-specifications-2023.7.1 jupyter-core-5.3.1 jupyter_client-8.3.1 nbclient-0.8.0 nbformat-5.9.2 papermill-2.4.0 platformdirs-3.10.0 python-dateutil-2.8.2 pyzmq-25.1.1 referencing-0.30.2 requests-2.31.0 rpds-py-0.10.2 tenacity-8.2.3 textwrap3-0.9.2 tornado-6.3.3 tqdm-4.66.1 traitlets-5.9.0 urllib3-2.0.4
WARNING: Running pip as the 'root' user can result in broken permissions and conflicting behaviour with the system package manager. It is recommended to use a virtual environment instead: https://pip.pypa.io/warnings/venv
Testing `MODULAR_HOME=/home/******/.modular`
* `/home/******/.modular/pkg/packages.modular.com_mojo/bin/mojo`...
TEST: `mojo --help`... OK
TEST: `mojo run --help`... OK
TEST: `mojo build test_mandelbrot.mojo`... OK
TEST: `mojo build test_python.mojo`... OK
TEST: `mojo demangle`... OK
TEST: `mojo format`... OK
TEST: `mojo package`... OK
TEST: `mojo test_mandelbrot.mojo`... OK
TEST: `mojo test_python.mojo`... OK
TEST: `mojo repl`... OK

๐Ÿ”ฅ Mojo installed! ๐Ÿ”ฅ

Now run the following commands if you are using bash:

echo 'export MODULAR_HOME="/home/******/.modular"' >> ~/.bashrc
echo 'export PATH="/home/******/.modular/pkg/packages.modular.com_mojo/bin:$PATH"' >> ~/.bashrc
source ~/.bashrc

If you are using ZSH, run the following commands:

echo 'export MODULAR_HOME="/home/******/.modular"' >> ~/.zshrc
echo 'export PATH="/home/******/.modular/pkg/packages.modular.com_mojo/bin:$PATH"' >> ~/.zshrc
source ~/.zshrc

Then enter 'mojo' to start the Mojo REPL.

For tool help, enter 'mojo --help'.
For more docs, see https://docs.modular.com/mojo.

4. Add mojo to PATH

# You must replace two <USERNAME> with your own username
echo 'export MODULAR_HOME="/home/<USERNAME>/.modular"' >> ~/.bashrc

echo 'export PATH="/home/<USERNAME>/.modular/pkg/packages.modular.com_mojo/bin:$PATH"' >> ~/.bashrc

source ~/.bashrc

Now verify mojo command is accesible:

which mojo

/home/******/.modular/pkg/packages.modular.com_mojo/bin/mojo

5. Mojo REPL

mojo

Welcome to Mojo! ๐Ÿ”ฅ Expressions are delimited by a blank line. Type :mojo help for further assistance.

Bonus Round: directory structure

tree $MODULAR_HOME
/home/******/.modular
โ”œโ”€โ”€ crashdb
โ”‚   โ”œโ”€โ”€ attachments
โ”‚   โ”œโ”€โ”€ completed
โ”‚   โ”œโ”€โ”€ new
โ”‚   โ”œโ”€โ”€ pending
โ”‚   โ””โ”€โ”€ settings.dat
โ”œโ”€โ”€ modular.cfg
โ””โ”€โ”€ pkg
    โ””โ”€โ”€ packages.modular.com_mojo
        โ”œโ”€โ”€ bin
        โ”‚   โ”œโ”€โ”€ lldb
        โ”‚   โ”œโ”€โ”€ lldb-argdumper
        โ”‚   โ”œโ”€โ”€ lldb-server
        โ”‚   โ”œโ”€โ”€ lldb-vscode
        โ”‚   โ”œโ”€โ”€ modular-crashpad-handler
        โ”‚   โ”œโ”€โ”€ mojo
        โ”‚   โ””โ”€โ”€ mojo-lsp-server
        โ”œโ”€โ”€ installed.json
        โ”œโ”€โ”€ jupyter
        โ”‚   โ”œโ”€โ”€ kernel
        โ”‚   โ”‚   โ”œโ”€โ”€ logo-64x64.png
        โ”‚   โ”‚   โ”œโ”€โ”€ logo.svg
        โ”‚   โ”‚   โ””โ”€โ”€ mojokernel.py
        โ”‚   โ””โ”€โ”€ manage_kernel.py
        โ”œโ”€โ”€ lib
        โ”‚   โ”œโ”€โ”€ libKGENCompilerRTShared.so -> /home/******/.modular/pkg/packages.modular.com_mojo/lib/libKGENCompilerRTShared.so.18git
        โ”‚   โ”œโ”€โ”€ libKGENCompilerRTShared.so.18git
        โ”‚   โ”œโ”€โ”€ libKGENCompilerRT-static.a
        โ”‚   โ”œโ”€โ”€ libLLCLRuntimeGlobals.so -> /home/******/.modular/pkg/packages.modular.com_mojo/lib/libLLCLRuntimeGlobals.so.18git
        โ”‚   โ”œโ”€โ”€ libLLCLRuntimeGlobals.so.18git
        โ”‚   โ”œโ”€โ”€ liblldb.so -> /home/******/.modular/pkg/packages.modular.com_mojo/lib/liblldb.so.18.0.0git
        โ”‚   โ”œโ”€โ”€ liblldb.so.18.0.0git
        โ”‚   โ”œโ”€โ”€ liblldb.so.18git -> /home/******/.modular/pkg/packages.modular.com_mojo/lib/liblldb.so.18.0.0git
        โ”‚   โ”œโ”€โ”€ libMojoJupyter.so -> /home/******/.modular/pkg/packages.modular.com_mojo/lib/libMojoJupyter.so.18git
        โ”‚   โ”œโ”€โ”€ libMojoJupyter.so.18git
        โ”‚   โ”œโ”€โ”€ libMojoLLDB.so -> /home/******/.modular/pkg/packages.modular.com_mojo/lib/libMojoLLDB.so.18git
        โ”‚   โ”œโ”€โ”€ libMojoLLDB.so.18git
        โ”‚   โ”œโ”€โ”€ libMSupportGlobals.so -> /home/******/.modular/pkg/packages.modular.com_mojo/lib/libMSupportGlobals.so.18git
        โ”‚   โ”œโ”€โ”€ libMSupportGlobals.so.18git
        โ”‚   โ”œโ”€โ”€ liborc_rt.a
        โ”‚   โ”œโ”€โ”€ lldb-visualizers
        โ”‚   โ”‚   โ”œโ”€โ”€ lldbDataFormatters.py
        โ”‚   โ”‚   โ””โ”€โ”€ mlirDataFormatters.py
        โ”‚   โ”œโ”€โ”€ mblack
        โ”‚   โ”‚   โ”œโ”€โ”€ base_library.zip
        โ”‚   โ”‚   โ”œโ”€โ”€ importlib_metadata-6.8.0.dist-info
        โ”‚   โ”‚   โ”‚   โ”œโ”€โ”€ INSTALLER
        โ”‚   โ”‚   โ”‚   โ”œโ”€โ”€ LICENSE
        โ”‚   โ”‚   โ”‚   โ”œโ”€โ”€ METADATA
        โ”‚   โ”‚   โ”‚   โ”œโ”€โ”€ RECORD
        โ”‚   โ”‚   โ”‚   โ”œโ”€โ”€ top_level.txt
        โ”‚   โ”‚   โ”‚   โ””โ”€โ”€ WHEEL
        โ”‚   โ”‚   โ”œโ”€โ”€ libbz2.so.1.0
        โ”‚   โ”‚   โ”œโ”€โ”€ libcrypto.so.1.1
        โ”‚   โ”‚   โ”œโ”€โ”€ lib-dynload
        โ”‚   โ”‚   โ”‚   โ”œโ”€โ”€ _asyncio.cpython-38-x86_64-linux-gnu.so
        โ”‚   โ”‚   โ”‚   โ”œโ”€โ”€ _bz2.cpython-38-x86_64-linux-gnu.so
        โ”‚   โ”‚   โ”‚   โ”œโ”€โ”€ _codecs_cn.cpython-38-x86_64-linux-gnu.so
        โ”‚   โ”‚   โ”‚   โ”œโ”€โ”€ _codecs_hk.cpython-38-x86_64-linux-gnu.so
        โ”‚   โ”‚   โ”‚   โ”œโ”€โ”€ _codecs_iso2022.cpython-38-x86_64-linux-gnu.so
        โ”‚   โ”‚   โ”‚   โ”œโ”€โ”€ _codecs_jp.cpython-38-x86_64-linux-gnu.so
        โ”‚   โ”‚   โ”‚   โ”œโ”€โ”€ _codecs_kr.cpython-38-x86_64-linux-gnu.so
        โ”‚   โ”‚   โ”‚   โ”œโ”€โ”€ _codecs_tw.cpython-38-x86_64-linux-gnu.so
        โ”‚   โ”‚   โ”‚   โ”œโ”€โ”€ _contextvars.cpython-38-x86_64-linux-gnu.so
        โ”‚   โ”‚   โ”‚   โ”œโ”€โ”€ _ctypes.cpython-38-x86_64-linux-gnu.so
        โ”‚   โ”‚   โ”‚   โ”œโ”€โ”€ _decimal.cpython-38-x86_64-linux-gnu.so
        โ”‚   โ”‚   โ”‚   โ”œโ”€โ”€ _hashlib.cpython-38-x86_64-linux-gnu.so
        โ”‚   โ”‚   โ”‚   โ”œโ”€โ”€ _json.cpython-38-x86_64-linux-gnu.so
        โ”‚   โ”‚   โ”‚   โ”œโ”€โ”€ _lzma.cpython-38-x86_64-linux-gnu.so
        โ”‚   โ”‚   โ”‚   โ”œโ”€โ”€ mmap.cpython-38-x86_64-linux-gnu.so
        โ”‚   โ”‚   โ”‚   โ”œโ”€โ”€ _multibytecodec.cpython-38-x86_64-linux-gnu.so
        โ”‚   โ”‚   โ”‚   โ”œโ”€โ”€ _multiprocessing.cpython-38-x86_64-linux-gnu.so
        โ”‚   โ”‚   โ”‚   โ”œโ”€โ”€ _opcode.cpython-38-x86_64-linux-gnu.so
        โ”‚   โ”‚   โ”‚   โ”œโ”€โ”€ _posixshmem.cpython-38-x86_64-linux-gnu.so
        โ”‚   โ”‚   โ”‚   โ”œโ”€โ”€ _queue.cpython-38-x86_64-linux-gnu.so
        โ”‚   โ”‚   โ”‚   โ”œโ”€โ”€ resource.cpython-38-x86_64-linux-gnu.so
        โ”‚   โ”‚   โ”‚   โ”œโ”€โ”€ _ssl.cpython-38-x86_64-linux-gnu.so
        โ”‚   โ”‚   โ”‚   โ”œโ”€โ”€ termios.cpython-38-x86_64-linux-gnu.so
        โ”‚   โ”‚   โ”‚   โ””โ”€โ”€ _uuid.cpython-38-x86_64-linux-gnu.so
        โ”‚   โ”‚   โ”œโ”€โ”€ libexpat.so.1
        โ”‚   โ”‚   โ”œโ”€โ”€ libffi.so.7
        โ”‚   โ”‚   โ”œโ”€โ”€ liblzma.so.5
        โ”‚   โ”‚   โ”œโ”€โ”€ libmpdec.so.2
        โ”‚   โ”‚   โ”œโ”€โ”€ libpython3.8.so.1.0
        โ”‚   โ”‚   โ”œโ”€โ”€ libssl.so.1.1
        โ”‚   โ”‚   โ”œโ”€โ”€ libuuid.so.1
        โ”‚   โ”‚   โ”œโ”€โ”€ libz.so.1
        โ”‚   โ”‚   โ”œโ”€โ”€ mblack
        โ”‚   โ”‚   โ””โ”€โ”€ mblib2to3
        โ”‚   โ”‚       โ”œโ”€โ”€ Grammar.txt
        โ”‚   โ”‚       โ”œโ”€โ”€ __init__.py
        โ”‚   โ”‚       โ”œโ”€โ”€ LICENSE
        โ”‚   โ”‚       โ”œโ”€โ”€ PatternGrammar.txt
        โ”‚   โ”‚       โ”œโ”€โ”€ pgen2
        โ”‚   โ”‚       โ”‚   โ”œโ”€โ”€ conv.py
        โ”‚   โ”‚       โ”‚   โ”œโ”€โ”€ driver.py
        โ”‚   โ”‚       โ”‚   โ”œโ”€โ”€ grammar.py
        โ”‚   โ”‚       โ”‚   โ”œโ”€โ”€ __init__.py
        โ”‚   โ”‚       โ”‚   โ”œโ”€โ”€ literals.py
        โ”‚   โ”‚       โ”‚   โ”œโ”€โ”€ parse.py
        โ”‚   โ”‚       โ”‚   โ”œโ”€โ”€ pgen.py
        โ”‚   โ”‚       โ”‚   โ”œโ”€โ”€ tokenize.py
        โ”‚   โ”‚       โ”‚   โ””โ”€โ”€ token.py
        โ”‚   โ”‚       โ”œโ”€โ”€ pygram.py
        โ”‚   โ”‚       โ”œโ”€โ”€ pytree.py
        โ”‚   โ”‚       โ””โ”€โ”€ README
        โ”‚   โ”œโ”€โ”€ mojo
        โ”‚   โ”‚   โ”œโ”€โ”€ algorithm.mojopkg
        โ”‚   โ”‚   โ”œโ”€โ”€ autotune.mojopkg
        โ”‚   โ”‚   โ”œโ”€โ”€ base64.mojopkg
        โ”‚   โ”‚   โ”œโ”€โ”€ benchmark.mojopkg
        โ”‚   โ”‚   โ”œโ”€โ”€ builtin.mojopkg
        โ”‚   โ”‚   โ”œโ”€โ”€ complex.mojopkg
        โ”‚   โ”‚   โ”œโ”€โ”€ math.mojopkg
        โ”‚   โ”‚   โ”œโ”€โ”€ memory.mojopkg
        โ”‚   โ”‚   โ”œโ”€โ”€ os.mojopkg
        โ”‚   โ”‚   โ”œโ”€โ”€ python.mojopkg
        โ”‚   โ”‚   โ”œโ”€โ”€ random.mojopkg
        โ”‚   โ”‚   โ”œโ”€โ”€ runtime.mojopkg
        โ”‚   โ”‚   โ”œโ”€โ”€ sys.mojopkg
        โ”‚   โ”‚   โ”œโ”€โ”€ tensor.mojopkg
        โ”‚   โ”‚   โ”œโ”€โ”€ testing.mojopkg
        โ”‚   โ”‚   โ”œโ”€โ”€ time.mojopkg
        โ”‚   โ”‚   โ””โ”€โ”€ utils.mojopkg
        โ”‚   โ””โ”€โ”€ mojo-repl-entry-point
        โ”œโ”€โ”€ licenses
        โ”‚   โ”œโ”€โ”€ LICENSE
        โ”‚   โ””โ”€โ”€ Third-Party-Notices
        โ”œโ”€โ”€ modular.cfg
        โ”œโ”€โ”€ root.json
        โ”œโ”€โ”€ scripts
        โ”‚   โ””โ”€โ”€ post-install
        โ”‚       โ”œโ”€โ”€ install-dependencies.sh
        โ”‚       โ”œโ”€โ”€ pick_python.py
        โ”‚       โ”œโ”€โ”€ requirements.txt
        โ”‚       โ””โ”€โ”€ self-test.py
        โ”œโ”€โ”€ share
        โ”‚   โ””โ”€โ”€ man
        โ”‚       โ””โ”€โ”€ man1
        โ”‚           โ”œโ”€โ”€ mojo.1
        โ”‚           โ”œโ”€โ”€ mojo-build.1
        โ”‚           โ”œโ”€โ”€ mojo-demangle.1
        โ”‚           โ”œโ”€โ”€ mojo-doc.1
        โ”‚           โ”œโ”€โ”€ mojo-format.1
        โ”‚           โ”œโ”€โ”€ mojo-package.1
        โ”‚           โ”œโ”€โ”€ mojo-repl.1
        โ”‚           โ””โ”€โ”€ mojo-run.1
        โ”œโ”€โ”€ snapshot.json
        โ”œโ”€โ”€ targets.json
        โ”œโ”€โ”€ test
        โ”‚   โ”œโ”€โ”€ test_format.mojo
        โ”‚   โ”œโ”€โ”€ test_jupyter.ipynb
        โ”‚   โ”œโ”€โ”€ test_mandelbrot.mojo
        โ”‚   โ”œโ”€โ”€ test_package
        โ”‚   โ”‚   โ””โ”€โ”€ __init__.mojo
        โ”‚   โ”œโ”€โ”€ test_package_user.mojo
        โ”‚   โ””โ”€โ”€ test_python.mojo
        โ”œโ”€โ”€ timestamp.json
        โ””โ”€โ”€ VERSION

26 directories, 133 files

References