CMake: Fold HLSL source into glslang

... and stub the HLSL target.

Fixes the building of shared libraries.

This breaks the cyclic dependency between the `glslang` and `hlsl` targets (by essentially removing the `hlsl` target).

The `BUILD.gn` and `BUILD.bazel` build rules already pull the `HLSL` source into the `glslang` target.

`Android.mk` is the only remaining build config that has a dedicated `HLSL` target, but this is explicity static and does not suffer the same link-time issues with the cyclic dependency (we may wish to stub this target too).

Related issue: #1484, #2147
Related PR: #2267
diff --git a/glslang/CMakeLists.txt b/glslang/CMakeLists.txt
index a0259a3..606bbdc 100644
--- a/glslang/CMakeLists.txt
+++ b/glslang/CMakeLists.txt
@@ -82,11 +82,32 @@
 
 glslang_pch(SOURCES MachineIndependent/pch.cpp)
 
+if(ENABLE_HLSL)
+    list(APPEND SOURCES
+        ../hlsl/hlslAttributes.cpp
+        ../hlsl/hlslParseHelper.cpp
+        ../hlsl/hlslScanContext.cpp
+        ../hlsl/hlslOpMap.cpp
+        ../hlsl/hlslTokenStream.cpp
+        ../hlsl/hlslGrammar.cpp
+        ../hlsl/hlslParseables.cpp)
+
+    list(APPEND HEADERS
+        ../hlsl/hlslAttributes.h
+        ../hlsl/hlslParseHelper.h
+        ../hlsl/hlslTokens.h
+        ../hlsl/hlslScanContext.h
+        ../hlsl/hlslOpMap.h
+        ../hlsl/hlslTokenStream.h
+        ../hlsl/hlslGrammar.h
+        ../hlsl/hlslParseables.h)
+endif(ENABLE_HLSL)
+
 add_library(glslang ${LIB_TYPE} ${BISON_GLSLParser_OUTPUT_SOURCE} ${SOURCES} ${HEADERS})
 set_property(TARGET glslang PROPERTY FOLDER glslang)
 set_property(TARGET glslang PROPERTY POSITION_INDEPENDENT_CODE ON)
 target_link_libraries(glslang OGLCompiler OSDependent)
-target_include_directories(glslang PUBLIC 
+target_include_directories(glslang PUBLIC
     $<BUILD_INTERFACE:${CMAKE_CURRENT_SOURCE_DIR}/..>
     $<INSTALL_INTERFACE:${CMAKE_INSTALL_INCLUDEDIR}>)
 
@@ -94,10 +115,6 @@
     set_target_properties(glslang PROPERTIES PREFIX "")
 endif()
 
-if(ENABLE_HLSL)
-    target_link_libraries(glslang HLSL)
-endif()
-
 if(WIN32)
     source_group("Public" REGULAR_EXPRESSION "Public/*")
     source_group("MachineIndependent" REGULAR_EXPRESSION "MachineIndependent/[^/]*")
diff --git a/hlsl/CMakeLists.txt b/hlsl/CMakeLists.txt
index ae0d4d4..d086631 100644
--- a/hlsl/CMakeLists.txt
+++ b/hlsl/CMakeLists.txt
@@ -1,25 +1,10 @@
-set(SOURCES
-    hlslAttributes.cpp
-    hlslParseHelper.cpp
-    hlslScanContext.cpp
-    hlslOpMap.cpp
-    hlslTokenStream.cpp
-    hlslGrammar.cpp
-    hlslParseables.cpp)
 
-set(HEADERS
-    hlslAttributes.h
-    hlslParseHelper.h
-    hlslTokens.h
-    hlslScanContext.h
-    hlslOpMap.h
-    hlslTokenStream.h
-    hlslGrammar.h
-    hlslParseables.h)
+# The HLSL source is directly embedded into the glslang target when ENABLE_HLSL
+# is set.
+# The HLSL target is now just a stub that exists for backwards compatibility for
+# projects that referenced this target.
 
-glslang_pch(SOURCES pch.cpp)
-
-add_library(HLSL ${LIB_TYPE} ${SOURCES} ${HEADERS})
+add_library(HLSL ${LIB_TYPE} "stub.cpp")
 set_property(TARGET HLSL PROPERTY FOLDER hlsl)
 set_property(TARGET HLSL PROPERTY POSITION_INDEPENDENT_CODE ON)
 
@@ -27,10 +12,6 @@
     set_target_properties(HLSL PROPERTIES PREFIX "")
 endif()
 
-if(WIN32)
-    source_group("Source" FILES ${SOURCES} ${HEADERS})
-endif(WIN32)
-
 if(ENABLE_GLSLANG_INSTALL)
     if(BUILD_SHARED_LIBS)
         install(TARGETS HLSL EXPORT HLSLTargets
diff --git a/hlsl/stub.cpp b/hlsl/stub.cpp
new file mode 100644
index 0000000..c53b939
--- /dev/null
+++ b/hlsl/stub.cpp
@@ -0,0 +1,40 @@
+//
+// Copyright (C) 2020 Google, Inc.
+//
+// All rights reserved.
+//
+// Redistribution and use in source and binary forms, with or without
+// modification, are permitted provided that the following conditions
+// are met:
+//
+//    Redistributions of source code must retain the above copyright
+//    notice, this list of conditions and the following disclaimer.
+//
+//    Redistributions in binary form must reproduce the above
+//    copyright notice, this list of conditions and the following
+//    disclaimer in the documentation and/or other materials provided
+//    with the distribution.
+//
+//    Neither the name of Google, Inc., nor the names of its
+//    contributors may be used to endorse or promote products derived
+//    from this software without specific prior written permission.
+//
+// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS
+// FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE
+// COPYRIGHT HOLDERS OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT,
+// INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING,
+// BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
+// LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER
+// CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
+// LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN
+// ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
+// POSSIBILITY OF SUCH DAMAGE.
+//
+
+// The HLSL source is directly embedded into the glslang target when ENABLE_HLSL
+// is set.
+// The HLSL target is now just a stub that exists for backwards compatibility
+// for projects that referenced this target. As a target requires at least one
+// source file to build, this file acts as that stub.