From a7a8faeefa2f015a4cd84e08263519561848208b Mon Sep 17 00:00:00 2001 From: Cosmin Truta Date: Fri, 11 Oct 2024 23:24:46 +0300 Subject: [PATCH] [libpng16] style: Add a cmake-format config file and satisfy cmake-lint Introduce CMake file linting, based on the cmakelang project by Josh Bialkowski (@cheshirekow). Fix various style issues in the CMake files: * Add the missing copyright header to PNGConfig.cmake. * Resolve a "missing docstring" warning raised by cmake-lint. * Rewrite all docstrings in the style of CMake's own documentation. * Fix whitespace inconsistencies. References: * https://pypi.org/project/cmakelang * https://github.com/cheshirekow/cmake_format This is a cherry-pick of commit c317fe31114d92d05d44bf98c9b559edf4656b9c from branch 'libpng18'. --- .cmake-format.yaml | 94 +++++++++++++++++++++++++++++++++++ CMakeLists.txt | 37 ++++++++------ scripts/cmake/PNGConfig.cmake | 43 ++++++++++------ 3 files changed, 143 insertions(+), 31 deletions(-) create mode 100644 .cmake-format.yaml diff --git a/.cmake-format.yaml b/.cmake-format.yaml new file mode 100644 index 000000000..81a5e2643 --- /dev/null +++ b/.cmake-format.yaml @@ -0,0 +1,94 @@ +# https://pypi.org/project/cmakelang +# https://github.com/cheshirekow/cmake_format + +# ---------------------- +# Options for formatting +# ---------------------- + +# How wide to allow formatted cmake files +# TODO: Reflow the CMake files to allow setting the maximum line width to 100. +line_width: 255 + +# How many spaces to tab for indent +tab_size: 2 + +# If true, lines are indented using tab characters (utf-8 0x09) instead of +# space characters (utf-8 0x20). In cases where the layout would +# require a fractional tab character, the behavior of the fractional +# indentation is governed by +use_tabchars: false + +# If is True, then the value of this variable indicates how +# fractional indentions are handled during whitespace replacement. If set to +# 'use-space', fractional indentation is left as spaces (utf-8 0x20). If set +# to `round-up` fractional indentation is replaced with a single tab character +# (utf-8 0x09) effectively shifting the column to the next tabstop +fractional_tab_policy: "use-space" + +# Enable comment markup parsing and reflow +enable_markup: false + +# ------------------- +# Options for linting +# ------------------- + +# Lint codes to disable +disabled_codes: [ + # TODO: + # Reconcile the CMake variable names with the patterns below, then + # re-enable the "invalid variable name XXX" messages. + "C0103", + + # A custom command with one output doesn't really need a comment because + # the default "generating XXX" is a good message already. + "C0113", +] + +# Regular expression pattern describing valid function names +function_pattern: "[0-9a-z_]+" + +# Regular expression pattern describing valid macro names +macro_pattern: "[0-9A-Z_]+" + +# Regular expression pattern describing valid names for variables with global +# (cache) scope +global_var_pattern: "[A-Z][0-9A-Z_]+" + +# Regular expression pattern describing valid names for variables with global +# scope (but internal semantic) +internal_var_pattern: "_[A-Z][0-9A-Z_]+" + +# Regular expression pattern describing valid names for variables with local +# scope +local_var_pattern: "[a-z][a-z0-9_]+" + +# Regular expression pattern describing valid names for privatedirectory +# variables +private_var_pattern: "_[0-9a-z_]+" + +# Regular expression pattern describing valid names for public directory +# variables +public_var_pattern: "[A-Z][0-9A-Z_]+" + +# Regular expression pattern describing valid names for function/macro +# arguments and loop variables. +argument_var_pattern: "[a-z][a-z0-9_]+" + +# Regular expression pattern describing valid names for keywords used in +# functions or macros +keyword_pattern: "[A-Z][0-9A-Z_]+" + +# In the heuristic for C0201, how many conditionals to match within a loop in +# before considering the loop a parser +max_conditionals_custom_parser: 2 + +# Require at least this many newlines between statements +min_statement_spacing: 1 + +# Require no more than this many newlines between statements +max_statement_spacing: 2 +max_returns: 6 +max_branches: 12 +max_arguments: 5 +max_localvars: 15 +max_statements: 50 diff --git a/CMakeLists.txt b/CMakeLists.txt index 77eafdb9c..e14276158 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -63,7 +63,7 @@ option(PNG_TESTS "Build the libpng tests" ON) # Same as above, but for the third-party tools. # Although these tools are targetted at development environments only, # the users are allowed to override the option to build by default. -if (ANDROID OR IOS) +if(ANDROID OR IOS) option(PNG_TOOLS "Build the libpng tools" OFF) else() option(PNG_TOOLS "Build the libpng tools" ON) @@ -92,7 +92,7 @@ option(PNG_HARDWARE_OPTIMIZATIONS "Enable hardware optimizations" ON) # to check CMAKE_OSX_ARCHITECTURES to identify which hardware-specific flags to # enable. Note that this will fail if you attempt to build a universal binary # in a single CMake invocation. -if (APPLE AND CMAKE_OSX_ARCHITECTURES) +if(APPLE AND CMAKE_OSX_ARCHITECTURES) string(TOLOWER "${CMAKE_OSX_ARCHITECTURES}" PNG_TARGET_ARCHITECTURE) else() string(TOLOWER "${CMAKE_SYSTEM_PROCESSOR}" PNG_TARGET_ARCHITECTURE) @@ -116,7 +116,9 @@ endif() find_package(ZLIB REQUIRED) -if(UNIX AND NOT APPLE AND NOT BEOS AND NOT HAIKU AND NOT EMSCRIPTEN) +if(UNIX + AND NOT (APPLE OR BEOS OR HAIKU) + AND NOT EMSCRIPTEN) find_library(M_LIBRARY m) if(M_LIBRARY) set(M_LIBRARY m) @@ -310,7 +312,7 @@ endif() endif(PNG_HARDWARE_OPTIMIZATIONS) option(ld-version-script "Enable linker version script" ON) -if(ld-version-script AND NOT ANDROID AND NOT APPLE) +if(ld-version-script AND NOT (ANDROID OR APPLE)) # Check if LD supports linker scripts. file(WRITE "${CMAKE_CURRENT_BINARY_DIR}/conftest.map" " VERS_1 { global: sym1; local: *; }; @@ -356,7 +358,7 @@ else() message(STATUS "Could not find an AWK-compatible program") endif() -if(NOT AWK OR ANDROID OR IOS) +if(NOT AWK OR (ANDROID OR IOS)) # No awk available to generate sources; use pre-built pnglibconf.h configure_file(${CMAKE_CURRENT_SOURCE_DIR}/scripts/pnglibconf.h.prebuilt ${CMAKE_CURRENT_BINARY_DIR}/pnglibconf.h) @@ -377,7 +379,7 @@ else() NEWLINE_STYLE LF) # Generate .chk from .out with awk: - # generate_chk(INPUT inputfile OUTPUT outputfile [DEPENDS dep1 [dep2...]]) + # generate_chk(INPUT OUTPUT [DEPENDS ...]) function(generate_chk) set(options) set(oneValueArgs INPUT OUTPUT) @@ -399,8 +401,8 @@ else() WORKING_DIRECTORY "${CMAKE_CURRENT_BINARY_DIR}") endfunction() - # Generate .out from .c with awk - # generate_out(INPUT inputfile OUTPUT outputfile [DEPENDS dep1 [dep2...]]) + # Generate .out from .c with awk: + # generate_out(INPUT OUTPUT [DEPENDS ...]) function(generate_out) set(options) set(oneValueArgs INPUT OUTPUT) @@ -422,8 +424,8 @@ else() WORKING_DIRECTORY "${CMAKE_CURRENT_BINARY_DIR}") endfunction() - # Generate specific source file with awk - # generate_source(OUTPUT outputfile [DEPENDS dep1 [dep2...]]) + # Generate specific source file with awk: + # generate_source(OUTPUT [DEPENDS ...]) function(generate_source) set(options) set(oneValueArgs OUTPUT) @@ -441,8 +443,8 @@ else() WORKING_DIRECTORY "${CMAKE_CURRENT_BINARY_DIR}") endfunction() - # Copy file - # generate_copy(INPUT inputfile OUTPUT outputfile [DEPENDS dep1 [dep2...]]) + # Copy file: + # generate_copy(INPUT OUTPUT [DEPENDS ...]) function(generate_copy) set(options) set(oneValueArgs INPUT OUTPUT) @@ -584,7 +586,7 @@ else() "${CMAKE_CURRENT_BINARY_DIR}/scripts/symbols.chk" png_scripts_symbols_chk "${CMAKE_CURRENT_BINARY_DIR}/scripts/symbols.out" png_scripts_symbols_out "${CMAKE_CURRENT_BINARY_DIR}/scripts/vers.out" png_scripts_vers_out) -endif(NOT AWK OR ANDROID OR IOS) +endif(NOT AWK OR (ANDROID OR IOS)) # List the source code files. set(libpng_public_hdrs @@ -598,7 +600,7 @@ set(libpng_private_hdrs pnginfo.h pngstruct.h ) -if(AWK AND NOT ANDROID AND NOT IOS) +if(AWK AND NOT (ANDROID OR IOS)) list(APPEND libpng_private_hdrs "${CMAKE_CURRENT_BINARY_DIR}/pngprefix.h") endif() set(libpng_sources @@ -769,6 +771,8 @@ endif() if(PNG_TESTS AND PNG_SHARED) enable_testing() + # Add a custom target to run a test: + # png_add_test(NAME COMMAND [OPTIONS ...] [FILES ...]) function(png_add_test) set(options) set(oneValueArgs NAME COMMAND) @@ -966,8 +970,9 @@ if(PNG_SHARED AND PNG_TOOLS) list(APPEND PNG_BIN_TARGETS png-fix-itxt) endif() -# Create a symlink from src to dest (if possible), or, alternatively, -# copy src to dest if different. +# Create a symlink that points to a target file (if symlinking is possible), +# or make a copy of the target file (if symlinking is not possible): +# create_symlink( [FILE | TARGET ]) function(create_symlink DEST_FILE) cmake_parse_arguments(_SYM "" "FILE;TARGET" "" ${ARGN}) if(NOT _SYM_FILE AND NOT _SYM_TARGET) diff --git a/scripts/cmake/PNGConfig.cmake b/scripts/cmake/PNGConfig.cmake index 3b6f646de..b569d4502 100644 --- a/scripts/cmake/PNGConfig.cmake +++ b/scripts/cmake/PNGConfig.cmake @@ -1,15 +1,28 @@ -include(CMakeFindDependencyMacro) - -find_dependency(ZLIB REQUIRED) - -include("${CMAKE_CURRENT_LIST_DIR}/PNGTargets.cmake") - -if(NOT TARGET PNG::PNG) - if(TARGET PNG::png_shared) - add_library(PNG::PNG INTERFACE IMPORTED) - target_link_libraries(PNG::PNG INTERFACE PNG::png_shared) - elseif(TARGET PNG::png_static) - add_library(PNG::PNG INTERFACE IMPORTED) - target_link_libraries(PNG::PNG INTERFACE PNG::png_static) - endif() -endif() +# PNGConfig.cmake +# CMake config file compatible with the FindPNG module. + +# Copyright (c) 2024 Cosmin Truta +# Written by Benjamin Buch, 2024 +# +# Use, modification and distribution are subject to +# the same licensing terms and conditions as libpng. +# Please see the copyright notice in png.h or visit +# http://libpng.org/pub/png/src/libpng-LICENSE.txt +# +# SPDX-License-Identifier: libpng-2.0 + +include(CMakeFindDependencyMacro) + +find_dependency(ZLIB REQUIRED) + +include("${CMAKE_CURRENT_LIST_DIR}/PNGTargets.cmake") + +if(NOT TARGET PNG::PNG) + if(TARGET PNG::png_shared) + add_library(PNG::PNG INTERFACE IMPORTED) + target_link_libraries(PNG::PNG INTERFACE PNG::png_shared) + elseif(TARGET PNG::png_static) + add_library(PNG::PNG INTERFACE IMPORTED) + target_link_libraries(PNG::PNG INTERFACE PNG::png_static) + endif() +endif()