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 12 kB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444
  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 ifx ftn crayftn armflang"
  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. *Hewlett*)
  70. vendor=CRAY
  71. openmp='-fopenmp'
  72. ;;
  73. *Arm\ F90*|*F90\ Flang*)
  74. vendor=FLANG
  75. openmp='-fopenmp'
  76. ;;
  77. *GNU*|*GCC*)
  78. v="${data#*GCC: *\) }"
  79. v="${v%%\"*}"
  80. major="${v%%.*}"
  81. if [ "$major" -ge 4 ]; then
  82. vendor=GFORTRAN
  83. openmp='-fopenmp'
  84. else
  85. case "$compiler" in
  86. *flang*)
  87. vendor=FLANG
  88. openmp='-fopenmp'
  89. data=`$compiler -v 2>&1 > /dev/null `
  90. v="${data#*version *}"
  91. v="${v%%*.}"
  92. major="${v%%.*}"
  93. if [ "$major" -ge 17 ]; then
  94. vendor=FLANGNEW
  95. fi
  96. ;;
  97. *ifort*|*ifx*)
  98. vendor=INTEL
  99. openmp='-fopenmp'
  100. ;;
  101. *pgf*|*nvf*)
  102. vendor=PGI
  103. openmp='-mp'
  104. ;;
  105. *xlf*)
  106. vendor=IBM
  107. ;;
  108. *)
  109. vendor=G77
  110. openmp=''
  111. ;;
  112. esac
  113. fi
  114. ;;
  115. *Cray*)
  116. vendor=CRAY
  117. openmp='-fopenmp'
  118. ;;
  119. *g95*)
  120. vendor=G95
  121. openmp=''
  122. ;;
  123. *Intel*)
  124. vendor=INTEL
  125. openmp='-fopenmp'
  126. ;;
  127. *'Sun Fortran'*)
  128. vendor=SUN
  129. openmp='-xopenmp=parallel'
  130. ;;
  131. *PathScale*)
  132. vendor=PATHSCALE
  133. openmp='-openmp'
  134. ;;
  135. *Open64*)
  136. vendor=OPEN64
  137. openmp='-mp'
  138. ;;
  139. *PGF*|*NVF*)
  140. vendor=PGI
  141. openmp='-mp'
  142. ;;
  143. *'IBM XL'*)
  144. vendor=IBM
  145. openmp='-openmp'
  146. case "$CC" in *gcc*)
  147. bu=_
  148. ;;
  149. esac
  150. ;;
  151. *NAG*)
  152. vendor=NAG
  153. openmp='-openmp'
  154. ;;
  155. esac
  156. # for embedded underscore name, e.g. zho_ge, it may append 2 underscores.
  157. data=`$compiler -O2 -S ftest3.f >/dev/null 2>&1 && cat ftest3.s && rm -f ftest3.s`
  158. [ -z "$data" ] && {
  159. data=`$compiler -O2 -S ftest3.f >/dev/null 2>&1 && cat ftest3.c && rm -f ftest3.c`
  160. }
  161. case "$data" in *' zho_ge__'*) need2bu=1 ;; esac
  162. case "$vendor" in *G95*) [ "$NO_LAPACKE" != 1 ] && need2bu='' ;; esac
  163. }
  164. if [ -z "$vendor" ]; then
  165. case "$compiler" in
  166. *g77*)
  167. vendor=G77
  168. bu=_
  169. openmp=''
  170. ;;
  171. *g95*)
  172. vendor=G95
  173. bu=_
  174. openmp=''
  175. ;;
  176. *gfortran*)
  177. vendor=GFORTRAN
  178. bu=_
  179. openmp='-fopenmp'
  180. ;;
  181. *ifort*|*ifx*)
  182. vendor=INTEL
  183. bu=_
  184. openmp='-fopenmp'
  185. ;;
  186. *pathf*)
  187. vendor=PATHSCALE
  188. bu=_
  189. openmp='-mp'
  190. ;;
  191. *pgf*|*nvf*)
  192. vendor=PGI
  193. bu=_
  194. openmp='-mp'
  195. ;;
  196. *ftn*)
  197. vendor=PGI
  198. bu=_
  199. openmp=-openmp
  200. ;;
  201. *frt*)
  202. vendor=FUJITSU
  203. bu=_
  204. openmp='-openmp'
  205. ;;
  206. *sunf77*|*sunf90*|*sunf95*)
  207. vendor=SUN
  208. bu=_
  209. openmp='-xopenmp=parallel'
  210. ;;
  211. *ppuf*|*xlf*)
  212. vendor=IBM
  213. openmp='-openmp'
  214. case "$CC" in *gcc*)
  215. bu=_
  216. ;;
  217. esac
  218. ;;
  219. *open64*)
  220. vendor=OPEN64
  221. openmp='-mp'
  222. ;;
  223. *flang*)
  224. vendor=FLANG
  225. data=`$compiler -v 2>&1 > /dev/null`
  226. v="${data#*version *}"
  227. v="${v%%*.}"
  228. major="${v%%.*}"
  229. if [ "$major" -ge 17 ]; then
  230. vendor=FLANGNEW
  231. fi
  232. bu=_
  233. openmp='-fopenmp'
  234. ;;
  235. *nagfor*)
  236. vendor=NAG
  237. bu=_
  238. openmp='-openmp'
  239. ;;
  240. esac
  241. if [ -z "$vendor" ]; then
  242. nofortran=1
  243. compiler="gfortran"
  244. vendor=GFORTRAN
  245. bu=_
  246. openmp=''
  247. fi
  248. fi
  249. fi
  250. {
  251. data=`command -v $compiler_bin >/dev/null 2>&1`
  252. } && {
  253. binary=$BINARY
  254. [ "$USE_OPENMP" != 1 ] && openmp=''
  255. case "$binary" in
  256. 32)
  257. {
  258. link=`$compiler $openmp -m32 -v ftest2.f 2>&1 && rm -f a.out a.exe`
  259. } || {
  260. link=`$compiler $openmp -q32 -v ftest2.f 2>&1 && rm -f a.out a.exe`
  261. } || {
  262. # for AIX
  263. link=`$compiler $openmp -maix32 -v ftest2.f 2>&1 && rm -f a.out a.exe`
  264. } || {
  265. # for gfortran MIPS
  266. mips_data=`$compiler_bin -E -dM - < /dev/null`
  267. case "$mips_data" in
  268. *_MIPS_ISA_MIPS64*)
  269. link=`$compiler $openmp -mabi=n32 -v ftest2.f 2>&1 && rm -f a.out a.exe`
  270. ;;
  271. *)
  272. link=`$compiler $openmp -mabi=32 -v ftest2.f 2>&1 && rm -f a.out a.exe`
  273. ;;
  274. esac
  275. } || {
  276. binary=''
  277. }
  278. ;;
  279. 64)
  280. {
  281. link=`$compiler $openmp -m64 -v ftest2.f 2>&1 && rm -f a.out a.exe`
  282. } || {
  283. link=`$compiler $openmp -q64 -v ftest2.f 2>&1 && rm -f a.out a.exe`
  284. } || {
  285. # for AIX
  286. link=`$compiler $openmp -maix64 -v ftest2.f 2>&1 && rm -f a.out a.exe`
  287. } || {
  288. # for gfortran MIPS
  289. link=`$compiler $openmp -mabi=64 -v ftest2.f 2>&1 && rm -f a.out a.exe`
  290. } || {
  291. # for nagfor
  292. link=`$compiler $openmp -dryrun ftest2.f 2>&1 && rm -f a.out a.exe`
  293. } || {
  294. binary=''
  295. }
  296. ;;
  297. esac
  298. if [ -z "$binary" ]; then
  299. link=`$compiler $openmp -v ftest2.f 2>&1 && rm -f a.out a.exe`
  300. fi
  301. }
  302. if [ "$vendor" = "NAG" ]; then
  303. link=`$compiler $openmp -dryrun ftest2.f 2>&1 && rm -f a.out a.exe`
  304. fi
  305. if [ "$vendor" = "CRAY" ]; then
  306. link=`$compiler $openmp -hnopattern ftest2.f 2>&1 && rm -f a.out a.exe`
  307. fi
  308. linker_L=""
  309. linker_l=""
  310. linker_a=""
  311. if [ -n "$link" ]; then
  312. link=`echo "$link" | sed 's/\-Y[[:space:]]P\,/\-Y/g'`
  313. link=`echo "$link" | sed 's/\-R[[:space:]]*/\-rpath\%/g'`
  314. link=`echo "$link" | sed 's/\-rpath[[:space:]]+/\-rpath\%/g'`
  315. link=`echo "$link" | sed 's/\-rpath-link[[:space:]]+/\-rpath-link\%/g'`
  316. flags=`echo "$link" | tr "',\n" " "`
  317. # remove leading and trailing quotes from each flag.
  318. #@flags = map {s/^['"]|['"]$//g; $_} @flags;
  319. for flag in $flags; do
  320. case "$flag" in -L*)
  321. case "$flag" in
  322. -LIST:*|-LANG:*) ;;
  323. *) linker_L="$linker_L $flag" ;;
  324. esac
  325. esac
  326. case "$flag" in -Y*)
  327. [ "$hostos" = "SunOS" ] && continue
  328. linker_L="$linker_L -Wl,$flag"
  329. ;;
  330. esac
  331. case "$flag" in --exclude-libs*)
  332. linker_L="$linker_L -Wl,$flag"
  333. flag=""
  334. ;;
  335. esac
  336. case "$flag" in -rpath%*)
  337. flag=`echo "$flag" | sed 's/\%/\,/g'`
  338. linker_L="$linker_L -Wl,$flag"
  339. esac
  340. case "$flag" in -rpath-link%*)
  341. flag=`echo "$flag" | sed 's/\%/\,/g'`
  342. linker_L="$linker_L -Wl,$flag"
  343. ;;
  344. esac
  345. case "$flag" in -l*)
  346. case "$flag" in
  347. *ibrary*|*gfortranbegin*|*flangmain*|*frtbegin*|*pathfstart*|\
  348. *crt[0-9]*|*gcc*|*user32*|*kernel32*|*advapi32*|*shell32*|\
  349. -l) ;;
  350. *omp*)
  351. case "$vendor" in
  352. *PGI*|*FUJITSU*) ;;
  353. *) linker_l="$linker_l $flag" ;;
  354. esac
  355. ;;
  356. *[0-9]*)
  357. if [ "$vendor" = "FUJITSU" ]; then
  358. case "$flag" in
  359. -lfj90*) linker_l="$linker_l $flag" ;;
  360. *) ;;
  361. esac
  362. fi
  363. ;;
  364. *) linker_l="$linker_l $flag" ;;
  365. esac
  366. esac
  367. case "$flag" in *quickfit.o*)
  368. [ "$vendor" = "NAG" ] && linker_l="$linker_l $flag" ;;
  369. esac
  370. case "$flag" in *safefit.o*)
  371. [ "$vendor" = "NAG" ] && linker_l="$linker_l $flag" ;;
  372. esac
  373. case "$flag" in *thsafe.o*)
  374. [ "$vendor" = "NAG" ] && linker_l="$linker_l $flag" ;;
  375. esac
  376. case "$flag" in *.a) linker_a="$linker_a $flag" ;; esac
  377. done
  378. fi
  379. if [ "$vendor" = "FLANG" ]; then
  380. linker_a="$linker_a -lflang"
  381. fi
  382. printf "F_COMPILER=%s\n" "$vendor" >> "$makefile"
  383. printf "FC=%s\n" "$compiler" >> "$makefile"
  384. [ -n "$bu" ] && printf 'BU=%s\n' "$bu" >> "$makefile"
  385. [ "$nofortran" -eq 1 ] && printf 'NOFORTRAN=1\n' >> "$makefile"
  386. [ -n "$bu" ] && printf '#define BUNDERSCORE\t%s\n' "$bu" >> "$config"
  387. [ -n "$bu" ] && printf '#define NEEDBUNDERSCORE\t1\n' >> "$config"
  388. [ -n "$need2bu" ] && printf "#define NEED2UNDERSCORES\t1\n" >> "$config"
  389. [ -n "$need2bu" ] && printf "#define NEED2UNDERSCORES=1\n" >> "$config"
  390. if [ -n "$linker_l" ] || [ -n "$linker_a" ]; then
  391. printf "FEXTRALIB=%s %s %s\n" "$linker_L" "$linker_l" "$linker_a" >> "$makefile"
  392. fi