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.

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