C++ en macOS - Integrando VSCode, Homebrew y CMake

Última actualización: 2 de octubre de 2023.

Introducción


En este post, continuación de una serie anterior dedicada a MS Windows, explicaremos cómo configurar un entorno de trabajo para proyectos de C++ en macOS basado en:
  • Homebrew [1] como package manager, a través del cual podremos instalar bibliotecas no-estándar de uso extendido en la comunidad de desarrolladores en C++ –tales como Boost [2], {fmt}lib [3], Range-v3 [4] y nlohmann-JSON [5]–, build systems como Ninja [6] y, opcionalmente, el compilador GCC.
  • Visual Studio Code [7], un editor gratuito y de código abierto –si bien la descarga oficial se realiza bajo una licencia de software propietario– desarrollado desde 2015 por Microsoft para los sistemas Linux, MS Windows y macOS. Proporciona, entre otras funcionalidades, un alto grado de configuración por parte del usuario, resaltado de sintaxis, soporte para debugging, autocompleción e información de código (IntelliSense) y control integrado de Git. Fue declarado el entorno más popular entre desarrolladores en el Stack Overflow Developer Survey de 2021.
  • CMake [8] como herramienta de construcción, prueba, distribución e instalación de proyectos ampliamente extendida en el ámbito de la programación profesional en C y C++. Nos permitirá controlar el proceso de construcción de nuestros proyectos (build process) mediante ficheros CMakeLists.txt independientes de nuestro build system nativo (como Make o Ninja).


Package manager Homebrew


Los requerimientos mínimos para poder instalar este conocido gestor de paquetes son:
  • CPU 64-bit de Intel o Apple Silicon CPU
  • macOS Catalina (10.15) o superior
  • Bourne-again shell (bash)
  • Command Line Tools (CLT) para Xcode, conjunto de herramientas que incluye el compilador Clang [9]. Si no se dispone aún de ellas, pueden obtenerse desde una ventana de la Terminal ejecutando el comando xcode-select --install
Para instalar Homebrew, ejecutaremos la instrucción siguiente desde la Terminal:

/bin/bash -c "$(curl -fsSL https://raw.githubusercontent.com/Homebrew/install/HEAD/install.sh)"

Tal y como se explica en el portal oficial de Homebrew [1], el programa de instalación indicará las acciones a realizar paso a paso, pausando su ejecución cuando sea necesario para solicitar la confirmación del usuario.

En equipos mac Intel, Homebrew quedará ubicado en /usr/local/bin/. En equipos Apple Silicon, los ficheros de Homebrew serán almacenados en la carpeta /opt/homebrew/bin/, que no es parte del PATH. En este último caso, al finalizar la instalación de Homebrew se nos solicitará que copiemos, peguemos y ejecutemos dos comandos en la terminal con el fin de incluir el package manager en el PATH (sustitúyase $USER por el nombre del usuario en cuestión):

Add Homebrew to your PATH in /Users/$USER/.zprofile:
    echo 'eval $(/opt/homebrew/bin/brew shellenv)' >> /Users/$USER/.zprofile
    eval $(/opt/homebrew/bin/brew shellenv)

A modo de nota informativa, indicar que Homebrew recopila estadísticas de instalación, errores de compilación y versión del sistema operativo a través de Google Analytics. Si no se desea participar en dicha analítica, es posible darse de baja con el comando brew analytics off (más información en [10]).


Cmake, bibliotecas de uso extendido y build system Ninja


Una vez finalizada la instalación de Homebrew, procederemos a instalar tanto el generador de build systems CMake como algunas de las bibliotecas de uso más extendido entre programadores de C++ (particulamente Boost{fmt}lib, Range-v3 y nlohmann-JSON). Para ello, ejecutaremos las instrucciones siguientes desde la Terminal:
  • brew install cmake
  • brew install boost
  • brew install fmt
  • brew install range-v3
  • brew install nlohmann-json
El build system Ninja [10] puede instalarse ejecutando el comando brew install ninja.


Compilador GCC


