[build] Support arbitrary framework directories

This is necessary for stubs for the CoreSimulator framework (needed for
Xcode), which lives in `/Library/Developer/PrivateFrameworks`.
This commit is contained in:
Ariel Abreu 2023-09-25 16:28:01 -04:00
parent 6a8943df80
commit 9d84a2a4fa
No known key found for this signature in database
GPG Key ID: 5B88AAAF4280706F
2 changed files with 38 additions and 16 deletions

View File

@ -7,7 +7,7 @@ define_property(TARGET PROPERTY DYLIB_INSTALL_NAME BRIEF_DOCS "Stores the DYLIB_
FULL_DOCS "Used to make reexporting child frameworks less painful.")
function(add_framework name)
cmake_parse_arguments(FRAMEWORK "CURRENT_VERSION;FAT;PRIVATE;IOSSUPPORT;CIRCULAR;NO_INSTALL" "VERSION;LINK_FLAGS;PARENT;PARENT_VERSION;TARGET_NAME;PARENT_COMPONENT"
cmake_parse_arguments(FRAMEWORK "CURRENT_VERSION;FAT;PRIVATE;IOSSUPPORT;CIRCULAR;NO_INSTALL" "VERSION;LINK_FLAGS;PARENT;PARENT_VERSION;TARGET_NAME;PARENT_COMPONENT;PARENT_DIR"
"SOURCES;DEPENDENCIES;CIRCULAR_DEPENDENCIES;RESOURCES;UPWARD_DEPENDENCIES;OBJECTS;STRONG_DEPENDENCIES" ${ARGN})
if (FRAMEWORK_NO_INSTALL)
@ -36,6 +36,16 @@ function(add_framework name)
set(sys_library_dir "System/Library")
endif (FRAMEWORK_IOSSUPPORT)
set(root_dir "/${sys_library_dir}/${dir_name}")
if (FRAMEWORK_PARENT_DIR)
set(root_dir "${FRAMEWORK_PARENT_DIR}")
endif()
if (NOT (root_dir MATCHES "^/"))
set(root_dir "/${root_dir}")
endif()
if(DEFINED FRAMEWORK_PARENT)
if(NOT DEFINED FRAMEWORK_PARENT_VERSION)
# 99% of the time it's version A
@ -47,12 +57,12 @@ function(add_framework name)
set(COMPONENT_ARG "")
endif()
InstallSymlink(Versions/Current/Frameworks
"${CMAKE_INSTALL_PREFIX}/libexec/darling/${sys_library_dir}/${dir_name}/${FRAMEWORK_PARENT}.framework/Frameworks"
"${CMAKE_INSTALL_PREFIX}/libexec/darling${root_dir}/${FRAMEWORK_PARENT}.framework/Frameworks"
${EXCLUDE_FROM_ALL_ARG} ${COMPONENT_ARG})
set(dir_name "${dir_name}/${FRAMEWORK_PARENT}.framework/Versions/${FRAMEWORK_PARENT_VERSION}/Frameworks")
set(root_dir "${root_dir}/${FRAMEWORK_PARENT}.framework/Versions/${FRAMEWORK_PARENT_VERSION}/Frameworks")
endif(DEFINED FRAMEWORK_PARENT)
set(DYLIB_INSTALL_NAME "/${sys_library_dir}/${dir_name}/${name}.framework/Versions/${FRAMEWORK_VERSION}/${name}")
set(DYLIB_INSTALL_NAME "${root_dir}/${name}.framework/Versions/${FRAMEWORK_VERSION}/${name}")
if (FRAMEWORK_CIRCULAR OR FRAMEWORK_CIRCULAR_DEPENDENCIES OR FRAMEWORK_UPWARD_DEPENDENCIES)
if (FRAMEWORK_FAT)
@ -98,11 +108,11 @@ function(add_framework name)
set_property(TARGET ${my_name} APPEND_STRING PROPERTY LINK_FLAGS " ${FRAMEWORK_LINK_FLAGS}")
endif (FRAMEWORK_LINK_FLAGS)
install(TARGETS ${my_name} DESTINATION "libexec/darling/${sys_library_dir}/${dir_name}/${name}.framework/Versions/${FRAMEWORK_VERSION}/" ${EXCLUDE_FROM_ALL_ARG})
install(TARGETS ${my_name} DESTINATION "libexec/darling${root_dir}/${name}.framework/Versions/${FRAMEWORK_VERSION}/" ${EXCLUDE_FROM_ALL_ARG})
if (FRAMEWORK_RESOURCES)
if (FRAMEWORK_CURRENT_VERSION)
InstallSymlink("Versions/Current/Resources" "${CMAKE_INSTALL_PREFIX}/libexec/darling/${sys_library_dir}/${dir_name}/${name}.framework/Resources" ${EXCLUDE_FROM_ALL_ARG})
InstallSymlink("Versions/Current/Resources" "${CMAKE_INSTALL_PREFIX}/libexec/darling${root_dir}/${name}.framework/Resources" ${EXCLUDE_FROM_ALL_ARG})
endif (FRAMEWORK_CURRENT_VERSION)
while (FRAMEWORK_RESOURCES)
list(GET FRAMEWORK_RESOURCES 0 res_install_path)
@ -110,15 +120,15 @@ function(add_framework name)
get_filename_component(res_install_dir ${res_install_path} DIRECTORY)
get_filename_component(res_install_name ${res_install_path} NAME)
install(FILES ${res_source_path}
DESTINATION libexec/darling/${sys_library_dir}/${dir_name}/${name}.framework/Versions/${FRAMEWORK_VERSION}/Resources/${res_install_dir}
DESTINATION libexec/darling${root_dir}/${name}.framework/Versions/${FRAMEWORK_VERSION}/Resources/${res_install_dir}
RENAME ${res_install_name} ${EXCLUDE_FROM_ALL_ARG})
list(REMOVE_AT FRAMEWORK_RESOURCES 0 1)
endwhile (FRAMEWORK_RESOURCES)
endif()
if (FRAMEWORK_CURRENT_VERSION)
InstallSymlink(${FRAMEWORK_VERSION} "${CMAKE_INSTALL_PREFIX}/libexec/darling/${sys_library_dir}/${dir_name}/${name}.framework/Versions/Current" ${EXCLUDE_FROM_ALL_ARG})
InstallSymlink("Versions/Current/${name}" "${CMAKE_INSTALL_PREFIX}/libexec/darling/${sys_library_dir}/${dir_name}/${name}.framework/${name}" ${EXCLUDE_FROM_ALL_ARG})
InstallSymlink(${FRAMEWORK_VERSION} "${CMAKE_INSTALL_PREFIX}/libexec/darling${root_dir}/${name}.framework/Versions/Current" ${EXCLUDE_FROM_ALL_ARG})
InstallSymlink("Versions/Current/${name}" "${CMAKE_INSTALL_PREFIX}/libexec/darling${root_dir}/${name}.framework/${name}" ${EXCLUDE_FROM_ALL_ARG})
endif()
endfunction(add_framework)

View File

@ -3,7 +3,7 @@ include(create_symlink)
function(remove_sdk_framework name)
cmake_parse_arguments(SDK
"PRIVATE;IOSSUPPORT"
""
"PARENT_DIR"
""
${ARGN}
)
@ -28,6 +28,11 @@ function(remove_sdk_framework name)
set(developer_sdk_path "Developer/Platforms/${developer_platform}/Developer/SDKs/${developer_sdk}")
set(developer_framework_path "${DARLING_TOP_DIRECTORY}/${developer_sdk_path}/${developer_sys_library_dir}/${developer_framework_dir}/${name}.framework")
if (SDK_PARENT_DIR)
set(developer_framework_path "${DARLING_TOP_DIRECTORY}/${developer_sdk_path}/${SDK_PARENT_DIR}/${name}.framework")
endif()
set(header_framework_include_path "${DARLING_TOP_DIRECTORY}/${header_framework_include}/${name}")
# Remove file from 'Developer' folder
@ -35,14 +40,14 @@ function(remove_sdk_framework name)
# Also remove the the header folder from the framework/framework-private-include header
file(REMOVE_RECURSE ${header_framework_include_path})
message("Deleted SDK framework ${developer_sdk_path}")
message("Deleted SDK framework ${developer_framework_path}")
endif (REGENERATE_SDK)
endfunction(remove_sdk_framework)
function(get_path_preframework result)
cmake_parse_arguments(SDK
"PRIVATE;IOSSUPPORT"
""
"PARENT_DIR"
""
${ARGN}
)
@ -63,7 +68,13 @@ function(get_path_preframework result)
set(developer_framework_dir "Frameworks")
endif (SDK_PRIVATE)
set("${result}" "${DARLING_TOP_DIRECTORY}/${developer_sdk_path}/${developer_sys_library_dir}/${developer_framework_dir}" PARENT_SCOPE)
set(developer_framework_path "${DARLING_TOP_DIRECTORY}/${developer_sdk_path}/${developer_sys_library_dir}/${developer_framework_dir}")
if (SDK_PARENT_DIR)
set(developer_framework_path "${DARLING_TOP_DIRECTORY}/${developer_sdk_path}/${SDK_PARENT_DIR}")
endif()
set("${result}" "${developer_framework_path}" PARENT_SCOPE)
endfunction(get_path_preframework)
function(append_path_sdk_subframework input_path output_path name)
@ -80,7 +91,7 @@ endfunction(append_path_sdk_subframework)
function(internal_generate_developer_framework name path)
cmake_parse_arguments(SDK
""
"VERSION;HEADER"
"VERSION;HEADER;PARENT_DIR"
""
${ARGN}
)
@ -133,7 +144,7 @@ endfunction(internal_generate_framework_include)
function(generate_sdk_framework name)
cmake_parse_arguments(SDK
"PRIVATE;IOSSUPPORT"
"VERSION;HEADER"
"VERSION;HEADER;PARENT_DIR"
""
${ARGN}
)
@ -154,6 +165,7 @@ function(generate_sdk_framework name)
get_path_preframework(sdk_path
${PRIVATE}
${IOSSUPPORT}
PARENT_DIR "${SDK_PARENT_DIR}"
)
internal_generate_developer_framework(${name}
@ -195,4 +207,4 @@ function(generate_sdk_subframework name)
${PRIVATE}
)
endif (REGENERATE_SDK)
endfunction(generate_sdk_subframework)
endfunction(generate_sdk_subframework)