Files
o3de/cmake/FileUtil.cmake
T
AMZN-byrcolin c778606c89 Templates restricted (#6498)
* Templates/Restricted upgrade/fixes:
Fixed template storage format: templates now only store true relative paths and no longer save "origin" paths and "optional" has been removed, it was never used.
Upgraded all templates to new standard
Template system now correctly handles child objects: Child objects no longer have to specify restricted they inherit from parent
Restricted now operates at the object level and makes no assumptions about parent
Restricted templates can now be combined and seperated on creation
ly_get_list_relative_filename has been deprecated for o3de_pal_dir
All Gems/Projects/Templates updated to use new code

Signed-off-by: byrcolin <byrcolin@amazon.com>
2022-01-14 10:27:20 -08:00

182 lines
7.5 KiB
CMake

#
# Copyright (c) Contributors to the Open 3D Engine Project.
# For complete copyright and license terms please see the LICENSE at the root of this distribution.
#
# SPDX-License-Identifier: Apache-2.0 OR MIT
#
#
#! ly_include_cmake_file_list: includes a cmake file list
#
# Includes a .cmake file that contains a variable "FILE" with the list of files
# The function appends the list of files to the variable ALLFILES. Callers of this
# function can include multiple cmake file list files and then use ALLFILES as the
# source for libraries/binaries/etc. Files that need to be excluded from unity builds
# due to possible ODR violations will need to be set in the variable 'SKIP_UNITY_BUILD_INCLUSION_FILES'
# in the same .cmake file (regardless of whether unity builds are enabled or not)
#
# The function takes care of appending the path relative to the cmake list file
#
# \arg:file cmake file list to include
#
function(ly_include_cmake_file_list file)
set(UNITY_AUTO_EXCLUSIONS)
include(${file})
get_filename_component(file_path "${file}" PATH)
if(file_path)
foreach(f ${FILES})
cmake_path(IS_RELATIVE f is_relative)
if(is_relative)
string(PREPEND f ${file_path}/)
endif()
list(APPEND TRANSFORMED_FILES ${f})
endforeach()
set(FILES ${TRANSFORMED_FILES})
endif()
foreach(f ${FILES})
get_filename_component(absolute_path ${f} ABSOLUTE)
if(NOT EXISTS ${absolute_path})
message(SEND_ERROR "File ${absolute_path} referenced in ${file} not found")
endif()
# Automatically exclude any extensions marked for the current platform
if (PAL_TRAIT_BUILD_UNITY_EXCLUDE_EXTENSIONS)
get_filename_component(file_extension ${f} LAST_EXT)
if (${file_extension} IN_LIST PAL_TRAIT_BUILD_UNITY_EXCLUDE_EXTENSIONS)
list(APPEND UNITY_AUTO_EXCLUSIONS ${f})
endif()
endif()
endforeach()
list(APPEND FILES ${file}) # Add the _files.cmake to the list so it shows in the IDE
if(file_path)
foreach(f ${SKIP_UNITY_BUILD_INCLUSION_FILES})
cmake_path(IS_RELATIVE f is_relative)
if(is_relative)
string(PREPEND f ${file_path}/)
endif()
list(APPEND SKIP_UNITY_BUILD_INCLUSION_TRANSFORMED_FILES ${f})
endforeach()
set(SKIP_UNITY_BUILD_INCLUSION_FILES ${SKIP_UNITY_BUILD_INCLUSION_TRANSFORMED_FILES})
endif()
# Check if there are any files to exclude from unity groupings
foreach(f ${SKIP_UNITY_BUILD_INCLUSION_FILES})
get_filename_component(absolute_path ${f} ABSOLUTE)
if(NOT EXISTS ${absolute_path})
message(FATAL_ERROR "File ${absolute_path} for SKIP_UNITY_BUILD_INCLUSION_FILES referenced in ${file} not found")
endif()
if(NOT f IN_LIST FILES)
list(APPEND FILES ${f})
endif()
endforeach()
# Mark files tagged for unity build group exclusions for unity builds
if (LY_UNITY_BUILD)
set_source_files_properties(
${UNITY_AUTO_EXCLUSIONS}
${SKIP_UNITY_BUILD_INCLUSION_FILES}
PROPERTIES
SKIP_UNITY_BUILD_INCLUSION ON
)
endif()
set(ALLFILES ${ALLFILES} ${FILES} PARENT_SCOPE)
endfunction()
#! ly_source_groups_from_folders: creates source_group for files
#
# Uses the path to the files being passed to create source_gropups for them.
#
# \arg:files list of files to create source_group for
#
function(ly_source_groups_from_folders files)
foreach(file IN LISTS files)
if(IS_ABSOLUTE ${file})
file(RELATIVE_PATH file ${CMAKE_CURRENT_SOURCE_DIR} ${file})
endif()
get_filename_component(file_path "${file}" PATH)
string(REPLACE "/" "\\" file_filters "${file_path}")
source_group("${file_filters}" FILES "${file}")
endforeach()
endfunction()
#! ly_update_platform_settings: Function to generate a config-parseable file for cmake-project generation settings
#
# This generate a platform-specific, parseable config file that will live in the build directory specified during
# the cmake project generation. This will provide a bridge to non-cmake tools to read the platform-specific cmake
# project generation settings.
#
get_property(LY_PROJECTS_TARGET_NAME GLOBAL PROPERTY LY_PROJECTS_TARGET_NAME)
function(ly_update_platform_settings)
# Update the <platform>.last file to keep track of the recent build_dir
set(ly_platform_last_path "${CMAKE_BINARY_DIR}/platform.settings")
string(TIMESTAMP ly_last_generation_timestamp "%Y-%m-%dT%H:%M:%S")
file(WRITE ${ly_platform_last_path} "# Auto Generated from last cmake project generation (${ly_last_generation_timestamp})
[settings]
platform=${PAL_PLATFORM_NAME}
game_projects=${LY_PROJECTS_TARGET_NAME}
asset_deploy_mode=${LY_ASSET_DEPLOY_MODE}
asset_deploy_type=${LY_ASSET_DEPLOY_ASSET_TYPE}
override_pak_root=${LY_ASSET_OVERRIDE_PAK_FOLDER_ROOT}
")
endfunction()
#! ly_file_read: wrap to file(READ) that adds the file to configuration tracking
#
# file(READ) does not add file tracking. So changes to the file being read will not cause a cmake regeneration
#
function(ly_file_read path content)
unset(file_content)
file(READ ${path} file_content)
set(${content} ${file_content} PARENT_SCOPE)
set_property(DIRECTORY APPEND PROPERTY CMAKE_CONFIGURE_DEPENDS ${path})
endfunction()
#! ly_get_last_path_segment_concat_sha256 : Concatenates the last path segment of the absolute path
# with the first 8 characters of the absolute path SHA256 hash to make a unique relative path segment
function(ly_get_last_path_segment_concat_sha256 absolute_path output_path)
string(SHA256 target_source_hash ${absolute_path})
string(SUBSTRING ${target_source_hash} 0 8 target_source_hash)
cmake_path(GET absolute_path FILENAME last_path_segment)
cmake_path(SET last_path_segment_sha256_path "${last_path_segment}-${target_source_hash}")
set(${output_path} ${last_path_segment_sha256_path} PARENT_SCOPE)
endfunction()
#! ly_get_engine_relative_source_dir: Attempts to form a path relative to the BASE_DIRECTORY.
# If that fails the last path segment of the absolute_target_source_dir concatenated with a SHA256 hash to form a target directory
# \arg:BASE_DIRECTORY - Directory to base relative path against. Defaults to LY_ROOT_FOLDER
function(ly_get_engine_relative_source_dir absolute_target_source_dir output_source_dir)
set(options)
set(oneValueArgs BASE_DIRECTORY)
set(multiValueArgs)
cmake_parse_arguments(ly_get_engine_relative_source_dir "${options}" "${oneValueArgs}" "${multiValueArgs}" ${ARGN})
if(NOT ly_get_engine_relative_source_dir_BASE_DIRECTORY)
set(ly_get_engine_relative_source_dir_BASE_DIRECTORY ${LY_ROOT_FOLDER})
endif()
# Get a relative target source directory to the LY root folder if possible
# Otherwise use the final component name
cmake_path(IS_PREFIX LY_ROOT_FOLDER ${absolute_target_source_dir} is_target_source_dir_subdirectory_of_engine)
if(is_target_source_dir_subdirectory_of_engine)
cmake_path(RELATIVE_PATH absolute_target_source_dir BASE_DIRECTORY ${LY_ROOT_FOLDER} OUTPUT_VARIABLE relative_target_source_dir)
else()
ly_get_last_path_segment_concat_sha256(${absolute_target_source_dir} target_source_dir_last_path_segment)
unset(relative_target_source_dir)
cmake_path(APPEND relative_target_source_dir "External" ${target_source_dir_last_path_segment})
endif()
set(${output_source_dir} ${relative_target_source_dir} PARENT_SCOPE)
endfunction()