Es también posible instalar el compilador GCC (actualmente, en su versión 13) mediante el siguiente comando:

brew install gcc

Una vez finalizada la instalación, acudiremos a la carpeta donde se encuentren los ejecutables gcc-13 y g++-13 (/opt/homebrew/bin/ en Apple Silicon, /usr/local/bin/ en mac Intel) y crearemos los siguientes enlaces simbólicos:
  • ln -s gcc-13 gcc
  • ln -s g++-13 g++
De esta manera, al ejecutar gcc o g++ emplearemos realmente el compilador GCC en sustitución del compilador adoptado por defecto por el sistema (Clang).


Visual Studio Code


Para la instalación del editor VSCode, procederemos en la forma siguiente:

(1) Descargaremos e instalaremos el software desde el portal oficial [7]: https://code.visualstudio.com/

(2) Una vez instalado, ejecutaremos el programa. Pulsaremos la combinación de teclas Cmd+Shift+X para desplegar el menú lateral de extensiones del editor. Realizareamos la búsqueda 'C++' y seleccionaremos la herramienta (normalmente la primera en la lista) 'C/C++ IntelliSense, debugging, and code browsing [ms-vscode.cpptools]' desarrollada por Microsoft (ver imagen inferior). Pincharemos sobre 'Install' y después sobre 'Reload' para hacer efectivos los cambios.


(3) De forma similar, instalaremos las extensiones 'CMake' (autor: twxs) y 'CMake Tools' (autor: Microsoft).



(4) Finalmente, abriremos el Command Palette del editor con la combinación de teclas Cmd+Shift+P y ejecutaremos el comando >Preferences: Open Settings (JSON) (en Castellano: >Preferencias: Abrir configuración de usuario (JSON)). Añadiremos entonces, separadas por comas, las siguientes líneas al fichero settings.json:

"cmake.configureOnOpen": true,
"cmake.generator": "Ninja"

La segunda línea, en particular, establecerá Ninja de forma incondicional como build tool a utilizar.


Gestión de proyectos con CMake


El lector puede encontrar una explicación acerca de cómo crear un primer proyecto CMake de tipo 'Hello, world!' en VSCode en este post anterior (las adaptaciones necesarias a macOS relativas a la creación de un folder y la selección del compilador Clang o GCC debieran resultar inmediatas).

Finalmente, la subsección 'Ejemplo de uso' de este post proporciona un código main.cpp y un fichero de configuración CMakeLists.txt más complejos con los que poder poner a prueba la correcta instalación de algunas de las bibliotecas no-estándar señaladas anteriormente (concretamente, {fmt}lib y Range-v3).


Referencias bibliográficas
  1. Homebrew package manager - https://brew.sh/index_es
  2. Boost C++ libraries - https://www.boost.org/
  3. {fmt}lib - https://github.com/fmtlib/fmt
  4. Range-v3 - https://github.com/ericniebler/range-v3
  5. JSON for Modern C++ - https://github.com/nlohmann/json
  6. Ninja build system - https://ninja-build.org/
  7. Visual Studio Code - https://code.visualstudio.com/
  8. CMake - https://cmake.org/
  9. Clang: a C language family frontend for LLVM - https://clang.llvm.org/
  10. Homebrew - Anonymous Aggregate User Behaviour Analytics - https://github.com/Homebrew/brew/blob/master/docs/Analytics.md

2 comentarios:

  1. Al instalar Homebrew, se obtiene el siguiente warning:

    Warning: The Ruby Homebrew installer is now deprecated and has been rewritten in Bash. Please migrate to the following command:
    /bin/bash -c "$(curl -fsSL https://raw.githubusercontent.com/Homebrew/install/master/install.sh)"

    ResponderEliminar
  2. Gracias por tu indicación, Manué. En efecto, el instalador de Homebrew, originalmente implementado en Ruby, ha sido reescrito en Bash. La página oficial del package manager facilita ahora el nuevo comando de instalación basado en Bash. Saludos.

    ResponderEliminar