bazel ignora los argumentos del compilador utilizando –copt.
Estoy tratando de pasar argumentos del compilador al construir con bazel. Quiero desactivar todas las optimizaciones para que Bazel pueda construir un proyecto simple. De hecho, logré hacer esto sin bazel utilizando la línea de comandos de Windows con este fragmento de código:
Sin bazel:
// main.c
#include <iostream>
class Car{
public:
Car(){std::cout << "constructor por defecto llamado" << std::endl;}
Car(Car &&rhs){std::cout << "constructor de movimiento llamado" << std::endl;}
~Car(){std::cout << "destructor llamado" << std::endl;}
};
int main() {
Car a = Car();
return 0;
}
Ejecutando esto con los argumentos del compilador desde la terminal:
$ g++ main.c -O0 -fno-elide-constructors
Produce la salida deseada:
constructor por defecto llamado
constructor de movimiento llamado
destructor llamado
destructor llamado
Estaba tratando de usar este argumento para bazel y encontré esto: bandera –copt de bazel. Al construir con este comando:
Con bazel:
$ bazel build --copt="-O0" --copt="-fno-elide-constructors" main:main
Recibo la advertencia:
cl : Advertencia de línea de comandod D9002 : ignorando la opción desconocida '-O0'
cl : Advertencia de línea de comandod D9002 : ignorando la opción desconocida '-fno-elide-constructors'
Y cuando lo ejecuto con:
$ bazel-bin/main/main
Obtengo la salida:
constructor por defecto llamado
destructor llamado
Lo que significa que bazel no construyó el proyecto desactivando las optimizaciones. ¿Cómo puedo desactivar todas las optimizaciones al construir mi proyecto con bazel? ¿Estoy cometiendo un error de sintaxis? ¿Cuál podría ser el problema aquí?
Este es mi archivo BUILD en la carpeta principal:
load("@rules_cc//cc:defs.bzl", "cc_binary")
cc_binary(
name = "main",
srcs = ["main.cc"],
)
Mi versión de Windows y del compilador en caso de que pueda ayudar:
Microsoft Windows [Versión 10.0.19042.1415]
g++ (x86_64-posix-seh-rev0, construido por el proyecto MinGW-W64) 8.1.0
davy.ai
Para deshabilitar todas las optimizaciones al compilar un proyecto con Bazel utilizando el compilador g++, podemos usar la bandera
--cxxopt
en lugar de--copt
ya que es un compilador de C++.Para deshabilitar todas las optimizaciones, podemos pasar la bandera
-O0
al compilador.Entonces, para construir correctamente el objetivo principal sin optimización usando el compilador g++, se debe usar el siguiente archivo BUILD:
Luego, construye el proyecto ejecutando:
El binario resultante se puede ejecutar usando: