From ca42ed07cd11e570184095052dbf389eb30781fa Mon Sep 17 00:00:00 2001
From: Rye Mutt <rye@alchemyviewer.org>
Date: Sat, 19 Jun 2021 17:58:54 -0400
Subject: [PATCH] Convert newview build settings to .h.in based file copies

---
 indra/cmake/BuildVersion.cmake             | 59 +++++++++++---
 indra/cmake/Copy3rdPartyLibs.cmake         |  4 +-
 indra/cmake/OPENAL.cmake                   |  6 +-
 indra/llaudio/CMakeLists.txt               |  4 +-
 indra/media_plugins/CMakeLists.txt         |  4 +-
 indra/newview/CMakeLists.txt               | 92 ++++++----------------
 indra/newview/llappviewerwin32.cpp         |  2 +
 indra/newview/llprogressview.cpp           |  6 +-
 indra/newview/llstartup.cpp                |  8 +-
 indra/newview/llversioninfo.cpp            |  5 +-
 indra/newview/llviewerbuildconfig.h.in     | 57 ++++++++++++++
 indra/newview/tests/llversioninfo_test.cpp | 13 ++-
 12 files changed, 154 insertions(+), 106 deletions(-)
 create mode 100644 indra/newview/llviewerbuildconfig.h.in

diff --git a/indra/cmake/BuildVersion.cmake b/indra/cmake/BuildVersion.cmake
index a4bd02001d0..d47ad1fd933 100644
--- a/indra/cmake/BuildVersion.cmake
+++ b/indra/cmake/BuildVersion.cmake
@@ -57,8 +57,8 @@ if(NOT DEFINED VIEWER_SHORT_VERSION) # will be true in indra/, false in indra/ne
             find_package(Git)
         endif()
 
-        if((NOT REVISION_FROM_VCS) AND DEFINED ENV{revision})
-            set(VIEWER_VERSION_REVISION $ENV{revision})
+        if((NOT REVISION_FROM_VCS) AND DEFINED ENV{CI_PIPELINE_ID})
+            set(VIEWER_VERSION_REVISION $ENV{CI_PIPELINE_ID})
             message(STATUS "Revision (from environment): ${VIEWER_VERSION_REVISION}")
         elseif((NOT REVISION_FROM_VCS) AND DEFINED ENV{AUTOBUILD_BUILD_ID})
             set(VIEWER_VERSION_REVISION $ENV{AUTOBUILD_BUILD_ID})
@@ -78,7 +78,7 @@ if(NOT DEFINED VIEWER_SHORT_VERSION) # will be true in indra/, false in indra/ne
         else()
             set(VIEWER_VERSION_REVISION 0)
         endif()
-        message("Building '${VIEWER_CHANNEL}' Version ${VIEWER_SHORT_VERSION}.${VIEWER_VERSION_REVISION}")
+        message(STATUS "Building '${VIEWER_CHANNEL}' Version ${VIEWER_SHORT_VERSION}.${VIEWER_VERSION_REVISION}")
     else(EXISTS ${VIEWER_VERSION_BASE_FILE})
         message(SEND_ERROR "Cannot get viewer version from '${VIEWER_VERSION_BASE_FILE}'")
     endif(EXISTS ${VIEWER_VERSION_BASE_FILE})
@@ -87,13 +87,48 @@ if(NOT DEFINED VIEWER_SHORT_VERSION) # will be true in indra/, false in indra/ne
         message(STATUS "Ultimate fallback, revision was blank or not set: will use 0")
         set(VIEWER_VERSION_REVISION 0)
     endif("${VIEWER_VERSION_REVISION}" STREQUAL "")
-
-    set(VIEWER_CHANNEL_VERSION_DEFINES
-        "LL_VIEWER_CHANNEL=${VIEWER_CHANNEL}"
-        "LL_VIEWER_CHANNEL_CODENAME=${VIEWER_CHANNEL_CODENAME_INTERNAL}"
-        "LL_VIEWER_VERSION_MAJOR=${VIEWER_VERSION_MAJOR}" 
-        "LL_VIEWER_VERSION_MINOR=${VIEWER_VERSION_MINOR}"
-        "LL_VIEWER_VERSION_PATCH=${VIEWER_VERSION_PATCH}" 
-        "LL_VIEWER_VERSION_BUILD=${VIEWER_VERSION_REVISION}" 
-        "LLBUILD_CONFIG=\"${CMAKE_BUILD_TYPE}\"")
 endif(NOT DEFINED VIEWER_SHORT_VERSION)
+
+if (NOT DEFINED VIEWER_COMMIT_LONG_SHA)
+    if((NOT REVISION_FROM_VCS) AND DEFINED ENV{CI_COMMIT_SHA})
+        set(VIEWER_COMMIT_LONG_SHA $ENV{CI_COMMIT_SHA})
+        message(STATUS "Long SHA (from environment): ${VIEWER_COMMIT_LONG_SHA}")
+    elseif(Git_FOUND)
+        execute_process(COMMAND ${GIT_EXECUTABLE} rev-parse HEAD
+                        OUTPUT_VARIABLE GIT_COMMIT_SHA
+                        WORKING_DIRECTORY ${CMAKE_SOURCE_DIR}
+                        OUTPUT_STRIP_TRAILING_WHITESPACE
+                        )
+
+        if(GIT_COMMIT_SHA)
+            set(VIEWER_COMMIT_LONG_SHA ${GIT_COMMIT_SHA})
+        else()
+            set(VIEWER_COMMIT_LONG_SHA 0)
+        endif()
+        message(STATUS "Long SHA: ${VIEWER_COMMIT_LONG_SHA}")
+    else()
+        set(VIEWER_COMMIT_LONG_SHA 0)
+    endif()
+endif (NOT DEFINED VIEWER_COMMIT_LONG_SHA)
+
+if (NOT DEFINED VIEWER_COMMIT_SHORT_SHA)
+    if((NOT REVISION_FROM_VCS) AND DEFINED ENV{CI_COMMIT_SHORT_SHA})
+        set(VIEWER_COMMIT_SHORT_SHA $ENV{CI_COMMIT_SHORT_SHA})
+        message(STATUS "Short SHA (from environment): ${VIEWER_COMMIT_SHORT_SHA}")
+    elseif(Git_FOUND)
+        execute_process(COMMAND ${GIT_EXECUTABLE} rev-parse --short HEAD
+                        OUTPUT_VARIABLE GIT_COMMIT_SHORT_SHA
+                        WORKING_DIRECTORY ${CMAKE_SOURCE_DIR}
+                        OUTPUT_STRIP_TRAILING_WHITESPACE
+                        )
+
+        if(GIT_COMMIT_SHORT_SHA)
+            set(VIEWER_COMMIT_SHORT_SHA ${GIT_COMMIT_SHORT_SHA})
+        else()
+            set(VIEWER_COMMIT_SHORT_SHA 0)
+        endif()
+        message(STATUS "Short SHA: ${VIEWER_COMMIT_LONG_SHA}")
+    else()
+        set(VIEWER_COMMIT_SHORT_SHA 0)
+    endif()
+endif (NOT DEFINED VIEWER_COMMIT_SHORT_SHA)
\ No newline at end of file
diff --git a/indra/cmake/Copy3rdPartyLibs.cmake b/indra/cmake/Copy3rdPartyLibs.cmake
index 588758278d0..f80925871f5 100644
--- a/indra/cmake/Copy3rdPartyLibs.cmake
+++ b/indra/cmake/Copy3rdPartyLibs.cmake
@@ -87,9 +87,9 @@ if(WINDOWS)
       list(APPEND release_files fmod.dll)
     endif (USE_FMODSTUDIO)
 
-    if (OPENAL)
+    if (USE_OPENAL)
         list(APPEND release_files OpenAL32.dll alut.dll)
-    endif (OPENAL)
+    endif ()
 
     if (USE_KDU)
       list(APPEND debug_files kdud.dll)
diff --git a/indra/cmake/OPENAL.cmake b/indra/cmake/OPENAL.cmake
index 0912089d13f..7ef4d9f675a 100644
--- a/indra/cmake/OPENAL.cmake
+++ b/indra/cmake/OPENAL.cmake
@@ -2,8 +2,8 @@
 include(Linking)
 include(Prebuilt)
 
-option(OPENAL "Enable OpenAL" ON)
-if (OPENAL)
+option(USE_OPENAL "Enable OpenAL" ON)
+if (USE_OPENAL)
   if (USESYSTEMLIBS)
     pkg_check_modules(FREEALUT REQUIRED freealut)
     pkg_check_modules(OPENAL REQUIRED openal)
@@ -19,4 +19,4 @@ if (OPENAL)
     set(FREEALUT_LIBRARIES alut)
     set(OPENAL_INCLUDE_DIRS "${LIBS_PREBUILT_DIR}/include/")
   endif (USESYSTEMLIBS)
-endif (OPENAL)
+endif (USE_OPENAL)
diff --git a/indra/llaudio/CMakeLists.txt b/indra/llaudio/CMakeLists.txt
index 85752b2a17e..51d113e741a 100644
--- a/indra/llaudio/CMakeLists.txt
+++ b/indra/llaudio/CMakeLists.txt
@@ -60,7 +60,7 @@ if (USE_FMODSTUDIO)
          )
 endif (USE_FMODSTUDIO)
 
-if (OPENAL)
+if (USE_OPENAL)
   include_directories(
     ${OPENAL_LIBRARIES}
     ${FREEALUT_LIBRARIES}
@@ -75,7 +75,7 @@ if (OPENAL)
     llaudioengine_openal.h
     lllistener_openal.h
     )
-endif (OPENAL)
+endif (USE_OPENAL)
 
 set_source_files_properties(${llaudio_HEADER_FILES}
                             PROPERTIES HEADER_FILE_ONLY TRUE)
diff --git a/indra/media_plugins/CMakeLists.txt b/indra/media_plugins/CMakeLists.txt
index e4780bbd54f..0b3ddb32b1e 100644
--- a/indra/media_plugins/CMakeLists.txt
+++ b/indra/media_plugins/CMakeLists.txt
@@ -1,22 +1,20 @@
 # -*- cmake -*-
 
 add_subdirectory(base)
+add_subdirectory(example)
 
 if (LINUX)
     #add_subdirectory(gstreamer010)
     add_subdirectory(cef)
     add_subdirectory(libvlc)
-    add_subdirectory(example)
 endif (LINUX)
 
 if (DARWIN)
     add_subdirectory(cef)
     add_subdirectory(libvlc)
-    add_subdirectory(example)
 endif (DARWIN)
 
 if (WINDOWS)
     add_subdirectory(cef)
     add_subdirectory(libvlc)
-    add_subdirectory(example)
 endif (WINDOWS)
diff --git a/indra/newview/CMakeLists.txt b/indra/newview/CMakeLists.txt
index 0cb5e28e0d2..4a0f23a4285 100644
--- a/indra/newview/CMakeLists.txt
+++ b/indra/newview/CMakeLists.txt
@@ -65,11 +65,11 @@ if( LLPHYSICSEXTENSIONS_SRC_DIR )
   endif (NOT HAVOK_TPV)
 endif( LLPHYSICSEXTENSIONS_SRC_DIR )
 
-if(USE_FMODSTUDIO)
-  include_directories(${FMODSTUDIO_INCLUDE_DIR})
-endif(USE_FMODSTUDIO)
+message(STATUS "CMAKE_CURRENT_BINARY_DIR = ${CMAKE_CURRENT_BINARY_DIR}")
 
 include_directories(
+    ${CMAKE_CURRENT_SOURCE_DIR}
+    ${CMAKE_CURRENT_BINARY_DIR}
     ${DBUSGLIB_INCLUDE_DIRS}
     ${ZLIB_INCLUDE_DIRS}
     ${GLOD_INCLUDE_DIR}
@@ -91,15 +91,18 @@ include_directories(
     ${LLWINDOW_INCLUDE_DIRS}
     ${LLXML_INCLUDE_DIRS}
     ${LLLOGIN_INCLUDE_DIRS}
-    ${LIBS_PREBUILT_DIR}/include/collada
-    ${LIBS_PREBUILD_DIR}/include/hunspell
+    "${LIBS_PREBUILT_DIR}/include/collada"
+    "${LIBS_PREBUILD_DIR}/include/hunspell"
     ${OPENAL_INCLUDE_DIRS}
     ${FREEALUT_INCLUDE_DIRS}
-    ${LIBS_PREBUILT_DIR}/include/collada/1.4
+    "${LIBS_PREBUILT_DIR}/include/collada/1.4"
     ${LLAPPEARANCE_INCLUDE_DIRS}
-    ${CMAKE_CURRENT_SOURCE_DIR}
     )
 
+if(USE_FMODSTUDIO)
+  include_directories(${FMODSTUDIO_INCLUDE_DIR})
+endif(USE_FMODSTUDIO)
+
 if (BUGSPLAT_DB)
   include_directories(
     ${BUGSPLAT_INCLUDE_DIR}
@@ -1451,16 +1454,13 @@ source_group("CMake Rules" FILES ViewerInstall.cmake)
 file(WRITE "${CMAKE_CURRENT_BINARY_DIR}/viewer_version.txt"
            "${VIEWER_SHORT_VERSION}.${VIEWER_VERSION_REVISION}\n")
 
-set_source_files_properties(
-   llversioninfo.cpp tests/llversioninfo_test.cpp 
-   PROPERTIES
-   COMPILE_DEFINITIONS "${VIEWER_CHANNEL_VERSION_DEFINES}" # see BuildVersion.cmake
-   )
+configure_file(llviewerbuildconfig.h.in llviewerbuildconfig.h @ONLY)
+LIST(APPEND viewer_HEADER_FILES ${CMAKE_CURRENT_BINARY_DIR}/llviewerbuildconfig.h)
 
 if (DARWIN)
   LIST(APPEND viewer_SOURCE_FILES llappviewermacosx.cpp)
   LIST(APPEND viewer_SOURCE_FILES llappviewermacosx-objc.mm)
-  LIST(APPEND viewer_SOURCE_FILES llappviewermacosx-objc.h)
+  LIST(APPEND viewer_HEADER_FILES llappviewermacosx-objc.h)
   LIST(APPEND viewer_SOURCE_FILES llfilepicker_mac.mm)
   LIST(APPEND viewer_HEADER_FILES llfilepicker_mac.h)
 
@@ -1470,7 +1470,6 @@ if (DARWIN)
     llappdelegate-objc.mm
     PROPERTIES
     SKIP_PRECOMPILE_HEADERS TRUE
-    COMPILE_DEFINITIONS "${VIEWER_CHANNEL_VERSION_DEFINES}"
     # BugsplatMac is a module, imported with @import. That language feature
     # demands these -f switches.
     # Xcode 10.2 requires that Objective-C++ headers declare nullability of
@@ -1532,28 +1531,16 @@ if (DARWIN)
     )
   SOURCE_GROUP("Resources" FILES ${viewer_RESOURCE_FILES})
   list(APPEND viewer_SOURCE_FILES ${viewer_RESOURCE_FILES})
-  
-  if (OPENAL)
-    LIST(APPEND viewer_LIBRARIES ${OPENAL_LIBRARIES} ${FREEALUT_LIBRARIES})
-  endif (OPENAL)
 endif (DARWIN)
 
 if (LINUX)
     LIST(APPEND viewer_SOURCE_FILES llappviewerlinux.cpp)
-    set_source_files_properties(
-      llappviewerlinux.cpp
-      PROPERTIES
-      COMPILE_DEFINITIONS "${VIEWER_CHANNEL_VERSION_DEFINES}"
-      )
     LIST(APPEND viewer_SOURCE_FILES llappviewerlinux_api_dbus.cpp)
     SET(CMAKE_EXE_LINKER_FLAGS "${CMAKE_EXE_LINKER_FLAGS} -Wl,--as-needed")
 
     set(viewer_LIBRARIES
         Xinerama
         )
-    if (OPENAL)
-      LIST(APPEND viewer_LIBRARIES ${OPENAL_LIBRARIES} ${FREEALUT_LIBRARIES})
-    endif (OPENAL)
 endif (LINUX)
 
 if (WINDOWS)
@@ -1561,16 +1548,6 @@ if (WINDOWS)
          llappviewerwin32.cpp
          llwindebug.cpp
          )
