// SPDX-License-Identifier: MIT

#include "version.hpp"

#include "helpers.hpp"

// We do not build `make develop` with `-fsanitize=leak` because macOS clang++ does not support it.
// Instead, we enable ASan (`-fsanitize=address`) to check for memory leaks in all four programs.
#ifdef __clang__
	#if __has_feature(address_sanitizer) && !defined(__SANITIZE_ADDRESS__)
		#define __SANITIZE_ADDRESS__
	#endif
#endif
#if !defined(NDEBUG) && defined(__SANITIZE_ADDRESS__) && !defined(__APPLE__)
extern "C" {
	char const *__asan_default_options(void) {
		return "detect_leaks=1"
		       ":detect_stack_use_after_return=1"
		       ":detect_invalid_pointer_pairs=2"
		       ":check_initialization_order=1"
		       ":strict_init_order=1"
		       ":strict_string_checks=1"
		       ":print_legend=0";
	}
}
#endif

// This variable is passed via `-D` from the Makefile, but not from CMake
// (in which `configure_file()` is used on this file to replace some syntax)
#ifndef BUILD_VERSION_STRING
    // CMake-specific syntax here
	#define BUILD_VERSION_STRING "v1.0.1"
#endif

char const *get_package_version_string() {
	if constexpr (literal_strlen(BUILD_VERSION_STRING) > 0) {
		return BUILD_VERSION_STRING;
	}
	// Fallback if version string can't be obtained from Git
#ifndef PACKAGE_VERSION_RC
	return "v" EXPAND_AND_STR(PACKAGE_VERSION_MAJOR) "." EXPAND_AND_STR(PACKAGE_VERSION_MINOR
	) "." EXPAND_AND_STR(PACKAGE_VERSION_PATCH);
#else
	return "v" EXPAND_AND_STR(PACKAGE_VERSION_MAJOR) "." EXPAND_AND_STR(PACKAGE_VERSION_MINOR
	) "." EXPAND_AND_STR(PACKAGE_VERSION_PATCH) "-rc" EXPAND_AND_STR(PACKAGE_VERSION_RC);
#endif
}
