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.

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