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

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