2023-07-27 21:31:20 +00:00
# Copyright (C) 2020-2023 The Khronos Group Inc.
2020-07-01 14:43:36 +00:00
#
# 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.
#
2020-07-03 11:21:01 +00:00
# Neither the name of The Khronos Group Inc. nor the names of its
2020-07-01 14:43:36 +00:00
# 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.
2023-07-27 21:31:20 +00:00
cmake_minimum_required ( VERSION 3.17.2 )
2022-12-19 19:41:07 +00:00
project ( glslang )
2021-02-18 23:18:17 +00:00
2023-12-01 22:07:03 +00:00
if ( CMAKE_VERSION VERSION_LESS "3.21" )
# https://cmake.org/cmake/help/latest/variable/PROJECT_IS_TOP_LEVEL.html
string ( COMPARE EQUAL ${ CMAKE_CURRENT_SOURCE_DIR } ${ CMAKE_SOURCE_DIR } PROJECT_IS_TOP_LEVEL )
endif ( )
2024-02-12 21:53:15 +00:00
set ( GLSLANG_TESTS_DEFAULT ON ) # Can be turned off, below, based on environment.
set ( GLSLANG_ENABLE_INSTALL_DEFAULT ON ) # Can be turned off, below, based on environment.
2016-05-05 18:45:53 +00:00
set_property ( GLOBAL PROPERTY USE_FOLDERS ON )
2015-06-26 22:29:10 +00:00
2017-04-29 08:57:36 +00:00
# Adhere to GNU filesystem layout conventions
include ( GNUInstallDirs )
2022-08-03 00:16:03 +00:00
include ( CMakePackageConfigHelpers )
2017-04-29 08:57:36 +00:00
2019-08-09 14:56:51 +00:00
# Needed for CMAKE_DEPENDENT_OPTION macro
include ( CMakeDependentOption )
2023-11-21 20:06:49 +00:00
option ( BUILD_SHARED_LIBS "Build Shared Libraries" )
2019-10-15 09:00:23 +00:00
option ( BUILD_EXTERNAL "Build external dependencies in /External" ON )
2023-11-29 19:58:56 +00:00
option ( BUILD_WERROR "Enable warnings as errors (default is OFF)" OFF )
2018-03-30 14:32:03 +00:00
set ( LIB_TYPE STATIC )
if ( BUILD_SHARED_LIBS )
set ( LIB_TYPE SHARED )
endif ( )
Generate build information from CHANGES.md
This PR significantly reworks the way glslang is versioned.
Instead of committing changes to the `GLSLANG_MINOR_VERSION` define in
`glslang/Public/ShaderLang.h`, and using `make-revision` to generate
`GLSLANG_PATCH_LEVEL` in `glslang/Include/revision.h`, all version
information is now derived from the new `CHANGES.md` file.
`CHANGES.md` acts as the single source of truth for glslang version
information, along with a convenient place to put all release notes for
each notable change made.
`CHANGES.md` is parsed using the new `build_info.py` python script.
This script can read basic template files to produce new source files,
which it does to read the new `build_info.h.tmpl` to generate (at build
time) a glslang private header at
`<build-dir>/include/glslang/build_info.h`.
I've written generators for each of the CMake, Bazel, gn, and
`Android.mk` build scripts.
The new version code conforms to the Semantic Versioning 2.0 spec.
This new version is also used by the CMake rules to produce versioned
shared objects, including a major-versioned SONAME.
New APIs:
---------
* `glslang::GetVersion()` returns a `Version` struct with the version
major, minor, patch and flavor.
Breaking API changes:
---------------------
* The public defines `GLSLANG_MINOR_VERSION` and `GLSLANG_PATCH_LEVEL`
have been entirely removed.
* `glslang/Public/ShaderLang.h` and `glslang/Include/revision.h` have
been deleted.
* Instead, `<build-dir>/include/glslang/build_info.h` is created in
the build directory, and `<build-dir>/include` is a CMake `PUBLIC`
(dependee-inherited) include directory for the glslang targets.
* `<build-dir>/include/glslang/build_info.h` contains the following
new #defines:
`GLSLANG_VERSION_MAJOR`, `GLSLANG_VERSION_MINOR`,
`GLSLANG_VERSION_PATCH`, `GLSLANG_VERSION_FLAVOR`,
`GLSLANG_VERSION_GREATER_THAN(major, minor, patch)`,
`GLSLANG_VERSION_GREATER_OR_EQUAL_TO(major, minor, patch)`,
`GLSLANG_VERSION_LESS_THAN(major, minor, patch)`,
`GLSLANG_VERSION_LESS_OR_EQUAL_TO(major, minor, patch)`
* The CMake install output directory contains a copy of
`build_info.h` at: `include/glslang/build_info.h`
* Python3 is now always required to build glslang (likely always
required for transitive dependency builds).
2020-06-17 10:17:19 +00:00
if ( "${CMAKE_BUILD_TYPE}" STREQUAL "" )
# This logic inside SPIRV-Tools, which can upset build target dependencies
# if changed after targets are already defined. To prevent these issues,
# ensure CMAKE_BUILD_TYPE is assigned early and at the glslang root scope.
message ( STATUS "No build type selected, default to Debug" )
set ( CMAKE_BUILD_TYPE "Debug" )
endif ( )
2023-11-21 23:59:26 +00:00
# Currently iOS and Android are very similar.
# They both have their own packaging (APP/APK).
# Which makes regular executables/testing problematic.
#
# Currently the only deliverables for these platforms are
# libraries (either STATIC or SHARED).
#
# Furthermore testing is equally problematic.
if ( IOS OR ANDROID )
set ( ENABLE_GLSLANG_BINARIES OFF )
2024-02-12 21:53:15 +00:00
set ( GLSLANG_TESTS_DEFAULT OFF )
endif ( )
# Simplify the default case of including this project.
# Otherwise add_subdirectory users have a harder time consuming the library.
# Since glslang will pollute the installation and add undesirable testing.
if ( NOT PROJECT_IS_TOP_LEVEL )
set ( GLSLANG_TESTS_DEFAULT OFF )
set ( GLSLANG_ENABLE_INSTALL_DEFAULT OFF )
2023-11-21 23:59:26 +00:00
endif ( )
2024-02-12 21:53:15 +00:00
# Control whether Glslang self-tests are built and tested.
# Always expose this as an option, so the defaults can be overridden.
option ( GLSLANG_TESTS "Enable glslang testing" ${ GLSLANG_TESTS_DEFAULT } )
# Control whether to install Glslang.
# Always expose this as an option, so the defaults can be overridden.
option ( GLSLANG_ENABLE_INSTALL "Enable glslang installation" ${ GLSLANG_ENABLE_INSTALL_DEFAULT } )
2024-07-25 00:37:47 +00:00
option ( ENABLE_SPIRV "Enables SPIRV output support" ON )
2018-07-07 21:53:06 +00:00
option ( ENABLE_SPVREMAPPER "Enables building of SPVRemapper" ON )
2017-07-04 12:54:57 +00:00
2023-07-10 21:38:59 +00:00
option ( ENABLE_GLSLANG_BINARIES "Builds glslang and spirv-remap" ON )
2016-05-05 04:30:44 +00:00
2023-11-21 20:06:49 +00:00
option ( ENABLE_GLSLANG_JS "If using Emscripten, build glslang.js. Otherwise, builds a sample executable for binary-size testing." )
2020-02-06 21:36:52 +00:00
CMAKE_DEPENDENT_OPTION ( ENABLE_EMSCRIPTEN_SINGLE_FILE
" I f u s i n g E m s c r i p t e n , e n a b l e s S I N G L E _ F I L E b u i l d "
O F F " E N A B L E _ G L S L A N G _ J S A N D E M S C R I P T E N "
O F F )
CMAKE_DEPENDENT_OPTION ( ENABLE_EMSCRIPTEN_ENVIRONMENT_NODE
" I f u s i n g E m s c r i p t e n , b u i l d s t o r u n o n N o d e i n s t e a d o f W e b "
O F F " E N A B L E _ G L S L A N G _ J S A N D E M S C R I P T E N "
O F F )
2023-07-28 17:49:10 +00:00
option ( ENABLE_HLSL "Enables HLSL input support" ON )
2023-11-21 20:06:49 +00:00
option ( ENABLE_RTTI "Enables RTTI" )
option ( ENABLE_EXCEPTIONS "Enables Exceptions" )
2024-09-20 21:53:58 +00:00
CMAKE_DEPENDENT_OPTION ( ENABLE_OPT "Enables spirv-opt capability if present" ON "ENABLE_SPIRV" OFF )
2022-01-11 10:40:54 +00:00
2023-11-21 21:23:59 +00:00
if ( MINGW OR ( APPLE AND ${ CMAKE_CXX_COMPILER_ID } MATCHES "GNU" ) )
2022-01-11 10:40:54 +00:00
# Workaround for CMake behavior on Mac OS with gcc, cmake generates -Xarch_* arguments
# which gcc rejects
2023-11-22 21:50:04 +00:00
set ( ENABLE_PCH OFF )
message ( NOTICE "Disabling PCH" )
2022-01-11 10:40:54 +00:00
endif ( )
2023-11-22 21:50:04 +00:00
option ( ENABLE_PCH "Enables Precompiled header" ON )
2017-04-28 20:46:52 +00:00
2024-07-25 00:37:47 +00:00
if ( ENABLE_SPIRV )
add_compile_definitions ( ENABLE_SPIRV )
endif ( )
2017-01-09 22:10:14 +00:00
if ( ENABLE_HLSL )
2023-11-28 19:56:32 +00:00
add_compile_definitions ( ENABLE_HLSL )
2021-09-28 23:01:21 +00:00
endif ( )
2017-01-09 01:20:25 +00:00
2015-06-26 22:29:10 +00:00
if ( WIN32 )
2019-01-25 17:30:37 +00:00
set ( CMAKE_DEBUG_POSTFIX "d" )
2015-11-16 17:03:28 +00:00
add_definitions ( -DGLSLANG_OSINCLUDE_WIN32 )
2023-07-18 17:50:19 +00:00
elseif ( UNIX OR ANDROID )
2015-11-16 17:03:28 +00:00
add_definitions ( -DGLSLANG_OSINCLUDE_UNIX )
2021-09-28 23:01:21 +00:00
else ( )
2016-04-03 00:17:13 +00:00
message ( "unknown platform" )
2021-09-28 23:01:21 +00:00
endif ( )
2015-06-26 22:29:10 +00:00
2017-04-29 08:57:36 +00:00
if ( ${ CMAKE_CXX_COMPILER_ID } MATCHES "GNU" )
2024-02-19 23:46:46 +00:00
add_compile_options ( -Wall -Wmaybe-uninitialized -Wuninitialized -Wunused -Wunused-local-typedefs -Wimplicit-fallthrough
2019-10-15 15:17:53 +00:00
- W u n u s e d - p a r a m e t e r - W u n u s e d - v a l u e - W u n u s e d - v a r i a b l e - W u n u s e d - b u t - s e t - p a r a m e t e r - W u n u s e d - b u t - s e t - v a r i a b l e - f n o - e x c e p t i o n s )
2020-02-17 17:37:09 +00:00
if ( NOT ENABLE_RTTI )
add_compile_options ( -fno-rtti )
endif ( )
2020-05-21 05:55:24 +00:00
if ( NOT ENABLE_EXCEPTIONS )
add_compile_options ( -fno-exceptions )
endif ( )
2020-01-30 03:39:13 +00:00
if ( NOT CMAKE_CXX_COMPILER_VERSION VERSION_LESS "9.0.0" )
2019-10-18 14:28:53 +00:00
add_compile_options ( -Werror=deprecated-copy )
endif ( )
2020-06-29 12:46:26 +00:00
2023-11-21 21:18:58 +00:00
if ( NOT ( CMAKE_SYSTEM_NAME STREQUAL "OpenBSD" ) )
if ( NOT APPLE )
# Error if there's symbols that are not found at link time.
add_link_options ( "-Wl,--no-undefined" )
endif ( )
2020-07-03 14:41:03 +00:00
endif ( )
2020-04-10 08:39:16 +00:00
elseif ( ${ CMAKE_CXX_COMPILER_ID } MATCHES "Clang" AND NOT MSVC )
2024-02-19 23:46:46 +00:00
add_compile_options ( -Wall -Wuninitialized -Wunused -Wunused-local-typedefs -Wimplicit-fallthrough
2019-10-15 15:17:53 +00:00
- W u n u s e d - p a r a m e t e r - W u n u s e d - v a l u e - W u n u s e d - v a r i a b l e )
2020-02-17 17:37:09 +00:00
if ( NOT ENABLE_RTTI )
add_compile_options ( -fno-rtti )
endif ( )
2020-05-21 05:55:24 +00:00
if ( NOT ENABLE_EXCEPTIONS )
add_compile_options ( -fno-exceptions )
endif ( )
2020-06-29 12:46:26 +00:00
2023-11-21 21:18:58 +00:00
if ( NOT ( CMAKE_SYSTEM_NAME MATCHES "OpenBSD|Emscripten" ) )
2023-07-20 16:46:47 +00:00
# Error if there's symbols that are not found at link time. Some linkers do not support this flag.
2023-11-21 21:18:58 +00:00
if ( NOT APPLE )
2022-12-08 23:41:03 +00:00
add_link_options ( "-Wl,--no-undefined" )
2022-05-24 19:31:03 +00:00
endif ( )
2020-07-03 14:41:03 +00:00
endif ( )
2020-04-10 08:39:16 +00:00
elseif ( MSVC )
2020-02-17 17:37:09 +00:00
if ( NOT ENABLE_RTTI )
2020-06-23 18:57:43 +00:00
string ( FIND "${CMAKE_CXX_FLAGS}" "/GR" MSVC_HAS_GR )
if ( MSVC_HAS_GR )
2021-01-05 09:25:24 +00:00
string ( REGEX REPLACE "/GR" "/GR-" CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS}" )
2020-06-23 18:57:43 +00:00
else ( )
add_compile_options ( /GR- ) # Disable RTTI
endif ( )
2020-02-17 17:37:09 +00:00
endif ( )
2020-05-21 05:55:24 +00:00
if ( ENABLE_EXCEPTIONS )
add_compile_options ( /EHsc ) # Enable Exceptions
2020-06-24 17:01:18 +00:00
else ( )
2021-08-08 16:00:26 +00:00
string ( REGEX REPLACE "/EHsc" "" CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS}" ) # Try to remove default /EHsc cxx_flag
2021-04-22 22:30:17 +00:00
add_compile_options ( /D_HAS_EXCEPTIONS=0 )
2020-05-21 05:55:24 +00:00
endif ( )
2017-04-29 08:57:36 +00:00
endif ( )
2023-11-29 19:58:56 +00:00
# NOTE we could potentially replace this logic with COMPILE_WARNING_AS_ERROR if cmake minimum is bumped to >= 3.24
if ( BUILD_WERROR )
if ( NOT MSVC )
add_compile_options ( -Werror )
else ( )
add_compile_options ( /WX )
endif ( )
endif ( )
2020-02-06 21:36:52 +00:00
if ( ENABLE_GLSLANG_JS )
if ( MSVC )
add_compile_options ( /Os /GR- )
else ( )
2020-05-21 05:55:24 +00:00
add_compile_options ( -Os -fno-rtti -fno-exceptions )
2020-04-10 08:39:16 +00:00
if ( ${ CMAKE_CXX_COMPILER_ID } MATCHES "Clang" AND NOT MSVC )
2020-03-23 19:26:53 +00:00
add_compile_options ( -Wno-unused-parameter )
add_compile_options ( -Wno-unused-variable -Wno-unused-const-variable )
endif ( )
2020-02-06 21:36:52 +00:00
endif ( )
2021-09-28 23:01:21 +00:00
endif ( )
2019-08-08 17:50:13 +00:00
2023-03-15 23:41:29 +00:00
# Request C++17
set ( CMAKE_CXX_STANDARD 17 )
set ( CMAKE_CXX_STANDARD_REQUIRED ON )
set ( CMAKE_CXX_EXTENSIONS OFF )
2015-06-26 22:29:10 +00:00
2016-06-02 18:37:24 +00:00
function ( glslang_set_link_args TARGET )
# For MinGW compiles, statically link against the GCC and C++ runtimes.
# This avoids the need to ship those runtimes as DLLs.
2023-07-19 23:29:55 +00:00
# This is supported by GCC and Clang.
if ( WIN32 AND NOT MSVC )
2017-04-29 08:57:36 +00:00
set_target_properties ( ${ TARGET } PROPERTIES
L I N K _ F L A G S " - s t a t i c - s t a t i c - l i b g c c - s t a t i c - l i b s t d c + + " )
endif ( )
2016-06-02 18:37:24 +00:00
endfunction ( glslang_set_link_args )
Generate build information from CHANGES.md
This PR significantly reworks the way glslang is versioned.
Instead of committing changes to the `GLSLANG_MINOR_VERSION` define in
`glslang/Public/ShaderLang.h`, and using `make-revision` to generate
`GLSLANG_PATCH_LEVEL` in `glslang/Include/revision.h`, all version
information is now derived from the new `CHANGES.md` file.
`CHANGES.md` acts as the single source of truth for glslang version
information, along with a convenient place to put all release notes for
each notable change made.
`CHANGES.md` is parsed using the new `build_info.py` python script.
This script can read basic template files to produce new source files,
which it does to read the new `build_info.h.tmpl` to generate (at build
time) a glslang private header at
`<build-dir>/include/glslang/build_info.h`.
I've written generators for each of the CMake, Bazel, gn, and
`Android.mk` build scripts.
The new version code conforms to the Semantic Versioning 2.0 spec.
This new version is also used by the CMake rules to produce versioned
shared objects, including a major-versioned SONAME.
New APIs:
---------
* `glslang::GetVersion()` returns a `Version` struct with the version
major, minor, patch and flavor.
Breaking API changes:
---------------------
* The public defines `GLSLANG_MINOR_VERSION` and `GLSLANG_PATCH_LEVEL`
have been entirely removed.
* `glslang/Public/ShaderLang.h` and `glslang/Include/revision.h` have
been deleted.
* Instead, `<build-dir>/include/glslang/build_info.h` is created in
the build directory, and `<build-dir>/include` is a CMake `PUBLIC`
(dependee-inherited) include directory for the glslang targets.
* `<build-dir>/include/glslang/build_info.h` contains the following
new #defines:
`GLSLANG_VERSION_MAJOR`, `GLSLANG_VERSION_MINOR`,
`GLSLANG_VERSION_PATCH`, `GLSLANG_VERSION_FLAVOR`,
`GLSLANG_VERSION_GREATER_THAN(major, minor, patch)`,
`GLSLANG_VERSION_GREATER_OR_EQUAL_TO(major, minor, patch)`,
`GLSLANG_VERSION_LESS_THAN(major, minor, patch)`,
`GLSLANG_VERSION_LESS_OR_EQUAL_TO(major, minor, patch)`
* The CMake install output directory contains a copy of
`build_info.h` at: `include/glslang/build_info.h`
* Python3 is now always required to build glslang (likely always
required for transitive dependency builds).
2020-06-17 10:17:19 +00:00
# Root directory for build-time generated include files
set ( GLSLANG_GENERATED_INCLUDEDIR "${CMAKE_BINARY_DIR}/include" )
################################################################################
# Build version information generation
################################################################################
2021-02-07 12:37:03 +00:00
include ( parse_version.cmake )
2020-07-10 13:39:39 +00:00
set ( GLSLANG_CHANGES_FILE "${CMAKE_CURRENT_SOURCE_DIR}/CHANGES.md" )
set ( GLSLANG_BUILD_INFO_H_TMPL "${CMAKE_CURRENT_SOURCE_DIR}/build_info.h.tmpl" )
Generate build information from CHANGES.md
This PR significantly reworks the way glslang is versioned.
Instead of committing changes to the `GLSLANG_MINOR_VERSION` define in
`glslang/Public/ShaderLang.h`, and using `make-revision` to generate
`GLSLANG_PATCH_LEVEL` in `glslang/Include/revision.h`, all version
information is now derived from the new `CHANGES.md` file.
`CHANGES.md` acts as the single source of truth for glslang version
information, along with a convenient place to put all release notes for
each notable change made.
`CHANGES.md` is parsed using the new `build_info.py` python script.
This script can read basic template files to produce new source files,
which it does to read the new `build_info.h.tmpl` to generate (at build
time) a glslang private header at
`<build-dir>/include/glslang/build_info.h`.
I've written generators for each of the CMake, Bazel, gn, and
`Android.mk` build scripts.
The new version code conforms to the Semantic Versioning 2.0 spec.
This new version is also used by the CMake rules to produce versioned
shared objects, including a major-versioned SONAME.
New APIs:
---------
* `glslang::GetVersion()` returns a `Version` struct with the version
major, minor, patch and flavor.
Breaking API changes:
---------------------
* The public defines `GLSLANG_MINOR_VERSION` and `GLSLANG_PATCH_LEVEL`
have been entirely removed.
* `glslang/Public/ShaderLang.h` and `glslang/Include/revision.h` have
been deleted.
* Instead, `<build-dir>/include/glslang/build_info.h` is created in
the build directory, and `<build-dir>/include` is a CMake `PUBLIC`
(dependee-inherited) include directory for the glslang targets.
* `<build-dir>/include/glslang/build_info.h` contains the following
new #defines:
`GLSLANG_VERSION_MAJOR`, `GLSLANG_VERSION_MINOR`,
`GLSLANG_VERSION_PATCH`, `GLSLANG_VERSION_FLAVOR`,
`GLSLANG_VERSION_GREATER_THAN(major, minor, patch)`,
`GLSLANG_VERSION_GREATER_OR_EQUAL_TO(major, minor, patch)`,
`GLSLANG_VERSION_LESS_THAN(major, minor, patch)`,
`GLSLANG_VERSION_LESS_OR_EQUAL_TO(major, minor, patch)`
* The CMake install output directory contains a copy of
`build_info.h` at: `include/glslang/build_info.h`
* Python3 is now always required to build glslang (likely always
required for transitive dependency builds).
2020-06-17 10:17:19 +00:00
set ( GLSLANG_BUILD_INFO_H "${GLSLANG_GENERATED_INCLUDEDIR}/glslang/build_info.h" )
2021-02-07 12:37:03 +00:00
parse_version ( ${ GLSLANG_CHANGES_FILE } GLSLANG )
function ( configurate_version )
set ( major ${ GLSLANG_VERSION_MAJOR } )
set ( minor ${ GLSLANG_VERSION_MINOR } )
set ( patch ${ GLSLANG_VERSION_PATCH } )
set ( flavor ${ GLSLANG_VERSION_FLAVOR } )
configure_file ( ${ GLSLANG_BUILD_INFO_H_TMPL } ${ GLSLANG_BUILD_INFO_H } @ONLY )
endfunction ( )
configurate_version ( )
Generate build information from CHANGES.md
This PR significantly reworks the way glslang is versioned.
Instead of committing changes to the `GLSLANG_MINOR_VERSION` define in
`glslang/Public/ShaderLang.h`, and using `make-revision` to generate
`GLSLANG_PATCH_LEVEL` in `glslang/Include/revision.h`, all version
information is now derived from the new `CHANGES.md` file.
`CHANGES.md` acts as the single source of truth for glslang version
information, along with a convenient place to put all release notes for
each notable change made.
`CHANGES.md` is parsed using the new `build_info.py` python script.
This script can read basic template files to produce new source files,
which it does to read the new `build_info.h.tmpl` to generate (at build
time) a glslang private header at
`<build-dir>/include/glslang/build_info.h`.
I've written generators for each of the CMake, Bazel, gn, and
`Android.mk` build scripts.
The new version code conforms to the Semantic Versioning 2.0 spec.
This new version is also used by the CMake rules to produce versioned
shared objects, including a major-versioned SONAME.
New APIs:
---------
* `glslang::GetVersion()` returns a `Version` struct with the version
major, minor, patch and flavor.
Breaking API changes:
---------------------
* The public defines `GLSLANG_MINOR_VERSION` and `GLSLANG_PATCH_LEVEL`
have been entirely removed.
* `glslang/Public/ShaderLang.h` and `glslang/Include/revision.h` have
been deleted.
* Instead, `<build-dir>/include/glslang/build_info.h` is created in
the build directory, and `<build-dir>/include` is a CMake `PUBLIC`
(dependee-inherited) include directory for the glslang targets.
* `<build-dir>/include/glslang/build_info.h` contains the following
new #defines:
`GLSLANG_VERSION_MAJOR`, `GLSLANG_VERSION_MINOR`,
`GLSLANG_VERSION_PATCH`, `GLSLANG_VERSION_FLAVOR`,
`GLSLANG_VERSION_GREATER_THAN(major, minor, patch)`,
`GLSLANG_VERSION_GREATER_OR_EQUAL_TO(major, minor, patch)`,
`GLSLANG_VERSION_LESS_THAN(major, minor, patch)`,
`GLSLANG_VERSION_LESS_OR_EQUAL_TO(major, minor, patch)`
* The CMake install output directory contains a copy of
`build_info.h` at: `include/glslang/build_info.h`
* Python3 is now always required to build glslang (likely always
required for transitive dependency builds).
2020-06-17 10:17:19 +00:00
# glslang_add_build_info_dependency() adds the glslang-build-info dependency and
# generated include directories to target.
function ( glslang_add_build_info_dependency target )
target_include_directories ( ${ target } PUBLIC $< BUILD_INTERFACE:${GLSLANG_GENERATED_INCLUDEDIR} > )
endfunction ( )
2019-05-09 09:43:26 +00:00
2020-06-29 13:20:19 +00:00
# glslang_only_export_explicit_symbols() makes the symbol visibility hidden by
2020-07-31 06:09:17 +00:00
# default for <target> when building shared libraries, and sets the
# GLSLANG_IS_SHARED_LIBRARY define, and GLSLANG_EXPORTING to 1 when specifically
# building <target>.
2020-06-29 13:20:19 +00:00
function ( glslang_only_export_explicit_symbols target )
if ( BUILD_SHARED_LIBS )
2020-07-02 14:54:40 +00:00
target_compile_definitions ( ${ target } PUBLIC "GLSLANG_IS_SHARED_LIBRARY=1" )
2024-09-18 16:39:16 +00:00
set_target_properties ( ${ target } PROPERTIES CXX_VISIBILITY_PRESET hidden )
set_target_properties ( ${ target } PROPERTIES C_VISIBILITY_PRESET hidden )
2020-06-29 13:20:19 +00:00
if ( WIN32 )
target_compile_definitions ( ${ target } PRIVATE "GLSLANG_EXPORTING=1" )
endif ( )
endif ( )
endfunction ( )
2020-07-07 12:24:04 +00:00
# glslang_pch() adds precompiled header rules to <target> for the pre-compiled
# header file <pch>. As target_precompile_headers() was added in CMake 3.16,
# this is a no-op if called on earlier versions of CMake.
2023-11-22 21:50:04 +00:00
function ( glslang_pch target pch )
2020-08-21 15:44:06 +00:00
if ( ENABLE_PCH )
2023-11-22 21:50:04 +00:00
target_precompile_headers ( ${ target } PRIVATE ${ pch } )
2020-08-21 15:44:06 +00:00
endif ( )
2023-11-22 21:50:04 +00:00
endfunction ( )
2020-07-07 12:24:04 +00:00
Generate build information from CHANGES.md
This PR significantly reworks the way glslang is versioned.
Instead of committing changes to the `GLSLANG_MINOR_VERSION` define in
`glslang/Public/ShaderLang.h`, and using `make-revision` to generate
`GLSLANG_PATCH_LEVEL` in `glslang/Include/revision.h`, all version
information is now derived from the new `CHANGES.md` file.
`CHANGES.md` acts as the single source of truth for glslang version
information, along with a convenient place to put all release notes for
each notable change made.
`CHANGES.md` is parsed using the new `build_info.py` python script.
This script can read basic template files to produce new source files,
which it does to read the new `build_info.h.tmpl` to generate (at build
time) a glslang private header at
`<build-dir>/include/glslang/build_info.h`.
I've written generators for each of the CMake, Bazel, gn, and
`Android.mk` build scripts.
The new version code conforms to the Semantic Versioning 2.0 spec.
This new version is also used by the CMake rules to produce versioned
shared objects, including a major-versioned SONAME.
New APIs:
---------
* `glslang::GetVersion()` returns a `Version` struct with the version
major, minor, patch and flavor.
Breaking API changes:
---------------------
* The public defines `GLSLANG_MINOR_VERSION` and `GLSLANG_PATCH_LEVEL`
have been entirely removed.
* `glslang/Public/ShaderLang.h` and `glslang/Include/revision.h` have
been deleted.
* Instead, `<build-dir>/include/glslang/build_info.h` is created in
the build directory, and `<build-dir>/include` is a CMake `PUBLIC`
(dependee-inherited) include directory for the glslang targets.
* `<build-dir>/include/glslang/build_info.h` contains the following
new #defines:
`GLSLANG_VERSION_MAJOR`, `GLSLANG_VERSION_MINOR`,
`GLSLANG_VERSION_PATCH`, `GLSLANG_VERSION_FLAVOR`,
`GLSLANG_VERSION_GREATER_THAN(major, minor, patch)`,
`GLSLANG_VERSION_GREATER_OR_EQUAL_TO(major, minor, patch)`,
`GLSLANG_VERSION_LESS_THAN(major, minor, patch)`,
`GLSLANG_VERSION_LESS_OR_EQUAL_TO(major, minor, patch)`
* The CMake install output directory contains a copy of
`build_info.h` at: `include/glslang/build_info.h`
* Python3 is now always required to build glslang (likely always
required for transitive dependency builds).
2020-06-17 10:17:19 +00:00
if ( BUILD_EXTERNAL AND IS_DIRECTORY ${ CMAKE_CURRENT_SOURCE_DIR } /External )
# We depend on these for later projects, so they should come first.
add_subdirectory ( External )
endif ( )
2024-02-19 16:26:07 +00:00
option ( ALLOW_EXTERNAL_SPIRV_TOOLS "Allows to build against installed SPIRV-Tools-opt. This is unsupported if the commit isn't the one in known_good.json" )
2017-09-21 22:50:39 +00:00
if ( NOT TARGET SPIRV-Tools-opt )
2023-03-03 17:20:24 +00:00
if ( ALLOW_EXTERNAL_SPIRV_TOOLS )
# Look for external SPIR-V Tools build, if not building in-tree
2023-08-09 23:00:04 +00:00
message ( STATUS "Trying to find local SPIR-V tools" )
2023-03-03 17:20:24 +00:00
find_package ( SPIRV-Tools-opt )
2023-08-09 23:00:04 +00:00
if ( NOT TARGET SPIRV-Tools-opt )
if ( ENABLE_OPT )
message ( WARNING "ENABLE_OPT set but SPIR-V tools not found! Disabling SPIR-V optimization." )
endif ( )
set ( ENABLE_OPT OFF )
endif ( )
else ( )
if ( ENABLE_OPT )
message ( SEND_ERROR "ENABLE_OPT set but SPIR-V tools not found. Please run update_glslang_sources.py, "
" s e t t h e A L L O W _ E X T E R N A L _ S P I R V _ T O O L S o p t i o n t o u s e a l o c a l i n s t a l l o f S P I R V - T o o l s , o r s e t E N A B L E _ O P T = 0 . " )
endif ( )
2023-03-03 17:20:24 +00:00
endif ( )
2017-09-21 22:50:39 +00:00
endif ( )
if ( ENABLE_OPT )
message ( STATUS "optimizer enabled" )
2018-03-29 17:49:14 +00:00
add_definitions ( -DENABLE_OPT=1 )
2018-04-06 01:52:38 +00:00
else ( )
if ( ENABLE_HLSL )
message ( STATUS "spirv-tools not linked - illegal SPIRV may be generated for HLSL" )
endif ( )
2018-03-29 17:49:14 +00:00
add_definitions ( -DENABLE_OPT=0 )
2017-09-21 22:50:39 +00:00
endif ( )
2024-07-25 00:37:47 +00:00
if ( ENABLE_SPIRV )
add_subdirectory ( SPIRV )
endif ( )
2015-06-26 22:29:10 +00:00
add_subdirectory ( glslang )
2016-12-20 00:56:00 +00:00
if ( ENABLE_GLSLANG_BINARIES )
2017-04-29 08:57:36 +00:00
add_subdirectory ( StandAlone )
2016-12-20 00:56:00 +00:00
endif ( )
2023-11-30 19:33:36 +00:00
2024-02-12 21:53:15 +00:00
if ( GLSLANG_TESTS )
enable_testing ( )
add_subdirectory ( gtests )
2019-10-15 19:21:21 +00:00
2024-02-12 21:53:15 +00:00
# glslang-testsuite runs a bash script on Windows.
# Make sure to use '-o igncr' flag to ignore carriage returns (\r).
set ( IGNORE_CR_FLAG "" )
if ( WIN32 )
set ( IGNORE_CR_FLAG -o igncr )
endif ( )
2019-10-15 19:21:21 +00:00
2024-02-12 21:53:15 +00:00
if ( CMAKE_CONFIGURATION_TYPES )
set ( RESULTS_PATH ${ CMAKE_CURRENT_BINARY_DIR } / $< CONFIG > /localResults )
set ( VALIDATOR_PATH ${ CMAKE_CURRENT_BINARY_DIR } /StandAlone/ $< CONFIG > /glslang )
set ( REMAP_PATH ${ CMAKE_CURRENT_BINARY_DIR } /StandAlone/ $< CONFIG > /spirv-remap )
else ( )
set ( RESULTS_PATH ${ CMAKE_CURRENT_BINARY_DIR } /localResults )
set ( VALIDATOR_PATH ${ CMAKE_CURRENT_BINARY_DIR } /StandAlone/glslang )
set ( REMAP_PATH ${ CMAKE_CURRENT_BINARY_DIR } /StandAlone/spirv-remap )
2021-09-28 23:01:21 +00:00
endif ( )
2019-10-16 17:08:48 +00:00
2024-02-12 21:53:15 +00:00
add_test ( NAME glslang-testsuite
C O M M A N D b a s h $ { I G N O R E _ C R _ F L A G } r u n t e s t s $ { R E S U L T S _ P A T H } $ { V A L I D A T O R _ P A T H } $ { R E M A P _ P A T H }
W O R K I N G _ D I R E C T O R Y $ { C M A K E _ C U R R E N T _ S O U R C E _ D I R } / T e s t / )
endif ( GLSLANG_TESTS )
if ( GLSLANG_ENABLE_INSTALL )
2022-08-03 00:16:03 +00:00
file ( WRITE "${CMAKE_CURRENT_BINARY_DIR}/glslang-config.cmake.in" [=[
@ P A C K A G E _ I N I T @
2024-01-24 21:34:14 +00:00
include ( CMakeFindDependencyMacro )
if ( @ENABLE_OPT@ )
find_dependency ( SPIRV-Tools-opt )
endif ( )
2023-03-24 14:18:09 +00:00
@ I N S T A L L _ C O N F I G _ U N I X @
2022-08-03 00:16:03 +00:00
include ( "@PACKAGE_PATH_EXPORT_TARGETS@" )
] = ] )
2023-03-24 14:18:09 +00:00
2022-09-13 13:33:16 +00:00
set ( PATH_EXPORT_TARGETS "${CMAKE_INSTALL_LIBDIR}/cmake/${PROJECT_NAME}/glslang-targets.cmake" )
2023-03-24 14:18:09 +00:00
if ( UNIX OR "${CMAKE_SYSTEM_NAME}" STREQUAL "Fuchsia" )
set ( INSTALL_CONFIG_UNIX [=[
set ( THREADS_PREFER_PTHREAD_FLAG ON )
2024-01-24 21:34:14 +00:00
find_dependency ( Threads )
2023-03-24 14:18:09 +00:00
] = ] )
endif ( )
2022-08-03 00:16:03 +00:00
configure_package_config_file (
" $ { C M A K E _ C U R R E N T _ B I N A R Y _ D I R } / g l s l a n g - c o n f i g . c m a k e . i n "
" $ { C M A K E _ C U R R E N T _ B I N A R Y _ D I R } / g l s l a n g - c o n f i g . c m a k e "
P A T H _ V A R S
P A T H _ E X P O R T _ T A R G E T S
2022-09-13 13:33:16 +00:00
I N S T A L L _ D E S T I N A T I O N $ { C M A K E _ I N S T A L L _ L I B D I R } / c m a k e / $ { P R O J E C T _ N A M E }
2022-08-03 00:16:03 +00:00
)
2023-07-28 17:49:10 +00:00
2022-08-03 00:16:03 +00:00
write_basic_package_version_file ( "${CMAKE_CURRENT_BINARY_DIR}/glslang-config-version.cmake"
V E R S I O N $ { G L S L A N G _ V E R S I O N }
C O M P A T I B I L I T Y S a m e M a j o r V e r s i o n
)
2023-07-28 17:49:10 +00:00
2022-08-03 00:16:03 +00:00
install (
E X P O R T g l s l a n g - t a r g e t s
N A M E S P A C E " g l s l a n g : : "
2022-09-13 13:33:16 +00:00
D E S T I N A T I O N " $ { C M A K E _ I N S T A L L _ L I B D I R } / c m a k e / $ { P R O J E C T _ N A M E } "
2022-08-03 00:16:03 +00:00
)
2023-07-28 17:49:10 +00:00
2022-08-03 00:16:03 +00:00
install (
F I L E S
" $ { C M A K E _ C U R R E N T _ B I N A R Y _ D I R } / g l s l a n g - c o n f i g . c m a k e "
" $ { C M A K E _ C U R R E N T _ B I N A R Y _ D I R } / g l s l a n g - c o n f i g - v e r s i o n . c m a k e "
D E S T I N A T I O N
2022-09-13 13:33:16 +00:00
" $ { C M A K E _ I N S T A L L _ L I B D I R } / c m a k e / $ { P R O J E C T _ N A M E } "
2022-08-03 00:16:03 +00:00
)
2024-02-12 21:53:15 +00:00
endif ( GLSLANG_ENABLE_INSTALL )