El controlador de C++ utiliza el versionado semántico (también conocido como SemVer) para la versionado de API.
Por el Especificación SemVer:
Dado un número de versión MAYOR.MENOR.PARCHE, incrementa lo siguiente:
Versión PRINCIPAL cuando realiza cambios de API incompatibles
Versión MENOR cuando agrega funcionalidad de manera compatible con versiones anteriores
Versión PATCH cuando realices correcciones de errores compatibles hacia atrás.
A los efectos del control de versiones de API, distinguimos entre la API pública y la API privada:
Para que este sistema funcione, primero debes declarar una API pública. Esto puede consistir en documentación o ser impuesto por el propio código. En cualquier caso, es importante que esta API sea clara y precisa. Una vez que se identifica la API pública, se comunican los cambios a ella con incrementos específicos en el número de versión.*
El número de la versión de la API se actualiza según SemVer y la definición de la API pública a continuación.
Importante
El número de versión de la API solo comunica la estabilidad de la API pública. Los cambios (in)compatibles con versiones anteriores de la API privada no se comunican mediante este número.
Compatibilidad de fuentes
Se instala un archivo de encabezado público en el directorio de inclusión para cualquier configuración de compilación de CMake. Cualquier otro archivo de encabezado es privado.
El espacio de nombres raíz de una biblioteca se declara en el ámbito del espacio de nombres global, por ejemplo bsoncxxTodas las entidades propiedad de la biblioteca se declaran dentro del espacio de nombres raíz de la biblioteca. Las macros de preprocesador propiedad de la biblioteca llevan como prefijo el nombre de la biblioteca, p. ej., BSONCXX_EXAMPLE_MACRO.
La API pública es el conjunto de entidades documentadas que se declaran o definen en un archivo de cabecera pública dentro del namespace raíz de la librería, con las siguientes excepciones:
La entidad está documentada explícitamente como privada o no destinada al uso público.
La entidad se declara en un namespace
detail.
Incluidas estas excepciones, todas las demás entidades se consideran parte de la API privada.
Si hay una entidad que debería estar documentada, pero actualmente no lo está, envíe un informe de error.
Importante
El comportamiento documentado de una entidad pública también se considera parte de la API pública. El comportamiento no documentado se considera indefinido a nivel de biblioteca y no se admite. Si hay algún comportamiento que debería documentarse pero que actualmente no lo está, envíe un informe de error.
Nota
Algunas entidades que forman parte de la API pública podrían no formar parte de la ABI estable. Por el contrario, algunos símbolos que forman parte de la ABI estable podrían no formar parte de la API pública. Consulte Política de versiones de ABI.
Compatibilidad del sistema de compilación
Aunque la API pública depende de la configuración del sistema de compilación, el sistema de compilación en sí NO forma parte de la API pública.
Las propiedades del sistema de compilación incluyen:
Variables de configuración de CMake y comportamiento correspondiente (con algunas excepciones: véase más abajo).
El nombre, la ubicación y el contenido de:
Archivos fuente de CMake (por ejemplo, en
${PROJECT_SOURCE_DIR}).Archivos binarios de CMake (por ejemplo, bajo
${PROJECT_BINARY_DIR}).Archivos de biblioteca instalados (por ejemplo, en
{CMAKE_INSTALL_LIBDIR}).Archivos de paquetes instalados (por ejemplo, en
{CMAKE_INSTALL_LIBDIR}/pkgconfig).
Sin embargo, las variables de configuración del sistema de compilación que impactan directamente en la API pública se consideran parte de la API pública.
Por ejemplo, los polyfills C++17 declarados en el espacio de nombres bsoncxx::stdx dependen de variables de configuración que determinan la librería de polyfills utilizada, por ejemplo, CMAKE_CXX_STANDARD, BSONCXX_POLY_USE_STD, etc. Una configuración de compilación usando CMAKE_CXX_STANDARD=17 produce una API pública donde bsoncxx::stdx::optional<T> == std::optional<T>. Dado que cambiar el tipo de bsoncxx::stdx::optional<T> de modo que ya no sea equivalente a std::optional<T> es un cambio disruptivo para la API pública, cambiar el comportamiento de selección de la librería de polyfills de CMAKE_CXX_STANDARD también es un cambio disruptivo para la API pública. Por lo tanto, se considera que CMAKE_CXX_STANDARD forma parte de la API pública.
Por otro lado, BSONCXX_OUTPUT_NAME controla el <basename> utilizado para generar los nombres de archivo de bibliotecas y paquetes. Cambiar el nombre de una biblioteca o paquete no afecta directamente a la API pública (incluso si los proyectos o aplicaciones existentes pueden fallar al configurarse, compilarse o enlazarse debido a nombres de archivo inesperados). Por lo tanto, BSONCXX_OUTPUT_NAME no se considera parte de la API pública.
Nota
Respaldamos la estabilidad de la API pública por configuración de compilación. No admitimos la compatibilidad de la API pública con diferentes configuraciones de compilación. Por ejemplo, no se espera que una API pública generada con una configuración CMAKE_BUILD_TYPE=Debug de compilación sea compatible con un programa compilado con una API pública generada con una configuración de CMAKE_BUILD_TYPE=Release compilación. (Esto es especialmente importante al usar generadores multiconfiguración como Visual Studio).
Redeclaraciones del espacio de nombres raíz
La API de las bibliotecas de controladores de C++ utiliza redeclaraciones del espacio de nombres raíz de las entidades del espacio de nombres ABI para facilitar cambios incrementales en la ABI. Para más información, consulte Redeclaraciones del espacio de nombres raíz de la ABI.
Las entidades que no forman parte de la ABI estable o de la API pública pueden declararse en el espacio de nombres raíz sin ser miembros de ningún espacio de nombres ABI en particular (por ejemplo, bsoncxx::detail).
Obsolescencia y eliminación
Antes de realizar un cambio incompatible con la versión anterior, la entidad o el comportamiento existente primero se depreciará en una versión menor. El cambio que no es compatible hacia atrás se finalizará en una versión importante que cambie o remueva la entidad o el comportamiento obsoleto.
Cuando sea posible, la entidad o comportamiento incompatible con versiones anteriores se proporcionará junto con su contraparte obsoleta para permitir una transición limpia en la versión menor. Se recomienda encarecidamente a los usuarios que apliquen la transición limpia cuando se presente la oportunidad: por favor, no continúen utilizando entidades o comportamientos obsoletos.
Nota
Proporcionar una ruta de transición limpia en una versión menor puede no ser siempre posible.
Una entidad o comportamiento obsoleto se documentará utilizando uno o más de los siguientes métodos (no exhaustivos):
Utilice un macro
*_DEPRECATEDen la declaración de la entidad.Incluya “obsoleto” en el nombre de la entidad.
Documentar explícitamente una entidad o comportamiento como obsoleto.