file(READ ${GLSL_FILE_ABSOLUTE} GLSL_FILE_CONTENTS) set(INCLUDED_FILES) function(resolve_includes CONTENTS OUTPUT) string(REGEX MATCHALL "#include \"([^\"]+)\"" INCLUDES "${CONTENTS}") foreach(INCLUDE ${INCLUDES}) string(REGEX REPLACE "#include \"([^\"]+)\"" "\\1" INCLUDE_FILE ${INCLUDE}) get_filename_component(INCLUDE_FILE_ABSOLUTE ${GLSL_SOURCE_DIRECTORY}/${INCLUDE_FILE} ABSOLUTE) list(FIND INCLUDED_FILES ${INCLUDE_FILE_ABSOLUTE} INCLUDE_FILE_INDEX) if(INCLUDE_FILE_INDEX EQUAL -1) list(APPEND INCLUDED_FILES ${INCLUDE_FILE_ABSOLUTE}) file(READ ${INCLUDE_FILE_ABSOLUTE} INCLUDED_FILE_CONTENTS) resolve_includes("${INCLUDED_FILE_CONTENTS}" RESOLVED_CONTENTS) string(REPLACE "${INCLUDE}" "${RESOLVED_CONTENTS}" CONTENTS "${CONTENTS}") else() string(REPLACE "${INCLUDE}" "" CONTENTS "${CONTENTS}") endif() endforeach() set(${OUTPUT} "${CONTENTS}" PARENT_SCOPE) set(INCLUDED_FILES ${INCLUDED_FILES} PARENT_SCOPE) endfunction() list(APPEND INCLUDED_FILES ${GLSL_FILE_ABSOLUTE}) resolve_includes("${GLSL_FILE_CONTENTS}" RESOLVED_GLSL_FILE_CONTENTS) # Convert to C string string(REPLACE "\"" "\\\"" RESOLVED_GLSL_FILE_CONTENTS "${RESOLVED_GLSL_FILE_CONTENTS}") string(REPLACE "\n" "\\n\"\n\"" RESOLVED_GLSL_FILE_CONTENTS "${RESOLVED_GLSL_FILE_CONTENTS}") set(RESOLVED_GLSL_FILE_CONTENTS "\"${RESOLVED_GLSL_FILE_CONTENTS}\\n\"") # Write to header file file(WRITE ${GLSL_FILE_HEADER} "const char* ${GLSL_FILE_NAME_WE}ShaderSource = ${RESOLVED_GLSL_FILE_CONTENTS};")