github.com/apptainer/singularity@v3.1.1+incompatible/mconfig (about)

     1  #!/bin/sh -
     2  # Copyright (c) 2019, Sylabs Inc. All rights reserved.
     3  # Copyright (c) 2015-2018, Yannick Cote <yhcote@gmail.com>. All rights reserved.
     4  # Use of this source code is governed by a BSD-style license that can be found
     5  # in the LICENSE file.
     6  set -e
     7  
     8  verbose=0
     9  profile=release
    10  
    11  lang_c=1
    12  lang_go=1
    13  
    14  hstcc=
    15  hstcc_opts="cc gcc clang i686-w64-mingw32-gcc x86_64-w64-mingw32-gcc"
    16  hstcxx=
    17  hstcxx_opts="c++ g++ clang++ i686-w64-mingw32-g++ x86_64-w64-mingw32-g++"
    18  hstar=
    19  hstld=
    20  hstranlib=
    21  hstobjcopy=
    22  
    23  tgtcc=
    24  tgtcc_opts=$hstcc_opts
    25  tgtcxx=
    26  tgtcxx_opts=$hstcxx_opts
    27  tgtar=
    28  tgtld=
    29  tgtranlib=
    30  tgtobjcopy=
    31  
    32  hststatic=0
    33  tgtstatic=0
    34  
    35  # user_cflags - user-defined CFLAGS without all the cflags_opts
    36  user_cflags="$CFLAGS"
    37  cflags_opts="-Wall -Werror -Wfatal-errors -Wno-unknown-warning-option \
    38  -Wstrict-prototypes -Wpointer-arith -Wbad-function-cast \
    39  -Woverlength-strings -Wframe-larger-than=2047 \
    40  -Wno-sign-compare -Wclobbered -Wempty-body -Wmissing-parameter-type \
    41  -Wtype-limits -Wunused-parameter -Wunused-but-set-parameter \
    42  -Wno-discarded-qualifiers -Wno-incompatible-pointer-types \
    43  -pipe -fmessage-length=0 -fPIC"
    44  cflags="$CFLAGS -D_FORTIFY_SOURCE=2 -Wformat -Wformat-security -fstack-protector --param ssp-buffer-size=4"
    45  ldflags=$LDFLAGS
    46  
    47  package_name=singularity
    48  package_version=`(git describe --match 'v[0-9]*' --dirty --always 2>/dev/null || cat VERSION 2>/dev/null || echo "") | sed -e "s/^v//;s/-/_/g;s/_/-/;s/_/./g"`
    49  
    50  with_network=1
    51  with_suid=1
    52  
    53  prefix=
    54  exec_prefix=
    55  bindir=
    56  sbindir=
    57  libexecdir=
    58  datarootdir=
    59  datadir=
    60  sysconfdir=
    61  sharedstatedir=
    62  localstatedir=
    63  runstatedir=
    64  includedir=
    65  oldincludedir=
    66  docdir=
    67  infodir=
    68  htmldir=
    69  dvidir=
    70  pdfdir=
    71  psdir=
    72  libdir=
    73  localedir=
    74  mandir=
    75  
    76  
    77  usage () {
    78  	echo "${0##*/}: could not complete configuration"
    79  }
    80  
    81  usage_args () {
    82  	echo "Usage: ${0##*/} [-vsS] [-P profile] [-b builddir] [-c hstcc] [-C tgtcc]"
    83  	echo "                [-V version] [-x hstcxx] [-X tgtcxx]"
    84  	echo "                [--INSTALLDIR=ARG (see below)]"
    85  	echo
    86  	echo "  Makeit general options:"
    87  	echo "     -v   build project with verbose flags on"
    88  	echo "     -s   build final host project binary statically"
    89  	echo "     -S   build final target project binary statically"
    90  	echo "     -P   use config profile to configure the project:"
    91  	echo "            *release             normal release mode (production)"
    92  	echo "             release-stripped    release mode, stripped symbols (rpm packaging)"
    93  	echo "             debug               CGO objects built unoptimized, with symbols"
    94  	echo "     -b   build project in \`builddir'"
    95  	echo "     -c   build project with host C \`compiler'"
    96  	echo "     -C   build project with target C\`compiler'"
    97  	echo "     -V   build project with given version"
    98  	echo "     -x   build project with host C++ \`compiler'"
    99  	echo "     -X   build project with target C++ \`compiler'"
   100  	echo "     -l   build project with source code language (-l C -l Go ...)"
   101  	echo "     -h   this help"
   102  	echo
   103  	echo "  Singularity options:"
   104  	echo "     --without-suid    do not install SUID binary (linux only)"
   105  	echo "     --without-network do not compile/install network plugins (linux only)"
   106  	echo
   107  	echo "  Path modification options:"
   108  	echo "     --prefix         install project in \`prefix'"
   109  	echo "     --exec-prefix    install project executables in \`exec-prefix'"
   110  	echo "     --bindir         install user executables in \`bindir'"
   111  	echo "     --sbindir        install admin executables in \`sbindir'"
   112  	echo "     --libexecdir     install program executables in \`libexecdir'"
   113  	echo "     --datarootdir    install read-only rootdir data in \`datarootdir'"
   114  	echo "     --datadir        install read-only data in \`datadir'"
   115  	echo "     --sysconfdir     install read-only config files in \`sysconfdir'"
   116  	echo "     --sharedstatedir install writable data in \`sharedstatedir'"
   117  	echo "     --localstatedir  install writable config files in \`localstatedir'"
   118  	echo "     --runstatedir    install writable per-process data in \`runstatedir'"
   119  	echo "     --includedir     install header files in \`includedir'"
   120  	echo "     --oldincludedir  install system header files in \`oldincludedir'"
   121  	echo "     --docdir         install root documentation in \`docdir'"
   122  	echo "     --infodir        install info documentation in \`infodir'"
   123  	echo "     --htmldir        install html documentation in \`htmldir'"
   124  	echo "     --dvidir         install dvi documentation in \`dvidir'"
   125  	echo "     --pdfdir         install pdf documentation in \`pdfdir'"
   126  	echo "     --psdir          install ps documentation in \`psdir'"
   127  	echo "     --libdir         install libraries in \`libdir'"
   128  	echo "     --localedir      install locale dependent data in \`localedir'"
   129  	echo "     --mandir         install man documentation in \`mandir'"
   130  	echo
   131  }
   132  
   133  # save the command line
   134  cmdline="`pwd -P`/${0##*/} $*"
   135  
   136  while [ $# -ne 0 ]; do
   137   case $1 in
   138    -p|--prefix*)
   139     if [ "$1" = "-p" ]; then
   140      if ! echo "$2" | awk '/^-.*/ || /^$/ { exit 2 }'; then
   141       echo "error: option requires an argument: $1"
   142       exit
   143      fi
   144      prefix=$2
   145      shift
   146     else
   147      if echo "$1" | awk '/^--prefix=.+$/ { exit 2 }'; then
   148       echo "error: option requires an argument: $1"
   149       exit
   150      fi
   151      prefix=`echo $1 | sed -e 's|.*\=\(.*\)|\1|'`
   152     fi
   153     shift;;
   154    -e|--exec-prefix*)
   155     if [ "$1" = "-e" ]; then
   156      if ! echo "$2" | awk '/^-.*/ || /^$/ { exit 2 }'; then
   157       echo "error: option requires an argument: $1"
   158       exit
   159      fi
   160      exec_prefix=$2
   161      shift
   162     else
   163      if echo "$1" | awk '/^--exec-prefix=.+$/ { exit 2 }'; then
   164       echo "error: option requires an argument: $1"
   165       exit
   166      fi
   167      exec_prefix=`echo $1 | sed -e 's|.*\=\(.*\)|\1|'`
   168     fi
   169     shift;;
   170    --bindir*)
   171     if echo "$1" | awk '/^--bindir=.+$/ { exit 2 }'; then
   172       echo "error: option requires an argument: $1"
   173       exit
   174     fi
   175     bindir=`echo $1 | sed -e 's|.*\=\(.*\)|\1|'`
   176     shift;;
   177    --sbindir*)
   178     if echo "$1" | awk '/^--sbindir=.+$/ { exit 2 }'; then
   179       echo "error: option requires an argument: $1"
   180       exit
   181     fi
   182     sbindir=`echo $1 | sed -e 's|.*\=\(.*\)|\1|'`
   183     shift;;
   184    --libexecdir*)
   185     if echo "$1" | awk '/^--libexecdir=.+$/ { exit 2 }'; then
   186       echo "error: option requires an argument: $1"
   187       exit
   188     fi
   189     libexecdir=`echo $1 | sed -e 's|.*\=\(.*\)|\1|'`
   190     shift;;
   191    --datarootdir*)
   192     if echo "$1" | awk '/^--datarootdir=.+$/ { exit 2 }'; then
   193       echo "error: option requires an argument: $1"
   194       exit
   195     fi
   196     datarootdir=`echo $1 | sed -e 's|.*\=\(.*\)|\1|'`
   197     shift;;
   198    --datadir*)
   199     if echo "$1" | awk '/^--datadir=.+$/ { exit 2 }'; then
   200       echo "error: option requires an argument: $1"
   201       exit
   202     fi
   203     datadir=`echo $1 | sed -e 's|.*\=\(.*\)|\1|'`
   204     shift;;
   205    --sysconfdir*)
   206     if echo "$1" | awk '/^--sysconfdir=.+$/ { exit 2 }'; then
   207       echo "error: option requires an argument: $1"
   208       exit
   209     fi
   210     sysconfdir=`echo $1 | sed -e 's|.*\=\(.*\)|\1|'`
   211     shift;;
   212    --sharedstatedir*)
   213     if echo "$1" | awk '/^--sharedstatedir=.+$/ { exit 2 }'; then
   214       echo "error: option requires an argument: $1"
   215       exit
   216     fi
   217     sharedstatedir=`echo $1 | sed -e 's|.*\=\(.*\)|\1|'`
   218     shift;;
   219    --localstatedir*)
   220     if echo "$1" | awk '/^--localstatedir=.+$/ { exit 2 }'; then
   221       echo "error: option requires an argument: $1"
   222       exit
   223     fi
   224     localstatedir=`echo $1 | sed -e 's|.*\=\(.*\)|\1|'`
   225     shift;;
   226    --runstatedir*)
   227     if echo "$1" | awk '/^--runstatedir=.+$/ { exit 2 }'; then
   228       echo "error: option requires an argument: $1"
   229       exit
   230     fi
   231     runstatedir=`echo $1 | sed -e 's|.*\=\(.*\)|\1|'`
   232     shift;;
   233    --includedir*)
   234     if echo "$1" | awk '/^--includedir=.+$/ { exit 2 }'; then
   235       echo "error: option requires an argument: $1"
   236       exit
   237     fi
   238     includedir=`echo $1 | sed -e 's|.*\=\(.*\)|\1|'`
   239     shift;;
   240    --oldincludedir*)
   241     if echo "$1" | awk '/^--oldincludedir=.+$/ { exit 2 }'; then
   242       echo "error: option requires an argument: $1"
   243       exit
   244     fi
   245     oldincludedir=`echo $1 | sed -e 's|.*\=\(.*\)|\1|'`
   246     shift;;
   247    --docdir*)
   248     if echo "$1" | awk '/^--docdir=.+$/ { exit 2 }'; then
   249       echo "error: option requires an argument: $1"
   250       exit
   251     fi
   252     docdir=`echo $1 | sed -e 's|.*\=\(.*\)|\1|'`
   253     shift;;
   254    --infodir*)
   255     if echo "$1" | awk '/^--infodir=.+$/ { exit 2 }'; then
   256       echo "error: option requires an argument: $1"
   257       exit
   258     fi
   259     infodir=`echo $1 | sed -e 's|.*\=\(.*\)|\1|'`
   260     shift;;
   261    --htmldir*)
   262     if echo "$1" | awk '/^--htmldir=.+$/ { exit 2 }'; then
   263       echo "error: option requires an argument: $1"
   264       exit
   265     fi
   266     htmldir=`echo $1 | sed -e 's|.*\=\(.*\)|\1|'`
   267     shift;;
   268    --dvidir*)
   269     if echo "$1" | awk '/^--dvidir=.+$/ { exit 2 }'; then
   270       echo "error: option requires an argument: $1"
   271       exit
   272     fi
   273     dvidir=`echo $1 | sed -e 's|.*\=\(.*\)|\1|'`
   274     shift;;
   275    --pdfdir*)
   276     if echo "$1" | awk '/^--pdfdir=.+$/ { exit 2 }'; then
   277       echo "error: option requires an argument: $1"
   278       exit
   279     fi
   280     pdfdir=`echo $1 | sed -e 's|.*\=\(.*\)|\1|'`
   281     shift;;
   282    --psdir*)
   283     if echo "$1" | awk '/^--psdir=.+$/ { exit 2 }'; then
   284       echo "error: option requires an argument: $1"
   285       exit
   286     fi
   287     psdir=`echo $1 | sed -e 's|.*\=\(.*\)|\1|'`
   288     shift;;
   289    --libdir*)
   290     if echo "$1" | awk '/^--libdir=.+$/ { exit 2 }'; then
   291       echo "error: option requires an argument: $1"
   292       exit
   293     fi
   294     libdir=`echo $1 | sed -e 's|.*\=\(.*\)|\1|'`
   295     shift;;
   296    --localedir*)
   297     if echo "$1" | awk '/^--localedir=.+$/ { exit 2 }'; then
   298       echo "error: option requires an argument: $1"
   299       exit
   300     fi
   301     localedir=`echo $1 | sed -e 's|.*\=\(.*\)|\1|'`
   302     shift;;
   303    --mandir*)
   304     if echo "$1" | awk '/^--mandir=.+$/ { exit 2 }'; then
   305       echo "error: option requires an argument: $1"
   306       exit
   307     fi
   308     mandir=`echo $1 | sed -e 's|.*\=\(.*\)|\1|'`
   309     shift;;
   310    -P)
   311     if ! echo "$2" | awk '/^-.*/ || /^$/ { exit 2 }'; then
   312       echo "error: option requires an argument: $1"
   313       exit
   314     fi
   315     profile=$2; shift; shift;;
   316    -b)
   317     if ! echo "$2" | awk '/^-.*/ || /^$/ { exit 2 }'; then
   318       echo "error: option requires an argument: $1"
   319       exit
   320     fi
   321     builddir="$2"; shift; shift;;
   322    -c)
   323     if ! echo "$2" | awk '/^-.*/ || /^$/ { exit 2 }'; then
   324       echo "error: option requires an argument: $1"
   325       exit
   326     fi
   327     hstcc="$2"; shift; shift;;
   328    -C)
   329     if ! echo "$2" | awk '/^-.*/ || /^$/ { exit 2 }'; then
   330       echo "error: option requires an argument: $1"
   331       exit
   332     fi
   333     tgtcc="$2"; shift; shift;;
   334    -x)
   335     if ! echo "$2" | awk '/^-.*/ || /^$/ { exit 2 }'; then
   336       echo "error: option requires an argument: $1"
   337       exit
   338     fi
   339     hstcxx="$2"; shift; shift;;
   340    -X)
   341     if ! echo "$2" | awk '/^-.*/ || /^$/ { exit 2 }'; then
   342       echo "error: option requires an argument: $1"
   343       exit
   344     fi
   345     tgtcxx="$2"; shift; shift;;
   346    -s)
   347     hststatic=1; shift;;
   348    -S)
   349     tgtstatic=1; shift;;
   350    -v)
   351     verbose=1; shift;;
   352    --without-suid)
   353     with_suid=0; shift;;
   354    --without-network)
   355     with_network=0; shift;;
   356    -V)
   357     if ! echo "$2" | awk '/^-.*/ || /^$/ { exit 2 }'; then
   358       echo "error: option requires an argument: $1"
   359       exit
   360     fi
   361     package_version="$2"; shift; shift;;
   362    -l)
   363     if ! echo "$2" | awk '/^-.*/ || /^$/ { exit 2 }'; then
   364       echo "error: option requires an argument: $1"
   365       exit
   366     fi
   367     case "$2" in
   368      c|C) lang_c=1;;
   369      go|GO|Go|Golang) lang_go=1;;
   370      *) echo "error: language not supported: $2"
   371         exit;;
   372     esac
   373     shift; shift;;
   374    -h) usage_args; exit 2;;
   375    --) shift; break;;
   376    ?) usage_args
   377       exit 2;;
   378    *) break;;
   379   esac
   380  done
   381  short_version="`echo "$package_version"|sed 's/-.*//'`"
   382  #
   383  # non-option param
   384  if [ $# != 0 ]; then
   385  	usage_args
   386  	exit 2
   387  fi
   388  
   389  # defaults paths
   390  if [ -z "${prefix}" ]; then
   391  	prefix=/usr/local
   392  fi
   393  if [ -z "${exec_prefix}" ]; then
   394  	exec_prefix=${prefix}
   395  fi
   396  if [ -z "${bindir}" ]; then
   397  	bindir=${exec_prefix}/bin
   398  fi
   399  if [ -z "${sbindir}" ]; then
   400  	sbindir=${exec_prefix}/sbin
   401  fi
   402  if [ -z "${libexecdir}" ]; then
   403  	libexecdir=${exec_prefix}/libexec
   404  fi
   405  if [ -z "${datarootdir}" ]; then
   406  	datarootdir=${prefix}/share
   407  fi
   408  if [ -z "${datadir}" ]; then
   409  	datadir=${datarootdir}
   410  fi
   411  if [ -z "${sysconfdir}" ]; then
   412  	sysconfdir=${prefix}/etc
   413  fi
   414  if [ -z "${sharedstatedir}" ]; then
   415  	sharedstatedir=${prefix}/com
   416  fi
   417  if [ -z "${localstatedir}" ]; then
   418  	localstatedir=${prefix}/var
   419  fi
   420  if [ -z "${runstatedir}" ]; then
   421  	runstatedir=${localstatedir}/run
   422  fi
   423  if [ -z "${includedir}" ]; then
   424  	includedir=${prefix}/include
   425  fi
   426  if [ -z "${oldincludedir}" ]; then
   427  	oldincludedir=/usr/include
   428  fi
   429  if [ -z "${docdir}" ]; then
   430  	docdir=${datarootdir}/doc/${package_name}
   431  fi
   432  if [ -z "${infodir}" ]; then
   433  	infodir=${datarootdir}/info
   434  fi
   435  if [ -z "${htmldir}" ]; then
   436  	htmldir=${docdir}
   437  fi
   438  if [ -z "${dvidir}" ]; then
   439  	dvidir=${docdir}
   440  fi
   441  if [ -z "${pdfdir}" ]; then
   442  	pdfdir=${docdir}
   443  fi
   444  if [ -z "${psdir}" ]; then
   445  	psdir=${docdir}
   446  fi
   447  if [ -z "${libdir}" ]; then
   448  	libdir=${exec_prefix}/lib
   449  fi
   450  if [ -z "${localedir}" ]; then
   451  	localedir=${datarootdir}/locale
   452  fi
   453  if [ -z "${mandir}" ]; then
   454  	mandir=${datarootdir}/man
   455  fi
   456  
   457  # check that at least a language is selected
   458  if [ $lang_c -eq 0 -a $lang_go -eq 0 ]; then
   459  	echo "error: no project source code language selected"
   460  	echo "NOTE: use ${0##*/} with the [-l (C,Go,...) option]"
   461  	exit 2
   462  fi
   463  
   464  # config profile validation
   465  case $profile in
   466  	release);;
   467  	release-stripped);;
   468  	debug);;
   469  	*) echo "$profile: no such config profile"
   470  	   echo "       -P use config profile to configure the project:"
   471  	   echo "           release             (DEFAULT) normal release mode (production)"
   472  	   echo "           release-stripped    release mode, stripped symbols (rpm packaging)"
   473  	   echo "           debug               C portion of CGO built unoptimized, with symbols"
   474  	   exit 2;;
   475  esac
   476  
   477  # sourcedir and builddir
   478  sourcedir=`pwd -P`
   479  if [ "$builddir" = "" ]; then
   480  	builddir=$sourcedir/builddir
   481  else
   482  	mkdir -p $builddir
   483  	if ! builddir=`(cd $builddir 2>/dev/null && pwd -P)`; then
   484  		echo "error: could not chdir to builddir"
   485  		exit 2
   486  	fi
   487  fi
   488  if [ -e $builddir -a $builddir != "." -a $builddir != ".." ]; then
   489  	rm -rf $builddir
   490  fi
   491  
   492  # setup some makeit base directories
   493  makeit_dir=$sourcedir/makeit
   494  makeit_mconflist=$sourcedir/mlocal/mconflist
   495  makeit_fragsdir=$sourcedir/mlocal/frags
   496  makeit_checksdir=$sourcedir/mlocal/checks
   497  makeit_scriptsdir=$sourcedir/mlocal/scripts
   498  # mconfig tmpfiles path
   499  makeit_interdir=$builddir/makeit-intermediate
   500  makeit_testprogdir=$makeit_interdir/testprogs
   501  # final generated Makefile
   502  makeit_makefile=$builddir/Makefile
   503  makeit_makefile_base=$makeit_interdir/base.mk
   504  
   505  # work directory and file creation
   506  mkdir -p $builddir
   507  mkdir -p $makeit_interdir
   508  mkdir -p $makeit_testprogdir
   509  :>$makeit_makefile_base
   510  
   511  
   512  # load mconfig helper scripts
   513  . $makeit_scriptsdir/config_h.sh #functions to add entries in config.h (C projects)
   514  
   515  
   516  printf "Configuring for project \`$package_name' with languages: "
   517  if [ $lang_c -eq 1 ]; then
   518  	printf "C"
   519  fi
   520  if [ $lang_go -eq 1 ]; then
   521  	printf ", Golang"
   522  fi
   523  echo
   524  
   525  #######################################################################
   526  # mlocal/checks/project-pre.chk -- executes before standard base checks
   527  #######################################################################
   528  if [ -f $makeit_checksdir/project-pre.chk ]; then
   529  	echo "=> running pre-basechecks project specific checks ..."
   530  	. $makeit_checksdir/project-pre.chk
   531  fi
   532  
   533  
   534  #######################################################################
   535  # mlocal/checks/basechecks.chk -- common to most projects
   536  #######################################################################
   537  if [ -f $makeit_checksdir/basechecks.chk ]; then
   538  	echo "=> running base system checks ..."
   539  	. $makeit_checksdir/basechecks.chk
   540  else
   541  	echo "error: file $makeit_checksdir/basechecks.chk needs to be present"
   542  	exit 2
   543  fi
   544  
   545  
   546  #######################################################################
   547  # mlocal/checks/project-post.chk -- executes after standard base checks
   548  #######################################################################
   549  if [ -f $makeit_checksdir/project-post.chk ]; then
   550  	echo "=> running post-basechecks project specific checks ..."
   551  	. $makeit_checksdir/project-post.chk
   552  fi
   553  
   554  
   555  #######################################################################
   556  # Generated fragments
   557  #######################################################################
   558  echo "=> generating fragments ..."
   559  if [ ! -d $makeit_fragsdir ]; then
   560  	echo "error: $makeit_fragsdir should be populated with Makefile fragments."
   561  	echo "NOTE: Fragments may be copied from examples or existing projects"
   562  	echo "NOTE: to $sourcedir/mlocal/* and tweak for your project."
   563  	exit 2
   564  fi
   565  
   566  
   567  ########################
   568  # verbosity
   569  ########################
   570  if [ "$verbose" = 1 ]; then
   571  	echo "# build with verbose flag on" >> $makeit_makefile_base
   572  	echo "V :=" >> $makeit_makefile_base
   573  else
   574  	echo "# silent build" >> $makeit_makefile_base
   575  	echo "V := @" >> $makeit_makefile_base
   576  fi
   577  echo >> $makeit_makefile_base
   578  
   579  # disable those options for non unix system
   580  if [ "$host" != "unix" ]; then
   581  	with_network=0
   582  	with_suid=0
   583  fi
   584  
   585  ########################
   586  # build tools
   587  ########################
   588  cat >> $makeit_makefile_base << EOF
   589  # source/build locations
   590  BUILDDIR := .
   591  BUILDDIR_ABSPATH := $builddir
   592  SOURCEDIR := $sourcedir
   593  SCRIPTSDIR := $makeit_scriptsdir
   594  CONTRIBDIR := $contribdir
   595  PREFIX := $prefix
   596  EXECPREFIX := $exec_prefix
   597  BINDIR := $bindir
   598  SBINDIR := $sbindir
   599  LIBEXECDIR := $libexecdir
   600  DATAROOTDIR := $datarootdir
   601  DATADIR := $datadir
   602  SYSCONFDIR := $sysconfdir
   603  SHAREDSTATEDIR := $sharedstatedir
   604  LOCALSTATEDIR := $localstatedir
   605  RUNSTATEDIR := $runstatedir
   606  INCLUDEDIR := $includedir
   607  OLDINCLUDEDIR := $oldincludedir
   608  DOCDIR := $docdir
   609  INFODIR := $infodir
   610  HTMLDIR := $htmldir
   611  DVIDIR := $dvidir
   612  PDFDIR := $pdfdir
   613  PSDIR := $psdir
   614  LIBDIR := $libdir
   615  LOCALEDIR := $localedir
   616  MANDIR := $mandir
   617  RPMPREFIX:=
   618  
   619  NAME := $package_name
   620  SHORT_VERSION := $short_version
   621  VERSION := $package_version
   622  
   623  HOSTAR := $hstar
   624  HOSTCC := $hstcc
   625  HOSTCXX := $hstcxx
   626  HOSTLD := $hstcc
   627  HOSTRANLIB := $hstranlib
   628  HOSTSIZE := size
   629  HOSTOBJCOPY := $hstobjcopy
   630  
   631  AR := $tgtar
   632  CC := $tgtcc
   633  CXX := $tgtcxx
   634  LD := $tgtld
   635  RANLIB := $tgtranlib
   636  SIZE := size
   637  OBJCOPY := $tgtobjcopy
   638  
   639  ARCH := $tgt_arch
   640  
   641  CFLAGS := $cflags
   642  
   643  CGO_CFLAGS := -include $builddir/config.h $CGO_CFLAGS
   644  CGO_LDFLAGS := $CGO_LDFLAGS
   645  CGO_CPPFLAGS := $CGO_CPPFLAGS
   646  CGO_CXXFLAGS := $CGO_CXXFLAGS
   647  export CGO_CFLAGS CGO_LDFLAGS CGO_CPPFLAGS CGO_CXXFLAGS
   648  EOF
   649  
   650  
   651  ########################
   652  # modules
   653  ########################
   654  :>$makeit_interdir/module.lst
   655  
   656  found_modules=`(cat $makeit_mconflist | awk '{ printf("%s ", $0) }') 2>/dev/null || true`
   657  if [ "$found_modules" = "" ]; then
   658  	found_modules=`find . -name '*.mconf' -print`
   659  fi
   660  
   661  if [ "$found_modules" != "" ]; then
   662  	echo " found build modules:"
   663  	echo "CPPFLAGS :=" >> $makeit_makefile_base
   664  	# NOTE: parsed module (*.mconf) files only substitute var tgt_arch for now
   665  	for m in $found_modules; do
   666  		mod=`eval echo ${m##*./}`
   667  		modpath=`eval echo ${mod%/*}`
   668  		if [ ! -f $mod ]; then
   669  			echo "error: module file \`$mod' not found!"
   670  			exit 2
   671  		fi
   672  		if [ $mod = $modpath ]; then
   673  			modpath="."
   674  		fi
   675  
   676  		echo "   +-> $mod"
   677  		echo "$modpath `eval basename $mod`" >> $makeit_interdir/module.lst
   678  		mkdir -p $makeit_interdir/$modpath
   679  		cat $mod | awk -v tgt_arch=$tgt_arch '{ gsub(/tgt_arch/, tgt_arch); print }' > \
   680  			$makeit_interdir/${mod}.parsed
   681  	done
   682  	echo >> $makeit_makefile_base
   683  fi
   684  
   685  # init LDFLAGS if static builds are supported
   686  if [ "$hststatic" = "1" -a "$tgtstatic" = "1" ]; then
   687  	echo "LDFLAGS := -static $ldflags" >> $makeit_makefile_base
   688  else
   689  	echo "LDFLAGS := $ldflags" >> $makeit_makefile_base
   690  fi
   691  echo >> $makeit_makefile_base
   692  
   693  cat >> $makeit_makefile_base << EOF
   694  # make sure \`all' is the first rule
   695  all:
   696  EOF
   697  
   698  
   699  # call genmod.awk, generating Makefile components
   700  $makeit_dir/genmod.awk mconflist=$makeit_interdir/module.lst \
   701  	host=$host \
   702  	makeitgendir=$makeit_interdir \
   703  	tmpldir=$makeit_dir/tmpl
   704  
   705  
   706  
   707  #######################################################################
   708  # Target Makefile
   709  #######################################################################
   710  drawline () {
   711  	echo >> $makeit_makefile
   712  	printf "# [ Embedding file : %50s ] #\n" $1 >> $makeit_makefile
   713  	echo >> $makeit_makefile
   714  }
   715  
   716  echo "=> building Makefile ..."
   717  
   718  :> $makeit_makefile
   719  echo "#" >> $makeit_makefile
   720  echo "# Non-recursive Makefile GENERATED by \`${0##*/}' -- `date`" >> $makeit_makefile
   721  echo "# configured: $cmdline" >> $makeit_makefile
   722  echo "#" >> $makeit_makefile
   723  
   724  drawline $makeit_makefile_base
   725  cat $makeit_makefile_base >> $makeit_makefile
   726  
   727  drawline $makeit_fragsdir/common_opts.mk
   728  cat $makeit_fragsdir/common_opts.mk >> $makeit_makefile
   729  
   730  drawline $makeit_fragsdir/go_common_opts.mk
   731  cat $makeit_fragsdir/go_common_opts.mk >> $makeit_makefile
   732  
   733  if [ -f "$makeit_fragsdir/go_${host}_opts.mk" ]; then
   734  	drawline $makeit_fragsdir/go_${host}_opts.mk
   735  	cat $makeit_fragsdir/go_${host}_opts.mk >> $makeit_makefile
   736  fi
   737  
   738  if [ "$appsec" = "1" ]; then
   739  	drawline $makeit_fragsdir/go_appsec_opts.mk
   740  	cat $makeit_fragsdir/go_appsec_opts.mk >> $makeit_makefile
   741  fi
   742  
   743  if [ "$build_runtime" = "1" ]; then
   744  	drawline $makeit_fragsdir/go_runtime_opts.mk
   745  	cat $makeit_fragsdir/go_runtime_opts.mk >> $makeit_makefile
   746  fi
   747  
   748  
   749  case $profile in
   750  	release)
   751  		if [ $lang_c -eq 1 ]; then
   752  			drawline $makeit_fragsdir/release_opts.mk
   753  			cat $makeit_fragsdir/release_opts.mk >> $makeit_makefile
   754  		fi
   755  		if [ $lang_go -eq 1 ]; then
   756  			drawline $makeit_fragsdir/go_normal_opts.mk
   757  			cat $makeit_fragsdir/go_normal_opts.mk >> $makeit_makefile
   758  		fi
   759  		;;
   760  	release-stripped)
   761  		if [ $lang_c -eq 1 ]; then
   762  			drawline $makeit_fragsdir/release_opts.mk
   763  			cat $makeit_fragsdir/release_opts.mk >> $makeit_makefile
   764  		fi
   765  		if [ $lang_go -eq 1 ]; then
   766  			drawline $makeit_fragsdir/go_stripped_opts.mk
   767  			cat $makeit_fragsdir/go_stripped_opts.mk >> $makeit_makefile
   768  		fi
   769  		;;
   770  	debug)
   771  		if [ $lang_c -eq 1 ]; then
   772  			drawline $makeit_fragsdir/debug_opts.mk
   773  			cat $makeit_fragsdir/debug_opts.mk >> $makeit_makefile
   774  		fi
   775  		if [ $lang_go -eq 1 ]; then
   776  			drawline $makeit_fragsdir/go_normal_opts.mk
   777  			cat $makeit_fragsdir/go_normal_opts.mk >> $makeit_makefile
   778  		fi
   779  		;;
   780  esac
   781  
   782  if [ -f "$makeit_fragsdir/arch_${tgt_arch}_opts.mk" ]; then
   783  	drawline $makeit_fragsdir/arch_${tgt_arch}_opts.mk
   784  	cat $makeit_fragsdir/arch_${tgt_arch}_opts.mk >> $makeit_makefile
   785  fi
   786  
   787  drawline $makeit_interdir/combined-mconfsready.mk
   788  cat $makeit_interdir/combined-mconfsready.mk >> $makeit_makefile
   789  
   790  drawline $makeit_interdir/all.mk
   791  cat $makeit_interdir/all.mk >> $makeit_makefile
   792  
   793  drawline $makeit_fragsdir/build_cli.mk
   794  cat $makeit_fragsdir/build_cli.mk >> $makeit_makefile
   795  
   796  if [ "$build_runtime" = 1 ]; then
   797  	drawline $makeit_fragsdir/build_runtime.mk
   798  	cat $makeit_fragsdir/build_runtime.mk >> $makeit_makefile
   799  fi
   800  
   801  if [ "$with_suid" = 1 ]; then
   802  	drawline $makeit_fragsdir/build_runtime_suid.mk
   803  	cat $makeit_fragsdir/build_runtime_suid.mk >> $makeit_makefile
   804  fi
   805  
   806  if [ "$with_network" = 1 ]; then
   807  	drawline $makeit_fragsdir/build_network.mk
   808  	cat $makeit_fragsdir/build_network.mk >> $makeit_makefile
   809  fi
   810  
   811  drawline $makeit_fragsdir/Makefile.stub
   812  # here, `depends' need to happen after all other rules; at the very end
   813  final_all=`cat $makeit_interdir/all.mk | awk 'BEGIN { FS="all: " } { print $2 }'`
   814  cat $makeit_fragsdir/Makefile.stub | awk \
   815  	"{ gsub(/^collect:/, \"collect: $final_all\"); print }" >> $makeit_makefile
   816  
   817  
   818  
   819  #######################################################################
   820  # Rpm spec for project package
   821  #######################################################################
   822  
   823  if [ "$host" = "unix" ]; then
   824  	RPMSPEC=singularity.spec
   825  	echo "=> generating $RPMSPEC ..."
   826  	rm -f $sourcedir/$RPMSPEC
   827  	release="`echo "$package_version"|sed 's/[^-]*-//'`"
   828  	if [ "$short_version" = "$release" ]; then
   829  	    # $package_version has no dash
   830  	    release=1
   831  	fi
   832  	sed "s/@PACKAGE_VERSION@/$short_version/;s/@PACKAGE_RELEASE@/$release/" $sourcedir/dist/rpm/$RPMSPEC.in >$sourcedir/$RPMSPEC
   833  fi
   834  
   835  
   836  
   837  #######################################################################
   838  # Configuration results
   839  #######################################################################
   840  echo "=> project $package_name setup with :"
   841  echo "    - host arch: $hst_arch"
   842  echo "    - host wordsize: ${hst_word}-bit"
   843  echo "    - host C compiler: $hstcc"
   844  echo "    - host system: $host"
   845  echo "      ---"
   846  echo "    - target arch: $tgt_arch"
   847  echo "    - target wordsize: ${tgt_word}-bit"
   848  echo "    - target C compiler: $tgtcc"
   849  echo "      ---"
   850  echo "    - config profile: $profile"
   851  echo "      ---"
   852  if [ "$with_suid" = 0 ]; then
   853  	echo "    - SUID install: no"
   854  else
   855  	echo "    - SUID install: yes"
   856  fi
   857  if [ "$with_network" = 0 ]; then
   858  	echo "    - Network plugins: no"
   859  else
   860  	echo "    - Network plugins: yes"
   861  fi
   862  echo "      ---"
   863  if [ "$verbose" = 1 ]; then
   864  	echo "    - verbose: yes"
   865  else
   866  	echo "    - verbose: no"
   867  fi
   868  echo "      ---"
   869  echo "    - version: $package_version"
   870  
   871  echo "=> $builddir/Makefile ready, try:"
   872  echo "   $ cd $builddir"
   873  echo "   $ make"