Global.stopgap.pp 6.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167
  1. //
  2. // Global.stopgap.pp
  3. //
  4. // This file is read in before any of the individual Sources.pp files
  5. // are read. It defines a few global variables to assist
  6. // Template.stopgap.pp.
  7. //
  8. // This subroutine fills sources, alt_cflags, alt_ipath, alt_lpath,
  9. // alt_libs, and alt_ld as appropriate for the current target.
  10. #define sources
  11. #define alt_cflags
  12. #define alt_ipath
  13. #define alt_lpath
  14. #define alt_libs
  15. #define alt_ld
  16. #defsub get_sources
  17. #set sources $[get_sources]
  18. #set alt_cflags $[get_cflags]
  19. #set alt_ipath $[get_ipath]
  20. #set alt_lpath $[get_lpath]
  21. #set alt_libs $[get_libs]
  22. #set alt_ld $[get_ld]
  23. #end get_sources
  24. // This subroutine will set when_defer, when_no_defer, and when_either
  25. // correctly to the set of libs we should link with for the current
  26. // target.
  27. #define when_defer
  28. #define when_no_defer
  29. #define when_either
  30. #defsub get_libs
  31. // For the WHEN_DEFER case, we need to know the complete set of
  32. // metalibs that encapsulates each of our LOCAL_LIBS. In the case
  33. // where a particular library is not part of a metalib, we include the
  34. // library itself.
  35. #set when_defer
  36. #foreach lib $[LOCAL_LIBS]
  37. // Only consider libraries that we're actually building.
  38. #if $[all_libs $[build_directory],$[lib]]
  39. #define modmeta $[module $[TARGET],$[lib]]
  40. #if $[ne $[modmeta],]
  41. #set when_defer $[when_defer] $[modmeta]
  42. #else
  43. #set when_defer $[when_defer] $[lib]
  44. #endif
  45. #endif
  46. #end lib
  47. #set when_defer $[unique $[when_defer]] $[patsubst %:m,%,$[filter %:m,$[OTHER_LIBS]]]
  48. // Also filter out the libraries we don't want from when_no_defer, although
  49. // we don't need to translate these to metalibs.
  50. #set when_no_defer
  51. #foreach lib $[COMPONENT_LIBS] $[LOCAL_LIBS]
  52. #if $[all_libs $[build_directory],$[lib]]
  53. #set when_no_defer $[when_no_defer] $[lib]
  54. #endif
  55. #end lib
  56. #set when_no_defer $[unique $[when_no_defer]] $[patsubst %:c,%,$[filter %:c,$[OTHER_LIBS]]]
  57. // Finally, get the set of libraries that we want in either case. At
  58. // the moment, this is just the set of libraries in OTHER_LIBS that's
  59. // not flagged with either a :c or a :m.
  60. #set when_either $[filter-out %:m %:c,$[OTHER_LIBS]]
  61. #end get_libs
  62. // This subroutine converts depend_libs from a list of plain library names
  63. // to a list of the form libname.so or libname.a, according to whether the
  64. // named libraries are static or dynamic.
  65. #defsub convert_depend_libs
  66. #define new_depend_libs
  67. #foreach lib $[depend_libs]
  68. // Make sure the library is something we're actually building.
  69. #if $[all_libs $[build_directory],$[lib]]
  70. #define libname $[static_libs lib$[TARGET].a,$[lib]] $[dynamic_libs lib$[TARGET].so,$[lib]]
  71. #if $[eq $[libname],]
  72. Warning: No such library $[lib], dependency of $[DIRNAME].
  73. #else
  74. #set new_depend_libs $[new_depend_libs] $[libname]
  75. #endif
  76. #endif
  77. #end lib
  78. #set depend_libs $[sort $[new_depend_libs]]
  79. #end convert_depend_libs
  80. // This subroutine determines the set of libraries our various targets
  81. // depend on. This is a complicated definition. It is the union of
  82. // all of our targets' dependencies, except:
  83. // If a target is part of a metalib, it depends (a) directly on all of
  84. // its normal library dependencies that are part of the same metalib,
  85. // and (b) indirectly on all of the metalibs that every other library
  86. // dependency is part of. If a target is not part of a metalib, it is
  87. // the same as case (b) above.
  88. #define depend_libs
  89. #defsub get_depend_libs
  90. #set depend_libs
  91. #forscopes lib_target noinst_lib_target
  92. #define metalib $[module $[TARGET],$[TARGET]]
  93. #if $[ne $[metalib],]
  94. // This library is included on a metalib.
  95. #foreach depend $[LOCAL_LIBS]
  96. #define depend_metalib $[module $[TARGET],$[depend]]
  97. #if $[eq $[depend_metalib],$[metalib]]
  98. // Here's a dependent library in the *same* metalib.
  99. #set depend_libs $[depend_libs] $[depend]
  100. #elif $[ne $[depend_metalib],]
  101. // This dependent library is in a *different* metalib.
  102. #set depend_libs $[depend_libs] $[depend_metalib]
  103. #else
  104. // This dependent library is not in any metalib.
  105. #set depend_libs $[depend_libs] $[depend]
  106. #endif
  107. #end depend
  108. #else
  109. // This library is *not* included on a metalib.
  110. #foreach depend $[LOCAL_LIBS]
  111. #define depend_metalib $[module $[TARGET],$[depend]]
  112. #if $[ne $[depend_metalib],]
  113. // This dependent library is on a metalib.
  114. #set depend_libs $[depend_libs] $[depend_metalib]
  115. #else
  116. // This dependent library is not in any metalib.
  117. #set depend_libs $[depend_libs] $[depend]
  118. #endif
  119. #end depend
  120. #endif
  121. #end lib_target noinst_lib_target
  122. // These will never be part of a metalib.
  123. #forscopes static_lib_target bin_target noinst_bin_target metalib_target
  124. #foreach depend $[LOCAL_LIBS]
  125. #define depend_metalib $[module $[TARGET],$[depend]]
  126. #if $[ne $[depend_metalib],]
  127. // This dependent library is on a metalib.
  128. #set depend_libs $[depend_libs] $[depend_metalib]
  129. #else
  130. // This dependent library is not in any metalib.
  131. #set depend_libs $[depend_libs] $[depend]
  132. #endif
  133. #end depend
  134. #end static_lib_target bin_target noinst_bin_target metalib_target
  135. // In case we're defining any metalibs, these depend directly on
  136. // their components as well.
  137. #set depend_libs $[depend_libs] $[COMPONENT_LIBS(metalib_target)]
  138. // Now correct all the libraries listed in depend_libs to refer to a
  139. // real library name.
  140. #define new_depend_libs
  141. #foreach lib $[sort $[depend_libs]]
  142. // Make sure the library is something we're actually building.
  143. #if $[all_libs $[build_directory],$[lib]]
  144. #define libname $[static_libs lib$[TARGET].a,$[lib]] $[dynamic_libs lib$[TARGET].so,$[lib]]
  145. #if $[eq $[libname],]
  146. Warning: No such library $[lib], dependency of $[DIRNAME].
  147. #else
  148. #set new_depend_libs $[new_depend_libs] $[libname]
  149. #endif
  150. #endif
  151. #end lib
  152. #set depend_libs $[sort $[new_depend_libs]]
  153. #end get_depend_libs