foundationdb/cmake/GenerateModulemap.cmake

51 lines
2.2 KiB
CMake

# Generate flow modulemap
function(generate_modulemap out module target)
cmake_parse_arguments(ARG "" "" "OMIT;HEADERS" ${ARGN})
set(MODULE_NAME "${module}")
string(TOLOWER ${module} module_lower)
string(TOLOWER ${target} target_lower)
get_target_property(MODULE_HEADERS ${target} HEADER_FILES)
if(ARG_HEADERS)
set(MODULE_HEADERS ${ARG_HEADERS})
endif()
foreach(header ${MODULE_HEADERS})
get_filename_component(fname ${header} NAME)
if(NOT ${fname} IN_LIST ARG_OMIT)
get_filename_component(headerdir ${header} DIRECTORY)
get_filename_component(dirname ${headerdir} NAME)
set(topdirname ${dirname})
# FIXME: we need to account for headers in subdirectories.
# THIS is a hack for single level directory.
if (NOT ${dirname} MATCHES ${module_lower} AND
NOT ${dirname} MATCHES ${target_lower})
get_filename_component(headerdir2 ${headerdir} DIRECTORY)
get_filename_component(dirname2 ${headerdir2} NAME)
set(topdirname ${dirname2})
set(dirname "${dirname2}/${dirname}")
if (NOT ${dirname2} MATCHES ${module_lower} AND
NOT ${dirname2} MATCHES ${target_lower})
get_filename_component(headerdir3 ${headerdir2} DIRECTORY)
get_filename_component(dirname3 ${headerdir3} NAME)
set(topdirname ${dirname3})
set(dirname "${dirname3}/${dirname}")
endif()
endif()
if(ARG_HEADERS)
set(header_list "${header_list} header \"include/${dirname}/${fname}\"\n")
else()
set(header_list "${header_list} header \"${dirname}/${fname}\"\n")
endif()
cmake_path(IS_PREFIX CMAKE_BINARY_DIR ${headerdir} NORMALIZE isGenerated)
if (NOT ${isGenerated})
set(vfs_roots "${vfs_roots} {\"type\": \"file\", \"name\": \"${CMAKE_BINARY_DIR}/${topdirname}/include/${dirname}/${fname}\", \"external-contents\": \"${header}\"},\n")
endif()
endif()
endforeach()
set(MODULE_HEADERS "${header_list}")
configure_file("${CMAKE_SOURCE_DIR}/swift_build_support/empty.modulemap" "${out}/module.modulemap" @ONLY)
set(VFS_ROOTS "${vfs_roots}")
configure_file("${CMAKE_SOURCE_DIR}/swift_build_support/headeroverlay.yaml" "${out}/headeroverlay.yaml" @ONLY)
endfunction()