| 
									
										
										
										
											2019-06-10 16:18:27 +07:00
										 |  |  | require 'ceedling/plugin' | 
					
						
							|  |  |  | require 'ceedling/constants' | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | SUBPROJECTS_ROOT_NAME         = 'subprojects' | 
					
						
							|  |  |  | SUBPROJECTS_TASK_ROOT         = SUBPROJECTS_ROOT_NAME + ':' | 
					
						
							|  |  |  | SUBPROJECTS_SYM               = SUBPROJECTS_ROOT_NAME.to_sym | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | class Subprojects < Plugin | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |   def setup | 
					
						
							|  |  |  |     @plugin_root = File.expand_path(File.join(File.dirname(__FILE__), '..')) | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     # Add to the test paths | 
					
						
							|  |  |  |     SUBPROJECTS_PATHS.each do |subproj| | 
					
						
							|  |  |  |       subproj[:source].each do |path| | 
					
						
							|  |  |  |         COLLECTION_PATHS_TEST_SUPPORT_SOURCE_INCLUDE_VENDOR << path | 
					
						
							|  |  |  |       end | 
					
						
							|  |  |  |       subproj[:include].each do |path| | 
					
						
							|  |  |  |         COLLECTION_PATHS_TEST_SUPPORT_SOURCE_INCLUDE_VENDOR << path | 
					
						
							|  |  |  |       end | 
					
						
							|  |  |  |     end | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2022-12-08 09:14:38 +07:00
										 |  |  |     # Gather information about the subprojects | 
					
						
							| 
									
										
										
										
											2019-06-10 16:18:27 +07:00
										 |  |  |     @subprojects = {} | 
					
						
							|  |  |  |     @subproject_lookup_by_path = {} | 
					
						
							|  |  |  |     SUBPROJECTS_PATHS.each do |subproj| | 
					
						
							|  |  |  |       @subprojects[ subproj[:name] ] = subproj.clone | 
					
						
							|  |  |  |       @subprojects[ subproj[:name] ][:c] = [] | 
					
						
							|  |  |  |       @subprojects[ subproj[:name] ][:asm] = [] | 
					
						
							|  |  |  |       subproj[:source].each do |path| | 
					
						
							|  |  |  |         search_path = "#{path[-1].match(/\\|\//) ? path : "#{path}/"}*#{EXTENSION_SOURCE}" | 
					
						
							|  |  |  |         @subprojects[ subproj[:name] ][:c] += Dir[search_path] | 
					
						
							|  |  |  |         if (EXTENSION_ASSEMBLY && !EXTENSION_ASSEMBLY.empty?) | 
					
						
							|  |  |  |           search_path = "#{path[-1].match(/\\|\//) ? path : "#{path}/"}*#{EXTENSION_ASSEMBLY}" | 
					
						
							|  |  |  |           @subprojects[ subproj[:name] ][:asm] += Dir[search_path] | 
					
						
							|  |  |  |         end | 
					
						
							|  |  |  |       end | 
					
						
							|  |  |  |       @subproject_lookup_by_path[ subproj[:build_root] ] = subproj[:name] | 
					
						
							|  |  |  |     end | 
					
						
							|  |  |  |   end | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |   def find_my_project( c_file, file_type = :c ) | 
					
						
							|  |  |  |     @subprojects.each_pair do |subprojname, subproj| | 
					
						
							|  |  |  |       return subprojname if (subproj[file_type].include?(c_file)) | 
					
						
							|  |  |  |     end | 
					
						
							|  |  |  |   end | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |   def find_my_paths( c_file, file_type = :c ) | 
					
						
							|  |  |  |     @subprojects.each_pair do |subprojname, subproj| | 
					
						
							|  |  |  |       return (subproj[:source] + (subproj[:include] || [])) if (subproj[file_type].include?(c_file)) | 
					
						
							|  |  |  |     end | 
					
						
							|  |  |  |     return [] | 
					
						
							|  |  |  |   end | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |   def find_my_defines( c_file, file_type = :c ) | 
					
						
							|  |  |  |     @subprojects.each_pair do |subprojname, subproj| | 
					
						
							|  |  |  |       return (subproj[:defines] || []) if (subproj[file_type].include?(c_file)) | 
					
						
							|  |  |  |     end | 
					
						
							|  |  |  |     return [] | 
					
						
							|  |  |  |   end | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |   def list_all_object_files_for_subproject( lib_name ) | 
					
						
							|  |  |  |     subproj = File.basename(lib_name, EXTENSION_SUBPROJECTS) | 
					
						
							|  |  |  |     objpath = "#{@subprojects[subproj][:build_root]}/out/c" | 
					
						
							|  |  |  |     bbb = @subprojects[subproj][:c].map{|f| "#{objpath}/#{File.basename(f,EXTENSION_SOURCE)}#{EXTENSION_OBJECT}" } | 
					
						
							|  |  |  |     bbb | 
					
						
							|  |  |  |   end | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |   def find_library_source_file_for_object( obj_name ) | 
					
						
							|  |  |  |     cname = "#{File.basename(obj_name, EXTENSION_OBJECT)}#{EXTENSION_SOURCE}" | 
					
						
							|  |  |  |     dname = File.dirname(obj_name)[0..-7] | 
					
						
							|  |  |  |     pname = @subproject_lookup_by_path[dname] | 
					
						
							|  |  |  |     return @ceedling[:file_finder].find_file_from_list(cname, @subprojects[pname][:c], :error) | 
					
						
							|  |  |  |   end | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |   def find_library_assembly_file_for_object( obj_name ) | 
					
						
							|  |  |  |     cname = "#{File.basename(obj_name, EXTENSION_OBJECT)}#{EXTENSION_ASEMBLY}" | 
					
						
							|  |  |  |     dname = File.dirname(obj_name)[0..-7] | 
					
						
							|  |  |  |     pname = @subproject_lookup_by_path[dname] | 
					
						
							|  |  |  |     return @ceedling[:file_finder].find_file_from_list(cname, @subprojects[pname][:asm], :error) | 
					
						
							|  |  |  |   end | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |   def replace_constant(constant, new_value) | 
					
						
							|  |  |  |     Object.send(:remove_const, constant.to_sym) if (Object.const_defined? constant) | 
					
						
							|  |  |  |     Object.const_set(constant, new_value) | 
					
						
							|  |  |  |   end | 
					
						
							| 
									
										
										
										
											2022-12-08 09:14:38 +07:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2019-06-10 16:18:27 +07:00
										 |  |  | end | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | # end blocks always executed following rake run | 
					
						
							|  |  |  | END { | 
					
						
							|  |  |  | } |