You can not select more than 25 topics Topics must start with a chinese character,a letter or number, can include dashes ('-') and can be up to 35 characters long.

f_check 11 kB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407
  1. #!/bin/sh
  2. split() {
  3. set -f
  4. old_ifs=$IFS
  5. IFS=$2
  6. set -- $1
  7. printf '%s ' "$@"
  8. IFS=$old_ifs
  9. set +f
  10. }
  11. hostos="$(uname -s | sed 's/\-.*//')"
  12. #
  13. # 1. Not specified
  14. # 1.1 Automatically detect, then check compiler
  15. # 1.2 If no fortran compiler is detected, gfortran is default with NOFORTRAN definition
  16. # 2. Specified
  17. # 2.1 If path is correct, check compiler
  18. # 2.2 If path is not correct, but still valid compiler name, force setting
  19. # 2.2.2 Path is not correct, invalid compiler name, then gfortran is default with NOFORTRAN definition
  20. #
  21. makefile="$1"
  22. config="$2"
  23. nofortran=0
  24. shift 2
  25. compiler="$*"
  26. compiler_bin="$1"
  27. # f77 is too ambiguous
  28. [ "$compiler" = "f77" ] && compiler=''
  29. path=`split "$PATH" ':'`
  30. if [ -z "$compiler" ]; then
  31. lists="gfortran g95 frt fort openf90 openf95
  32. sunf77 sunf90 sunf95
  33. xlf95 xlf90 xlf
  34. ppuf77 ppuf95 ppuf90 ppuxlf
  35. pathf90 pathf95
  36. pgf95 pgf90 pgf77 pgfortran nvfortran
  37. flang egfortran
  38. ifort nagfor"
  39. for list in $lists; do
  40. for p in $path; do
  41. if [ -x "$p/$list" ]; then
  42. compiler=$list
  43. compiler_bin=$list
  44. break 2
  45. fi
  46. done
  47. done
  48. fi
  49. if [ -z "$compiler" ]; then
  50. nofortran=1
  51. compiler=gfortran
  52. vendor=GFORTRAN
  53. bu="_"
  54. else
  55. {
  56. data="$(command -v "$compiler_bin" >/dev/null 2>&1)"
  57. vendor=""
  58. } && {
  59. data=`$compiler -O2 -S ftest.f > /dev/null 2>&1 && cat ftest.s && rm -f ftest.s`
  60. if [ -z "$data" ]; then
  61. data=`$compiler -O2 -S ftest.f > /dev/null 2>&1 && cat ftest.c && rm -f ftest.c`
  62. fi
  63. case "$data" in *zhoge_*) bu=_ ;; esac
  64. case "$data" in
  65. *Fujitsu*)
  66. vendor=FUJITSU
  67. openmp='-Kopenmp'
  68. ;;
  69. *GNU*|*GCC*)
  70. v="${data##*GCC: *\) }"
  71. v="${v%%\"*}"
  72. major="${v%%.*}"
  73. if [ "$major" -ge 4 ]; then
  74. vendor=GFORTRAN
  75. openmp='-fopenmp'
  76. else
  77. case "$compiler" in
  78. *flang*)
  79. vendor=FLANG
  80. openmp='-fopenmp'
  81. ;;
  82. *pgf*|*nvf*)
  83. vendor=PGI
  84. openmp='-mp'
  85. ;;
  86. *)
  87. vendor=G77
  88. openmp=''
  89. ;;
  90. esac
  91. fi
  92. ;;
  93. *g95*)
  94. vendor=G95
  95. openmp=''
  96. ;;
  97. *Intel*)
  98. vendor=INTEL
  99. openmp='-fopenmp'
  100. ;;
  101. *'Sun Fortran'*)
  102. vendor=SUN
  103. openmp='-xopenmp=parallel'
  104. ;;
  105. *PathScale*)
  106. vendor=PATHSCALE
  107. openmp='-openmp'
  108. ;;
  109. *Open64*)
  110. vendor=OPEN64
  111. openmp='-mp'
  112. ;;
  113. *PGF*|*NVF*)
  114. vendor=PGI
  115. openmp='-mp'
  116. ;;
  117. *'IBM XL'*)
  118. vendor=IBM
  119. openmp='-openmp'
  120. ;;
  121. *NAG*)
  122. vendor=NAG
  123. openmp='-openmp'
  124. ;;
  125. esac
  126. # for embedded underscore name, e.g. zho_ge, it may append 2 underscores.
  127. data=`$compiler -O2 -S ftest3.f >/dev/null 2>&1 && cat ftest3.s && rm -f ftest3.s`
  128. [ -z "$data" ] && {
  129. data=`$compiler -O2 -S ftest3.f >/dev/null 2>&1 && cat ftest3.c && rm -f ftest3.c`
  130. }
  131. case "$data" in *' zho_ge__'*) need2bu=1 ;; esac
  132. case "$vendor" in *G95*) [ "$NO_LAPACKE" != 1 ] && need2bu='' ;; esac
  133. }
  134. if [ -z "$vendor" ]; then
  135. case "$compiler" in
  136. *g77*)
  137. vendor=G77
  138. bu=_
  139. openmp=''
  140. ;;
  141. *g95*)
  142. vendor=G95
  143. bu=_
  144. openmp=''
  145. ;;
  146. *gfortran*)
  147. vendor=GFORTRAN
  148. bu=_
  149. openmp='-fopenmp'
  150. ;;
  151. *ifort*)
  152. vendor=INTEL
  153. bu=_
  154. openmp='-fopenmp'
  155. ;;
  156. *pathf*)
  157. vendor=PATHSCALE
  158. bu=_
  159. openmp='-mp'
  160. ;;
  161. *pgf*|*nvf*)
  162. vendor=PGI
  163. bu=_
  164. openmp='-mp'
  165. ;;
  166. *ftn*)
  167. vendor=PGI
  168. bu=_
  169. openmp=-openmp
  170. ;;
  171. *frt*)
  172. vendor=FUJITSU
  173. bu=_
  174. openmp='-openmp'
  175. ;;
  176. *sunf77*|*sunf90*|*sunf95*)
  177. vendor=SUN
  178. bu=_
  179. openmp='-xopenmp=parallel'
  180. ;;
  181. *ppuf*|*xlf*)
  182. vendor=IBM
  183. openmp='-openmp'
  184. ;;
  185. *open64*)
  186. vendor=OPEN64
  187. openmp='-mp'
  188. ;;
  189. *flang*)
  190. vendor=FLANG
  191. bu=_
  192. openmp='-fopenmp'
  193. ;;
  194. *nagfor*)
  195. vendor=NAG
  196. bu=_
  197. openmp='-openmp'
  198. ;;
  199. esac
  200. if [ -z "$vendor" ]; then
  201. nofortran=1
  202. compiler="gfortran"
  203. vendor=GFORTRAN
  204. bu=_
  205. openmp=''
  206. fi
  207. fi
  208. fi
  209. {
  210. data=`command -v $compiler_bin >/dev/null 2>&1`
  211. } && {
  212. binary=$BINARY
  213. [ "$USE_OPENMP" != 1 ] && openmp=''
  214. case "$binary" in
  215. 32)
  216. {
  217. link=`$compiler $openmp -m32 -v ftest2.f 2>&1 && rm -f a.out a.exe`
  218. } || {
  219. link=`$compiler $openmp -q32 -v ftest2.f 2>&1 && rm -f a.out a.exe`
  220. } || {
  221. # for AIX
  222. link=`$compiler $openmp -maix32 -v ftest2.f 2>&1 && rm -f a.out a.exe`
  223. } || {
  224. # for gfortran MIPS
  225. mips_data=`$compiler_bin -E -dM - < /dev/null`
  226. case "$mips_data" in
  227. *_MIPS_ISA_MIPS64*)
  228. link=`$compiler $openmp -mabi=n32 -v ftest2.f 2>&1 && rm -f a.out a.exe`
  229. ;;
  230. *)
  231. link=`$compiler $openmp -mabi=32 -v ftest2.f 2>&1 && rm -f a.out a.exe`
  232. ;;
  233. esac
  234. } || {
  235. binary=''
  236. }
  237. ;;
  238. 64)
  239. {
  240. link=`$compiler $openmp -m64 -v ftest2.f 2>&1 && rm -f a.out a.exe`
  241. } || {
  242. link=`$compiler $openmp -q64 -v ftest2.f 2>&1 && rm -f a.out a.exe`
  243. } || {
  244. # for AIX
  245. link=`$compiler $openmp -maix64 -v ftest2.f 2>&1 && rm -f a.out a.exe`
  246. } || {
  247. # for gfortran MIPS
  248. link=`$compiler $openmp -mabi=64 -v ftest2.f 2>&1 && rm -f a.out a.exe`
  249. } || {
  250. # for nagfor
  251. link=`$compiler $openmp -dryrun ftest2.f 2>&1 && rm -f a.out a.exe`
  252. } || {
  253. binary=''
  254. }
  255. ;;
  256. esac
  257. if [ -z "$binary" ]; then
  258. link=`$compiler $openmp -v ftest2.f 2>&1 && rm -f a.out a.exe`
  259. fi
  260. }
  261. if [ "$vendor" = "NAG" ]; then
  262. link=`$compiler $openmp -dryrun ftest2.f 2>&1 && rm -f a.out a.exe`
  263. fi
  264. linker_L=""
  265. linker_l=""
  266. linker_a=""
  267. if [ -n "$link" ]; then
  268. link=`echo "$link" | sed 's/\-Y[[:space:]]P\,/\-Y/g'`
  269. link=`echo "$link" | sed 's/\-R[[:space:]]*/\-rpath\%/g'`
  270. link=`echo "$link" | sed 's/\-rpath[[:space:]]+/\-rpath\%/g'`
  271. link=`echo "$link" | sed 's/\-rpath-link[[:space:]]+/\-rpath-link\%/g'`
  272. flags=`echo "$link" | tr ',\n' ' '`
  273. # remove leading and trailing quotes from each flag.
  274. #@flags = map {s/^['"]|['"]$//g; $_} @flags;
  275. for flag in $flags; do
  276. case "$flag" in -L*)
  277. case "$flag" in
  278. -LIST:*|-LANG:*) ;;
  279. *) linker_L="$linker_L $flag" ;;
  280. esac
  281. esac
  282. case "$flag" in -Y*)
  283. [ "$hostos" = "SunOS" ] && continue
  284. linker_L="$linker_L -Wl,$flag"
  285. ;;
  286. esac
  287. case "$flag" in --exclude-libs*)
  288. linker_L="$linker_L -Wl,$flag"
  289. flag=""
  290. ;;
  291. esac
  292. case "$flag" in -rpath%*)
  293. flag=`echo "$flag" | sed 's/\%/\,/g'`
  294. linker_L="$linker_L -Wl,$flag"
  295. esac
  296. case "$flag" in -rpath-link%*)
  297. flag=`echo "$flag" | sed 's/\%/\,/g'`
  298. linker_L="$linker_L -Wl,$flag"
  299. ;;
  300. esac
  301. case "$flag" in *-lgomp*)
  302. case "$CC" in *clang*)
  303. flag="-lomp"
  304. ;;
  305. esac
  306. esac
  307. case "$flag" in -l*)
  308. case "$flag" in
  309. *ibrary*|*gfortranbegin*|*flangmain*|*frtbegin*|*pathfstart*|\
  310. *crt[0-9]*|*gcc*|*user32*|*kernel32*|*advapi32*|*shell32*|\
  311. -l) ;;
  312. *omp*)
  313. case "$vendor" in
  314. *PGI*|*FUJITSU*) ;;
  315. *) linker_l="$linker_l $flag" ;;
  316. esac
  317. ;;
  318. *[0-9]*)
  319. if [ "$vendor" = "FUJITSU" ]; then
  320. case "$flag" in
  321. -lfj90*) linker_l="$linker_l $flag" ;;
  322. *) ;;
  323. esac
  324. fi
  325. ;;
  326. *) linker_l="$linker_l $flag" ;;
  327. esac
  328. esac
  329. case "$flag" in *quickfit.o*)
  330. [ "$vendor" = "NAG" ] && linker_l="$linker_l $flag" ;;
  331. esac
  332. case "$flag" in *safefit.o*)
  333. [ "$vendor" = "NAG" ] && linker_l="$linker_l $flag" ;;
  334. esac
  335. case "$flag" in *thsafe.o*)
  336. [ "$vendor" = "NAG" ] && linker_l="$linker_l $flag" ;;
  337. esac
  338. case "$flag" in *.a) linker_a="$linker_a $flag" ;; esac
  339. done
  340. fi
  341. if [ "$vendor" = "FLANG" ]; then
  342. linker_a="$linker_a -lflang"
  343. fi
  344. printf "F_COMPILER=%s\n" "$vendor" >> "$makefile"
  345. printf "FC=%s\n" "$compiler" >> "$makefile"
  346. [ -n "$bu" ] && printf 'BU=%s\n' "$bu" >> "$makefile"
  347. [ "$nofortran" -eq 1 ] && printf 'NOFORTRAN=1\n' >> "$makefile"
  348. [ -n "$bu" ] && printf '#define BUNDERSCORE\t%s\n' "$bu" >> "$config"
  349. [ -n "$bu" ] && printf '#define NEEDBUNDERSCORE\t1\n' >> "$config"
  350. [ -n "$need2bu" ] && printf "#define NEED2UNDERSCORES\t1\n" >> "$config"
  351. [ -n "$need2bu" ] && printf "#define NEED2UNDERSCORES=1\n" >> "$config"
  352. if [ -n "$linker_l" ] || [ -n "$linker_a" ]; then
  353. printf "FEXTRALIB=%s %s %s\n" "$linker_L" "$linker_l" "$linker_a" >> "$makefile"
  354. fi