Skip to content

Commit

Permalink
Do not define AVIF_ENABLE_NODISCARD for avif.h
Browse files Browse the repository at this point in the history
Redefine the AVIF_ENABLE_NODISCARD cmake option to request rather than
require the AVIF_NODISCARD macro be defined as [[nodiscard]]. There are
two reasons:

1. The CMAKE_C_STANDARD variable merely requests the given version of
   the C standard. If the compiler doesn't support the requested version
   of the C standard, it "decays" to a previous version of the C
   standard. Making avif.h use [[nodiscard]] in this case will result in
   compilation errors.
2. In general avif.h should only test compiler predefined macros. The
   only exception is AVIF_DLL (ignoring the experimental feature
   macros.)
  • Loading branch information
wantehchang committed Aug 1, 2024
1 parent 39cf485 commit a4654aa
Show file tree
Hide file tree
Showing 2 changed files with 11 additions and 20 deletions.
28 changes: 10 additions & 18 deletions CMakeLists.txt
Original file line number Diff line number Diff line change
Expand Up @@ -33,8 +33,16 @@ include(FetchContent)
include(FindPkgConfig)
include(AvifExternalProjectUtils)

option(AVIF_ENABLE_NODISCARD "Add [[nodiscard]] to some functions. CMake must be at least 3.21 to request C23." OFF)

# Set C99 as the default
set(CMAKE_C_STANDARD 99)
if(AVIF_ENABLE_NODISCARD AND CMAKE_VERSION VERSION_GREATER_EQUAL 3.21.0)
# [[nodiscard]] requires C23. The supported value 23 for CMAKE_C_STANDARD
# was added in CMake version 3.21.
set(CMAKE_C_STANDARD 23)
else()
set(CMAKE_C_STANDARD 99)
endif()

# SOVERSION scheme: MAJOR.MINOR.PATCH
# If there was an incompatible interface change:
Expand All @@ -52,7 +60,6 @@ set(LIBRARY_SOVERSION ${LIBRARY_VERSION_MAJOR})
option(BUILD_SHARED_LIBS "Build shared avif library" ON)

option(AVIF_ENABLE_WERROR "Treat all compiler warnings as errors" OFF)
option(AVIF_ENABLE_NODISCARD "Add [[nodiscard]] to some functions. CMake must be at least 3.21 to force C23" OFF)

option(AVIF_ENABLE_EXPERIMENTAL_YCGCO_R "Enable experimental YCgCo-R matrix code" OFF)
option(AVIF_ENABLE_EXPERIMENTAL_GAIN_MAP
Expand Down Expand Up @@ -334,22 +341,6 @@ endif()

target_link_libraries(avif_obj PRIVATE avif_enable_warnings)

if(AVIF_ENABLE_NODISCARD)
if(CMAKE_VERSION VERSION_GREATER_EQUAL 3.21.0)
set(CMAKE_C_STANDARD 23)
set_property(TARGET avif_obj PROPERTY C_STANDARD 23)
else()
unset(CMAKE_C_STANDARD)
set_property(TARGET avif_obj PROPERTY C_STANDARD)
if(CMAKE_C_COMPILER_ID MATCHES "Clang" OR CMAKE_C_COMPILER_ID MATCHES "GNU")
target_compile_options(avif_obj PUBLIC $<BUILD_INTERFACE:$<$<COMPILE_LANGUAGE:C>:-std=gnu2x>>)
elseif(CMAKE_C_COMPILER_ID MATCHES "MSVC")
target_compile_options(avif_obj PUBLIC $<BUILD_INTERFACE:$<$<COMPILE_LANGUAGE:C>:/std:clatest>>)
endif()
endif()
target_compile_definitions(avif_obj PUBLIC $<BUILD_INTERFACE:AVIF_ENABLE_NODISCARD=1>)
endif()

if(AVIF_ENABLE_COVERAGE)
if(CMAKE_C_COMPILER_ID MATCHES "Clang" OR CMAKE_C_COMPILER_ID MATCHES "GNU")
message(STATUS "libavif: Enabling coverage for Clang")
Expand Down Expand Up @@ -592,6 +583,7 @@ if(AVIF_LIB_USE_CXX OR (AVIF_BUILD_APPS AND AVIF_ENABLE_EXPERIMENTAL_GAIN_MAP) O
)
enable_language(CXX)
if(AVIF_ENABLE_NODISCARD)
# [[nodiscard]] requires C++17.
set(CMAKE_CXX_STANDARD 17)
else()
set(CMAKE_CXX_STANDARD 14)
Expand Down
3 changes: 1 addition & 2 deletions include/avif/avif.h
Original file line number Diff line number Diff line change
Expand Up @@ -48,8 +48,7 @@ extern "C" {
#define AVIF_API
#endif // defined(AVIF_DLL)

#if defined(AVIF_ENABLE_NODISCARD) || (defined(__cplusplus) && __cplusplus >= 201703L) || \
(defined(__STDC_VERSION__) && __STDC_VERSION__ >= 202311L)
#if (defined(__cplusplus) && __cplusplus >= 201703L) || (defined(__STDC_VERSION__) && __STDC_VERSION__ >= 202311L)
#define AVIF_NODISCARD [[nodiscard]]
#else
// Starting with 3.9, clang allows defining the warn_unused_result attribute for enums.
Expand Down

0 comments on commit a4654aa

Please sign in to comment.