subprojects.rb 3.2 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586878889909192
  1. require 'ceedling/plugin'
  2. require 'ceedling/constants'
  3. SUBPROJECTS_ROOT_NAME = 'subprojects'
  4. SUBPROJECTS_TASK_ROOT = SUBPROJECTS_ROOT_NAME + ':'
  5. SUBPROJECTS_SYM = SUBPROJECTS_ROOT_NAME.to_sym
  6. class Subprojects < Plugin
  7. def setup
  8. @plugin_root = File.expand_path(File.join(File.dirname(__FILE__), '..'))
  9. # Add to the test paths
  10. SUBPROJECTS_PATHS.each do |subproj|
  11. subproj[:source].each do |path|
  12. COLLECTION_PATHS_TEST_SUPPORT_SOURCE_INCLUDE_VENDOR << path
  13. end
  14. subproj[:include].each do |path|
  15. COLLECTION_PATHS_TEST_SUPPORT_SOURCE_INCLUDE_VENDOR << path
  16. end
  17. end
  18. #gather information about the subprojects
  19. @subprojects = {}
  20. @subproject_lookup_by_path = {}
  21. SUBPROJECTS_PATHS.each do |subproj|
  22. @subprojects[ subproj[:name] ] = subproj.clone
  23. @subprojects[ subproj[:name] ][:c] = []
  24. @subprojects[ subproj[:name] ][:asm] = []
  25. subproj[:source].each do |path|
  26. search_path = "#{path[-1].match(/\\|\//) ? path : "#{path}/"}*#{EXTENSION_SOURCE}"
  27. @subprojects[ subproj[:name] ][:c] += Dir[search_path]
  28. if (EXTENSION_ASSEMBLY && !EXTENSION_ASSEMBLY.empty?)
  29. search_path = "#{path[-1].match(/\\|\//) ? path : "#{path}/"}*#{EXTENSION_ASSEMBLY}"
  30. @subprojects[ subproj[:name] ][:asm] += Dir[search_path]
  31. end
  32. end
  33. @subproject_lookup_by_path[ subproj[:build_root] ] = subproj[:name]
  34. end
  35. end
  36. def find_my_project( c_file, file_type = :c )
  37. @subprojects.each_pair do |subprojname, subproj|
  38. return subprojname if (subproj[file_type].include?(c_file))
  39. end
  40. end
  41. def find_my_paths( c_file, file_type = :c )
  42. @subprojects.each_pair do |subprojname, subproj|
  43. return (subproj[:source] + (subproj[:include] || [])) if (subproj[file_type].include?(c_file))
  44. end
  45. return []
  46. end
  47. def find_my_defines( c_file, file_type = :c )
  48. @subprojects.each_pair do |subprojname, subproj|
  49. return (subproj[:defines] || []) if (subproj[file_type].include?(c_file))
  50. end
  51. return []
  52. end
  53. def list_all_object_files_for_subproject( lib_name )
  54. subproj = File.basename(lib_name, EXTENSION_SUBPROJECTS)
  55. objpath = "#{@subprojects[subproj][:build_root]}/out/c"
  56. bbb = @subprojects[subproj][:c].map{|f| "#{objpath}/#{File.basename(f,EXTENSION_SOURCE)}#{EXTENSION_OBJECT}" }
  57. bbb
  58. end
  59. def find_library_source_file_for_object( obj_name )
  60. cname = "#{File.basename(obj_name, EXTENSION_OBJECT)}#{EXTENSION_SOURCE}"
  61. dname = File.dirname(obj_name)[0..-7]
  62. pname = @subproject_lookup_by_path[dname]
  63. return @ceedling[:file_finder].find_file_from_list(cname, @subprojects[pname][:c], :error)
  64. end
  65. def find_library_assembly_file_for_object( obj_name )
  66. cname = "#{File.basename(obj_name, EXTENSION_OBJECT)}#{EXTENSION_ASEMBLY}"
  67. dname = File.dirname(obj_name)[0..-7]
  68. pname = @subproject_lookup_by_path[dname]
  69. return @ceedling[:file_finder].find_file_from_list(cname, @subprojects[pname][:asm], :error)
  70. end
  71. def replace_constant(constant, new_value)
  72. Object.send(:remove_const, constant.to_sym) if (Object.const_defined? constant)
  73. Object.const_set(constant, new_value)
  74. end
  75. end
  76. # end blocks always executed following rake run
  77. END {
  78. }