mirror of
https://github.com/OpenTTD/OpenTTD.git
synced 2025-08-25 23:49:09 +00:00
.github
bin
cmake
scripts
Baseset.cmake
CreateGRF.cmake
Desktop.cmake
FindVersion.cmake
GenerateWidget.cmake
Regression.cmake
SquirrelExport.cmake
SquirrelIncludes.cmake
AddCustomXXXTimestamp.cmake
Catch.cmake
CatchAddTests.cmake
CheckAtomic.cmake
CompileFlags.cmake
CreateGrfCommand.cmake
CreateRegression.cmake
Endian.cmake
FindAllegro.cmake
FindEditbin.cmake
FindFluidsynth.cmake
FindFontconfig.cmake
FindGrfcodec.cmake
FindHarfbuzz.cmake
FindICU.cmake
FindIconv.cmake
FindLZO.cmake
FindPandoc.cmake
FindSSE.cmake
FindXaudio2.cmake
InstallAndPackage.cmake
LinkPackage.cmake
MSVCFilters.cmake
Options.cmake
PackageBundle.cmake
PackageDeb.cmake
PackageNSIS.cmake
PackageRPM.cmake
SourceList.cmake
Static.cmake
docs
media
os
regression
src
.dorpsgek.yml
.editorconfig
.gitignore
CMakeLists.txt
CODINGSTYLE.md
COMPILING.md
CONTRIBUTING.md
COPYING.md
CPackProperties.cmake.in
CREDITS.md
Doxyfile.in
README.md
changelog.txt
known-bugs.txt
125 lines
4.7 KiB
CMake
125 lines
4.7 KiB
CMake
cmake_minimum_required(VERSION 3.5)
|
|
|
|
#
|
|
# CMake script to automatically generate the enums in script_window.hpp
|
|
#
|
|
# The file is scanned for @enum tokens, and the placeholder is filled with an enum from a different file.
|
|
#
|
|
# Example:
|
|
# // @enum enumname filename@placeholder@
|
|
# ... content here is replaced ...
|
|
# // @endenum
|
|
#
|
|
# The parameter "enumname" specifies the enumeration to extract. This can also be a regular expression.
|
|
# The parameter "filename" specifies the relative path to the file, where the enumeration is extracted from. This can also be a glob expression.
|
|
#
|
|
# All files where enumerations are extracted from are automatically added via #include
|
|
#
|
|
|
|
if(NOT GENERATE_SOURCE_FILE)
|
|
message(FATAL_ERROR "Script needs GENERATE_SOURCE_FILE defined")
|
|
endif()
|
|
if(NOT GENERATE_BINARY_FILE)
|
|
message(FATAL_ERROR "Script needs GENERATE_BINARY_FILE defined")
|
|
endif()
|
|
|
|
file(STRINGS ${GENERATE_SOURCE_FILE} ENUM_LINES REGEX "@enum")
|
|
|
|
foreach(ENUM IN LISTS ENUM_LINES)
|
|
string(REGEX REPLACE "^( )// @enum ([^ ]+) ([^ ]+)@([^ ]+)@" "\\4" PLACE_HOLDER "${ENUM}")
|
|
set(ADD_INDENT "${CMAKE_MATCH_1}")
|
|
set(ENUM_PATTERN "${CMAKE_MATCH_2}")
|
|
|
|
file(GLOB FILENAMES "${CMAKE_MATCH_3}")
|
|
list(SORT FILENAMES)
|
|
|
|
foreach(FILE IN LISTS FILENAMES)
|
|
unset(ACTIVE)
|
|
unset(ACTIVE_COMMENT)
|
|
unset(COMMENT)
|
|
|
|
file(STRINGS ${FILE} SOURCE_LINES)
|
|
|
|
string(REPLACE "${CMAKE_CURRENT_SOURCE_DIR}/" "" FILE ${FILE})
|
|
string(APPEND ${PLACE_HOLDER} "\n${ADD_INDENT}/* automatically generated from ${FILE} */")
|
|
list(APPEND INCLUDES "#include \"${FILE}\"")
|
|
|
|
foreach(LINE IN LISTS SOURCE_LINES)
|
|
string(REPLACE "${RM_INDENT}" "" LINE "${LINE}")
|
|
|
|
# Remember possible doxygen comment before enum declaration
|
|
if((NOT ACTIVE) AND "${LINE}" MATCHES "/\\*\\*")
|
|
set(COMMENT "${ADD_INDENT}${LINE}")
|
|
set(ACTIVE_COMMENT 1)
|
|
elseif(ACTIVE_COMMENT EQUAL 1)
|
|
string(APPEND COMMENT "\n${ADD_INDENT}${LINE}")
|
|
endif()
|
|
|
|
# Check for enum match
|
|
if("${LINE}" MATCHES "^ *enum *${ENUM_PATTERN} *\{")
|
|
# REGEX REPLACE does a REGEX MATCHALL and fails if an empty string is matched
|
|
string(REGEX MATCH "[^ ]*" RESULT "${LINE}")
|
|
string(REPLACE "${RESULT}" "" RM_INDENT "${LINE}")
|
|
|
|
set(ACTIVE 1)
|
|
if(ACTIVE_COMMENT GREATER 0)
|
|
string(APPEND ${PLACE_HOLDER} "\n${COMMENT}")
|
|
endif()
|
|
unset(ACTIVE_COMMENT)
|
|
unset(COMMENT)
|
|
endif()
|
|
|
|
# Forget doxygen comment, if no enum follows
|
|
if(ACTIVE_COMMENT EQUAL 2 AND NOT "${LINE}" STREQUAL "")
|
|
unset(ACTIVE_COMMENT)
|
|
unset(COMMENT)
|
|
endif()
|
|
if(ACTIVE_COMMENT EQUAL 1 AND "${LINE}" MATCHES "\\*/")
|
|
set(ACTIVE_COMMENT 2)
|
|
endif()
|
|
|
|
if(ACTIVE)
|
|
if("${LINE}" MATCHES "^ *[A-Za-z0-9_]* *[,=]")
|
|
# Transform enum values
|
|
# REGEX REPLACE does a REGEX MATCHALL and replaces too much
|
|
string(REGEX MATCH " *=[^,]*" RESULT "${LINE}")
|
|
string(REPLACE "${RESULT}" "" LINE "${LINE}")
|
|
|
|
string(REGEX REPLACE " *//" " //" LINE "${LINE}")
|
|
|
|
string(REGEX MATCH "^( *)([A-Za-z0-9_]+),(.*)" RESULT "${LINE}")
|
|
|
|
string(LENGTH "${CMAKE_MATCH_2}" LEN)
|
|
math(EXPR LEN "43 - ${LEN}")
|
|
unset(SPACES)
|
|
foreach(i RANGE ${LEN})
|
|
string(APPEND SPACES " ")
|
|
endforeach()
|
|
|
|
if(CMAKE_MATCH_3)
|
|
string(APPEND ${PLACE_HOLDER} "\n${ADD_INDENT}${CMAKE_MATCH_1}${CMAKE_MATCH_2}${SPACES} = ::${CMAKE_MATCH_2},${SPACES}${CMAKE_MATCH_3}")
|
|
else()
|
|
string(APPEND ${PLACE_HOLDER} "\n${ADD_INDENT}${CMAKE_MATCH_1}${CMAKE_MATCH_2}${SPACES} = ::${CMAKE_MATCH_2},")
|
|
endif()
|
|
elseif("${LINE}" STREQUAL "")
|
|
string(APPEND ${PLACE_HOLDER} "\n")
|
|
else()
|
|
string(APPEND ${PLACE_HOLDER} "\n${ADD_INDENT}${LINE}")
|
|
endif()
|
|
endif()
|
|
|
|
if("${LINE}" MATCHES "^ *\};")
|
|
if(ACTIVE)
|
|
string(APPEND ${PLACE_HOLDER} "\n")
|
|
endif()
|
|
unset(ACTIVE)
|
|
endif()
|
|
endforeach()
|
|
endforeach()
|
|
endforeach()
|
|
|
|
list(REMOVE_DUPLICATES INCLUDES)
|
|
string(REPLACE ";" "\n" INCLUDES "${INCLUDES}")
|
|
|
|
configure_file(${GENERATE_SOURCE_FILE} ${GENERATE_BINARY_FILE})
|