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

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