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

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