-    set(APP_VWR_WIN32_COMPILE_DEFS ${VIEWER_CHANNEL_VERSION_DEFINES})
-    if(USE_NVAPI)
-	list(APPEND APP_VWR_WIN32_COMPILE_DEFS "USE_NVAPI=1")
-    endif()
-	 
-    set_source_files_properties(
-      llappviewerwin32.cpp
-      PROPERTIES
-      COMPILE_DEFINITIONS "${APP_VWR_WIN32_COMPILE_DEFS}"
-      )
 
     list(APPEND viewer_HEADER_FILES
          llappviewerwin32.h
@@ -1662,16 +1639,17 @@ if (WINDOWS)
     configure_file( ${CMAKE_CURRENT_SOURCE_DIR}/res/viewerRes.rc
                     ${CMAKE_CURRENT_BINARY_DIR}/viewerRes.rc
                     )
-    set(viewer_RESOURCE_FILES
+
+    list(APPEND viewer_RESOURCE_FILES
+    	windows.manifest
         ${CMAKE_CURRENT_BINARY_DIR}/viewerRes.rc
-        ${viewer_RESOURCE_FILES}
         )
 
     set_source_files_properties(${CMAKE_CURRENT_BINARY_DIR}/viewerRes.rc
       PROPERTIES COMPILE_FLAGS "-I${CMAKE_CURRENT_SOURCE_DIR}/res"
       )
 
-    SOURCE_GROUP("Resource Files" FILES ${viewer_RESOURCE_FILES})
+    source_group("Resource Files" FILES ${viewer_RESOURCE_FILES})
 
     if (NOT USESYSTEMLIBS)
         list(APPEND viewer_SOURCE_FILES ${viewer_RESOURCE_FILES})
@@ -1692,21 +1670,12 @@ if (WINDOWS)
         wer
         winspool
         )
-
-    if (ADDRESS_SIZE EQUAL 64)
-        # We deliberately omit this from the 32bit build because it declares that
-        # the viewer is compatible with Windows 10; we need that to properly detect
-        # the Windows version, but doing so causes systems with certain HD video
-        # cards to fail because Windows 10 does not support them.  Leaving this out
-        # causes those systems to run in a Windows 8 compatibility mode, which works.
-        LIST(APPEND viewer_SOURCE_FILES windows.manifest)
-    endif (ADDRESS_SIZE EQUAL 64)
-
-    if (OPENAL)
-      LIST(APPEND viewer_LIBRARIES ${OPENAL_LIBRARIES} ${FREEALUT_LIBRARIES})
-    endif (OPENAL)
 endif (WINDOWS)
 
+if (USE_OPENAL)
+    LIST(APPEND viewer_LIBRARIES ${OPENAL_LIBRARIES} ${FREEALUT_LIBRARIES})
+endif ()
+
 # Add the xui files. This is handy for searching for xui elements
 # from within the IDE.
 set(viewer_XUI_FILES
@@ -1811,24 +1780,10 @@ if (WINDOWS)
   list(APPEND viewer_SOURCE_FILES ${viewer_INSTALLER_FILES})
 endif (WINDOWS)
 
-if (OPENAL)
-  set(LLSTARTUP_COMPILE_FLAGS "${LLSTARTUP_COMPILE_FLAGS} -DLL_OPENAL=1")
-endif (OPENAL)
-
 if (USE_FMODSTUDIO)
-  set(LLSTARTUP_COMPILE_FLAGS "${LLSTARTUP_COMPILE_FLAGS} -DUSE_FMODSTUDIO=1")
   set(FMODWRAPPER_LIBRARY ${FMODSTUDIO_LIBRARY})
 endif (USE_FMODSTUDIO)
 
-set_source_files_properties(llstartup.cpp PROPERTIES COMPILE_FLAGS "${LLSTARTUP_COMPILE_FLAGS}")
-
-if (HAVOK OR HAVOK_TPV)
-  set(LLSTARTUP_COMPILE_FLAGS "${LLSTARTUP_COMPILE_FLAGS} -DLL_HAVOK")
-endif (HAVOK OR HAVOK_TPV)
-
-# progress view disables/enables icons based on available packages
-set_source_files_properties(llprogressview.cpp PROPERTIES COMPILE_FLAGS "${LLSTARTUP_COMPILE_FLAGS}")
-
 list(APPEND viewer_SOURCE_FILES ${viewer_HEADER_FILES})
 
 set_source_files_properties(${viewer_HEADER_FILES}
@@ -1944,12 +1899,12 @@ if (WINDOWS)
           )
     endif (USE_FMODSTUDIO)
 
-    if (OPENAL)
+    if (USE_OPENAL)
       list(APPEND COPY_INPUT_DEPENDENCIES
            ${SHARED_LIB_STAGING_DIR}/${CMAKE_CFG_INTDIR}/OpenAL32.dll
            ${SHARED_LIB_STAGING_DIR}/${CMAKE_CFG_INTDIR}/alut.dll
           )
-    endif (OPENAL)
+    endif ()
 
     add_custom_command(
       OUTPUT  ${CMAKE_CFG_INTDIR}/copy_touched.bat
@@ -2683,4 +2638,3 @@ set_source_files_properties(
 endif (LL_TESTS)
 
 check_message_template(${VIEWER_BINARY_NAME})
-
diff --git a/indra/newview/llappviewerwin32.cpp b/indra/newview/llappviewerwin32.cpp
index 418d6cc18c9..3c9ab4684c1 100644
--- a/indra/newview/llappviewerwin32.cpp
+++ b/indra/newview/llappviewerwin32.cpp
@@ -26,6 +26,8 @@
 
 #include "llviewerprecompiledheaders.h"
 
+#include "llviewerbuildconfig.h"
+
 #ifdef INCLUDE_VLD
 #include "vld.h"
 #endif
diff --git a/indra/newview/llprogressview.cpp b/indra/newview/llprogressview.cpp
index ce0c960f7d9..a38088a8b93 100644
--- a/indra/newview/llprogressview.cpp
+++ b/indra/newview/llprogressview.cpp
@@ -26,6 +26,8 @@
 
 #include "llviewerprecompiledheaders.h"
 
+#include "llviewerbuildconfig.h"
+
 #include "llprogressview.h"
 
 #include "indra_constants.h"
@@ -401,7 +403,7 @@ void LLProgressView::initLogos()
 
 	S32 icon_height;
 
-#ifdef USE_FMODSTUDIO
+#if USE_FMODSTUDIO
     // original image size is 264x96, it is on longer side but
     // with no internal paddings so it gets additional padding
     icon_width = 77;
@@ -416,7 +418,7 @@ void LLProgressView::initLogos()
 
     texture_start_x += icon_width + default_pad + 1;
 #endif //LL_FMODSTUDIO
-#ifdef LL_HAVOK
+#if LL_HAVOK
     // original image size is 342x113, central element is on a larger side
     // plus internal padding, so it gets slightly more height than desired 32
     icon_width = 88;
diff --git a/indra/newview/llstartup.cpp b/indra/newview/llstartup.cpp
index 7723651d060..19d6e1bd6c0 100644
--- a/indra/newview/llstartup.cpp
+++ b/indra/newview/llstartup.cpp
@@ -26,6 +26,8 @@
 
 #include "llviewerprecompiledheaders.h"
 
+#include "llviewerbuildconfig.h"
+
 #include "llappviewer.h"
 #include "llstartup.h"
 #include "llcallstack.h"
@@ -43,8 +45,8 @@
 # include "llaudioengine_fmodstudio.h"
 #endif
 
-#ifdef LL_OPENAL
-#include "llaudioengine_openal.h"
+#if USE_OPENAL
+# include "llaudioengine_openal.h"
 #endif
 
 #include "llavatarnamecache.h"
@@ -644,7 +646,7 @@ bool idle_startup()
 			}
 #endif
 
-#ifdef LL_OPENAL
+#if USE_OPENAL
 			if (!gAudiop
 #if !LL_WINDOWS
 				&& NULL == getenv("LL_BAD_OPENAL_DRIVER")
diff --git a/indra/newview/llversioninfo.cpp b/indra/newview/llversioninfo.cpp
index ebf15e1559d..bdd97d43dc7 100644
--- a/indra/newview/llversioninfo.cpp
+++ b/indra/newview/llversioninfo.cpp
@@ -26,6 +26,7 @@
  */
 
 #include "llviewerprecompiledheaders.h"
+#include "llviewerbuildconfig.h"
 #include "llevents.h"
 #include "lleventfilter.h"
 #include "llversioninfo.h"
@@ -51,9 +52,9 @@ LLVersionInfo::LLVersionInfo():
 	// LL_VIEWER_CHANNEL is a macro defined on the compiler command line. The
 	// macro expands to the string name of the channel, but without quotes. We
 	// need to turn it into a quoted string. LL_TO_STRING() does that.
-	mWorkingChannelName(LL_TO_STRING(LL_VIEWER_CHANNEL)),
+	mWorkingChannelName(LL_VIEWER_CHANNEL),
 	build_configuration(LLBUILD_CONFIG), // set in indra/cmake/BuildVersion.cmake
-	codename(LL_TO_STRING(LL_VIEWER_CHANNEL_CODENAME)),
+	codename(LL_VIEWER_CHANNEL_CODENAME),
 	// instantiate an LLEventMailDrop with canonical name to listen for news
 	// from SLVersionChecker
 	mPump{new LLEventMailDrop("relnotes")},
diff --git a/indra/newview/llviewerbuildconfig.h.in b/indra/newview/llviewerbuildconfig.h.in
new file mode 100644
index 00000000000..b952ea2fe4e
--- /dev/null
+++ b/indra/newview/llviewerbuildconfig.h.in
@@ -0,0 +1,57 @@
+/** 
+ * @file llviewerbuildconfig.h
+ * @brief Viewer build-time config options.
+ * @author Rye Mutt <rye@alchemyviewer.org>
+ *
+ * $LicenseInfo:firstyear=2019&license=viewerlgpl$
+ * Alchemy Viewer Source Code
+ * Copyright (C) 2019, Rye Mutt <rye@alchemyviewer.org>
+ * 
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Lesser General Public
+ * License as published by the Free Software Foundation;
+ * version 2.1 of the License only.
+ * 
+ * This library is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+ * Lesser General Public License for more details.
+ * 
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this library; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301  USA
+ * 
+ * $/LicenseInfo$
+ */
+
+#ifndef LL_LLVIEWERBUILDCONFIG_H
+#define LL_LLVIEWERBUILDCONFIG_H
+
+// Commit SHA
+#define LL_VIEWER_COMMIT_SHA "@VIEWER_COMMIT_LONG_SHA@"
+#define LL_VIEWER_COMMIT_SHORT_SHA "@VIEWER_COMMIT_SHORT_SHA@"
+
+// Build Configuration
+#define LLBUILD_CONFIG "@CMAKE_BUILD_TYPE@"
+
+// Version Information
+#define LL_VIEWER_CHANNEL "@VIEWER_CHANNEL@"
+#define LL_VIEWER_CHANNEL_CODENAME "@VIEWER_CHANNEL_CODENAME_INTERNAL@"
+#define LL_VIEWER_VERSION_MAJOR @VIEWER_VERSION_MAJOR@
+#define LL_VIEWER_VERSION_MINOR @VIEWER_VERSION_MINOR@
+#define LL_VIEWER_VERSION_PATCH @VIEWER_VERSION_PATCH@
+#define LL_VIEWER_VERSION_BUILD @VIEWER_VERSION_REVISION@
+
+// Graphics Utils
+#cmakedefine01 USE_NVAPI
+
+// Audio Engines
+#cmakedefine01 USE_FMODSTUDIO
+#cmakedefine01 USE_OPENAL
+
+// Havok
+#cmakedefine01 HAVOK
+#cmakedefine01 HAVOK_TPV
+#define LL_HAVOK (HAVOK || HAVOK_TPV)
+
+#endif // LL_LLVIEWERBUILDCONFIG_H
\ No newline at end of file
diff --git a/indra/newview/tests/llversioninfo_test.cpp b/indra/newview/tests/llversioninfo_test.cpp
index 73bc369f05b..409a02b482a 100644
--- a/indra/newview/tests/llversioninfo_test.cpp
+++ b/indra/newview/tests/llversioninfo_test.cpp
@@ -25,17 +25,14 @@
 
 #include "linden_common.h"
 
+#include "llviewerbuildconfig.h"
+
 #include "../test/lltut.h"
 
 #include "../llversioninfo.h"
 
  #include <iostream>
 
-// LL_VIEWER_CHANNEL is a macro defined on the compiler command line. The
-// macro expands to the string name of the channel, but without quotes. We
-// need to turn it into a quoted string. LL_TO_STRING() does that.
-#define ll_viewer_channel LL_TO_STRING(LL_VIEWER_CHANNEL)
-
 namespace tut
 {
     struct versioninfo
@@ -57,7 +54,7 @@ namespace tut
 			mShortVersion = stream.str();
 			stream.str("");
 
-			stream << ll_viewer_channel
+			stream << LL_VIEWER_CHANNEL
 				   << " "
 				   << mVersion;
 			mVersionAndChannel = stream.str();
@@ -69,7 +66,7 @@ namespace tut
 			mResetVersionAndChannel = stream.str();
 			stream.str("");
 
-			stream << LL_TO_STRING(LL_VIEWER_CHANNEL_CODENAME);
+			stream << LL_VIEWER_CHANNEL_CODENAME;
 			mCodename = stream.str();
 			stream.str("");
 		}
@@ -106,7 +103,7 @@ namespace tut
 					  LL_VIEWER_VERSION_BUILD);
 		ensure_equals("Channel version", 
 					  LLVersionInfo::instance().getChannel(), 
-					  ll_viewer_channel);
+					  LL_VIEWER_CHANNEL);
 		ensure_equals("Version String", 
 					  LLVersionInfo::instance().getVersion(), 
 					  mVersion);
-- 
GitLab