summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorGabriel Scherer <gabriel.scherer@gmail.com>2017-06-26 20:53:22 -0400
committerGabriel Scherer <gabriel.scherer@gmail.com>2017-07-23 08:19:55 +0200
commit890c8bb2ca757cb4d6788b285d7a628a4c15039b (patch)
treeb0af385d3179e213462a44ae884a015dcc07a3d1
parent393ff30948202c850cd862ee0f2028cfe04d749c (diff)
downloadocaml-890c8bb2ca757cb4d6788b285d7a628a4c15039b.tar.gz
[minor] harden config/Makefile against '#' in PREFIX
The opam-compiler-conf script will generate an opam switch name (and thus a directory name) from the name of the current git branch. Branches named 'PR#1234-foo-bar' would have the ./configure script generate a config/Makefile with the lines PREFIX=~/.opam/4.06.0+local-git-PR#1234-foo-bar BINDIR=$(PREFIX)/bin BYTERUN=$(BINDIR)/ocamlrun LIBDIR=$(PREFIX)/lib/ocaml The '#' in the first line parses as the start of a comment, so the second part is ignored and the build system would then install in ~/.opam/4.06.0+local-git-PR instead. After this change, config/Makefile starts with: # generated by ./configure --prefix ~/.opam/4.06.0+local-git-PR#1234-foo-bar CONFIGURE_ARGS=--prefix ~/.opam/4.06.0+local-git-PR\#1234-foo-bar PREFIX=~/.opam/4.06.0+local-git-PR\#1234-foo-bar
-rw-r--r--Changes3
-rwxr-xr-xconfigure229
2 files changed, 128 insertions, 104 deletions
diff --git a/Changes b/Changes
index e17af8c22e..798687d4e2 100644
--- a/Changes
+++ b/Changes
@@ -230,6 +230,9 @@ Working version
- GPR#1203: speed up the manual build by using ocamldoc.opt
(Gabriel Scherer, review by Florian Angeletti)
+- GPR#1214: harden config/Makefile against '#' characters in PREFIX
+ (Gabriel Scherer, review by David Allsopp and Damien Doligez)
+
- GPR#1242: disable C plugins loading by default
(Alexey Egorov)
diff --git a/configure b/configure
index c48413c531..88ede21207 100755
--- a/configure
+++ b/configure
@@ -259,33 +259,54 @@ touch s.h m.h Makefile
# Write options to Makefile
+config() {
+# This function hardens the generated Makefile against '#' symbols
+# present in a source path (opam-compiler-conf may pick such directory
+# names if working from a branch named 'PR#4242-answer-all-questions')
+# by escaping them into '\#'.
+
+# When injecting data in Makefiles, it is customary to also escape
+# '$', which get turned into '$$'. However, this transformation is
+# invalid here as some of the variables are meant to be code
+# interpreted by make: for example, passing
+# --bindir "$(PREFIX)/bin2"
+# is explicitly supported (see "or relative to $(PREFIX)" messages above).
+
+# Finally, it is also impossible for the user to escape the '#' signs
+# before calling this configure script, given that
+# $(PREFIX) is also injected in C code where this escape is invalid
+# -- see the definition of the OCAML_STDLIB_DIR macro below.
+
+ echo "$1=$2" | sed 's/#/\\#/g' >> Makefile
+}
+
echo "# generated by ./configure $configure_options" >> Makefile
-echo "CONFIGURE_ARGS=$configure_options" >> Makefile
+config CONFIGURE_ARGS "$configure_options"
# Where to install
-echo "PREFIX=$prefix" >> Makefile
+config PREFIX "$prefix"
case "$bindir" in
- "") echo 'BINDIR=$(PREFIX)/bin' >> Makefile
+ "") config BINDIR '$(PREFIX)/bin'
bindir="$prefix/bin";;
- *) echo "BINDIR=$bindir" >> Makefile;;
+ *) config BINDIR "$bindir";;
esac
-echo 'BYTERUN=$(BINDIR)/ocamlrun' >> Makefile
+config BYTERUN '$(BINDIR)/ocamlrun'
case "$libdir" in
- "") echo 'LIBDIR=$(PREFIX)/lib/ocaml' >> Makefile
+ "") config LIBDIR '$(PREFIX)/lib/ocaml'
libdir="$prefix/lib/ocaml";;
- *) echo "LIBDIR=$libdir" >> Makefile;;
+ *) config LIBDIR "$libdir";;
esac
-echo 'STUBLIBDIR=$(LIBDIR)/stublibs' >> Makefile
+config STUBLIBDIR '$(LIBDIR)/stublibs'
case "$mandir" in
- "") echo 'MANDIR=$(PREFIX)/man' >> Makefile
+ "") config MANDIR '$(PREFIX)/man'
mandir="$prefix/man";;
- *) echo "MANDIR=$mandir" >> Makefile;;
+ *) config MANDIR "$mandir";;
esac
-echo "PROGRAMS_MAN_SECTION=$programs_man_section" >> Makefile
-echo "LIBRARIES_MAN_SECTION=$libraries_man_section" >> Makefile
+config PROGRAMS_MAN_SECTION "$programs_man_section"
+config LIBRARIES_MAN_SECTION "$libraries_man_section"
# Determine the system type
@@ -560,7 +581,7 @@ if $cross_compiler; then
"($ocaml_system_version) doesn't match the version of these\n" \
"sources ($ocaml_source_version)."
else
- echo "CAMLRUN=`./searchpath -p ocamlrun`" >> Makefile
+ config CAMLRUN "`./searchpath -p ocamlrun`"
fi
fi
@@ -572,14 +593,14 @@ if $cross_compiler; then
err "While you have an ocamlyacc binary, it cannot be executed" \
"successfully."
else
- echo "CAMLYACC=`./searchpath -p ocamlyacc`" >> Makefile
+ config CAMLYACC "`./searchpath -p ocamlyacc`"
fi
fi
if [ -z "$target_bindir" ]; then
err "Cross-compilation requires -target-bindir."
else
- echo "TARGET_BINDIR=$target_bindir" >> Makefile
+ config TARGET_BINDIR "$target_bindir"
fi
fi # cross-compiler
@@ -1039,15 +1060,15 @@ esac
if sh ./searchpath ${TOOLPREF}ranlib; then
inf "ranlib found"
- echo "RANLIB=${TOOLPREF}ranlib" >> Makefile
- echo "RANLIBCMD=${TOOLPREF}ranlib" >> Makefile
+ config RANLIB "${TOOLPREF}ranlib"
+ config RANLIBCMD "${TOOLPREF}ranlib"
else
inf "ranlib not used"
- echo "RANLIB=${TOOLPREF}ar rs" >> Makefile
- echo "RANLIBCMD=" >> Makefile
+ config RANLIB "${TOOLPREF}ar rs"
+ config RANLIBCMD ""
fi
-echo "ARCMD=${TOOLPREF}ar" >> Makefile
+config ARCMD "${TOOLPREF}ar"
# Write the OS type (Unix or Cygwin)
@@ -1066,21 +1087,21 @@ if ( (./hashbang || ./hashbang2 || ./hashbang3 || ./hashbang4) >/dev/null); then
*-*-sunos*|*-*-unicos*)
wrn "We won't use it, though, because under SunOS and Unicos it breaks " \
"on pathnames longer than 30 characters"
- echo "HASHBANGSCRIPTS=false" >> Makefile;;
+ config HASHBANGSCRIPTS "false";;
*-*-cygwin*)
wrn "We won't use it, though, because of conflicts with .exe extension " \
"under Cygwin"
- echo "HASHBANGSCRIPTS=false" >> Makefile;;
+ config HASHBANGSCRIPTS "false";;
*-*-mingw*)
inf "We won't use it, though, because it's on the target platform " \
"it would be used and windows doesn't support it."
- echo "HASHBANGSCRIPTS=false" >> Makefile;;
+ config HASHBANGSCRIPTS "false";;
*)
- echo "HASHBANGSCRIPTS=true" >> Makefile;;
+ config HASHBANGSCRIPTS "true";;
esac
else
inf "No support for #! in shell scripts"
- echo "HASHBANGSCRIPTS=false" >> Makefile
+ config HASHBANGSCRIPTS "false"
fi
# Use 64-bit file offset if possible
@@ -1175,9 +1196,9 @@ case "$system" in
*) unix_or_win32="unix"; unixlib="unix"; graphlib="graph";;
esac
-echo "UNIX_OR_WIN32=$unix_or_win32" >> Makefile
-echo "UNIXLIB=$unixlib" >> Makefile
-echo "GRAPHLIB=$graphlib" >> Makefile
+config UNIX_OR_WIN32 "$unix_or_win32"
+config UNIXLIB "$unixlib"
+config GRAPHLIB "$graphlib"
otherlibraries="$unixlib str num dynlink bigarray"
@@ -1558,8 +1579,8 @@ case "$arch" in
*) bng_arch=generic; bng_asm_level=0;;
esac
-echo "BNG_ARCH=$bng_arch" >> Makefile
-echo "BNG_ASM_LEVEL=$bng_asm_level" >> Makefile
+config BNG_ARCH "$bng_arch"
+config BNG_ASM_LEVEL "$bng_asm_level"
# Determine if the POSIX threads library is supported
@@ -1604,8 +1625,8 @@ if test "$pthread_wanted" = "yes"; then
else
pthread_link=""
fi
-echo "PTHREAD_LINK=$pthread_link" >> Makefile
-echo "PTHREAD_CAML_LINK=$pthread_caml_link" >> Makefile
+config PTHREAD_LINK "$pthread_link"
+config PTHREAD_CAML_LINK "$pthread_caml_link"
# Determine if the bytecode thread library is supported
@@ -2000,22 +2021,22 @@ fi
cclibs="$cclibs $mathlib"
-echo CC="$cc" >> Makefile
-echo "CFLAGS=$common_cflags $internal_cflags" >> Makefile
-echo "CPPFLAGS=$common_cppflags $internal_cppflags" >> Makefile
-echo "OCAMLC_CFLAGS=$common_cflags $sharedcccompopts" >> Makefile
-echo "OCAMLC_CPPFLAGS=$common_cppflags" >> Makefile
-echo "LDFLAGS=$ldflags" >> Makefile
-echo "BYTECCLIBS=$cclibs $dllib $curseslibs $pthread_link \
- $instrumented_runtime_libs" >> Makefile
-echo "RPATH=$rpath" >> Makefile
-echo "EXE=$exe" >> Makefile
-echo "EMPTY=" >> Makefile
-echo "OUTPUTEXE=-o \$(EMPTY)" >> Makefile
-echo "SUPPORTS_SHARED_LIBRARIES=$shared_libraries_supported" >> Makefile
-echo "SHAREDCCCOMPOPTS=$sharedcccompopts" >> Makefile
-echo "MKSHAREDLIBRPATH=$mksharedlibrpath" >> Makefile
-echo "NATDYNLINKOPTS=$natdynlinkopts" >> Makefile
+config CC "$cc"
+config CFLAGS "$common_cflags $internal_cflags"
+config CPPFLAGS "$common_cppflags $internal_cppflags"
+config OCAMLC_CFLAGS "$common_cflags $sharedcccompopts"
+config OCAMLC_CPPFLAGS "$common_cppflags"
+config LDFLAGS "$ldflags"
+config BYTECCLIBS "$cclibs $dllib $curseslibs $pthread_link \
+ $instrumented_runtime_libs"
+config RPATH "$rpath"
+config EXE "$exe"
+config EMPTY ""
+config OUTPUTEXE "-o \$(EMPTY)"
+config SUPPORTS_SHARED_LIBRARIES "$shared_libraries_supported"
+config SHAREDCCCOMPOPTS "$sharedcccompopts"
+config MKSHAREDLIBRPATH "$mksharedlibrpath"
+config NATDYNLINKOPTS "$natdynlinkopts"
cat >> Makefile <<EOF
SYSLIB=-l\$(1)
#ml let syslib x = "-l"^x;;
@@ -2026,64 +2047,64 @@ MKLIB=${TOOLPREF}ar rc \$(1) \$(2); ${TOOLPREF}ranlib \$(1)
#ml Printf.sprintf "${TOOLPREF}ar rc %s %s %s; ${TOOLPREF}ranlib %s"
#ml out opts files out;;
EOF
-echo "ARCH=$arch" >> Makefile
-echo "MODEL=$model" >> Makefile
-echo "SYSTEM=$system" >> Makefile
-echo "OCAMLOPT_CFLAGS=$common_cflags" >> Makefile
-echo "OCAMLOPT_CPPFLAGS=$common_cppflags" >> Makefile
-echo "NATIVECCPROFOPTS=$nativeccprofopts" >> Makefile
-echo "NATIVECCLIBS=$cclibs $dllib" >> Makefile
-echo "ASM=$as" >> Makefile
-echo "ASPP=$aspp" >> Makefile
-echo "ASPPPROFFLAGS=$asppprofflags" >> Makefile
-echo "PROFILING=$profiling" >> Makefile
-echo "DYNLINKOPTS=$dllib" >> Makefile
-echo "OTHERLIBRARIES=$otherlibraries" >> Makefile
-echo "CC_PROFILE=$cc_profile" >> Makefile
-echo "SYSTHREAD_SUPPORT=$systhread_support" >> Makefile
-echo "PACKLD=$partialld -o\\ " >> Makefile
-echo "IFLEXDIR=$iflexdir" >> Makefile
-echo "O=o" >> Makefile
-echo "A=a" >> Makefile
-echo "SO=$SO" >> Makefile
-echo "EXT_OBJ=.o" >> Makefile
-echo "OUTPUTOBJ=-o \$(EMPTY)" >> Makefile
-echo "EXT_ASM=.s" >> Makefile
-echo "EXT_LIB=.a" >> Makefile
-echo "EXT_DLL=.$SO" >> Makefile
-echo "EXTRALIBS=" >> Makefile
-echo "CCOMPTYPE=cc" >> Makefile
-echo "TOOLCHAIN=$TOOLCHAIN" >> Makefile
-echo "NATDYNLINK=$natdynlink" >> Makefile
-echo "CMXS=$cmxs" >> Makefile
-echo "MKEXE=$mkexe" >> Makefile
-echo "MKEXEDEBUGFLAG=$mkexedebugflag" >> Makefile
-echo "MKDLL=$mksharedlib" >> Makefile
-echo "MKMAINDLL=$mkmaindll" >> Makefile
-echo "RUNTIMED=${debugruntime}" >>Makefile
-echo "RUNTIMEI=${with_instrumented_runtime}" >>Makefile
-echo "WITH_DEBUGGER=${with_debugger}" >>Makefile
-echo "WITH_OCAMLDOC=${with_ocamldoc}" >>Makefile
-echo "ASM_CFI_SUPPORTED=$asm_cfi_supported" >> Makefile
-echo "WITH_FRAME_POINTERS=$with_frame_pointers" >> Makefile
-echo "WITH_SPACETIME=$with_spacetime" >> Makefile
-echo "WITH_SPACETIME_CALL_COUNTS=$with_spacetime_call_counts" >> Makefile
-echo "WITH_PROFINFO=$with_profinfo" >> Makefile
-echo "LIBUNWIND_AVAILABLE=$libunwind_available" >> Makefile
-echo "LIBUNWIND_INCLUDE_FLAGS=$libunwind_include" >> Makefile
-echo "LIBUNWIND_LINK_FLAGS=$libunwind_lib" >> Makefile
-echo "PROFINFO_WIDTH=$profinfo_width" >> Makefile
-echo "WITH_CPLUGINS=$with_cplugins" >> Makefile
-echo "WITH_FPIC=$with_fpic" >> Makefile
-echo "TARGET=$target" >> Makefile
-echo "HOST=$host" >> Makefile
+config ARCH "$arch"
+config MODEL "$model"
+config SYSTEM "$system"
+config OCAMLOPT_CFLAGS "$common_cflags"
+config OCAMLOPT_CPPFLAGS "$common_cppflags"
+config NATIVECCPROFOPTS "$nativeccprofopts"
+config NATIVECCLIBS "$cclibs $dllib"
+config ASM "$as"
+config ASPP "$aspp"
+config ASPPPROFFLAGS "$asppprofflags"
+config PROFILING "$profiling"
+config DYNLINKOPTS "$dllib"
+config OTHERLIBRARIES "$otherlibraries"
+config CC_PROFILE "$cc_profile"
+config SYSTHREAD_SUPPORT "$systhread_support"
+config PACKLD "$partialld -o\\ \$(EMPTY)"
+config IFLEXDIR "$iflexdir"
+config O "o"
+config A "a"
+config SO "$SO"
+config EXT_OBJ ".o"
+config OUTPUTOBJ "-o \$(EMPTY)"
+config EXT_ASM ".s"
+config EXT_LIB ".a"
+config EXT_DLL ".$SO"
+config EXTRALIBS ""
+config CCOMPTYPE "cc"
+config TOOLCHAIN "$TOOLCHAIN"
+config NATDYNLINK "$natdynlink"
+config CMXS "$cmxs"
+config MKEXE "$mkexe"
+config MKEXEDEBUGFLAG "$mkexedebugflag"
+config MKDLL "$mksharedlib"
+config MKMAINDLL "$mkmaindll"
+config RUNTIMED "${debugruntime}"
+config RUNTIMEI "${with_instrumented_runtime}"
+config WITH_DEBUGGER "${with_debugger}"
+config WITH_OCAMLDOC "${with_ocamldoc}"
+config ASM_CFI_SUPPORTED "$asm_cfi_supported"
+config WITH_FRAME_POINTERS "$with_frame_pointers"
+config WITH_SPACETIME "$with_spacetime"
+config WITH_SPACETIME_CALL_COUNTS "$with_spacetime_call_counts"
+config WITH_PROFINFO "$with_profinfo"
+config LIBUNWIND_AVAILABLE "$libunwind_available"
+config LIBUNWIND_INCLUDE_FLAGS "$libunwind_include"
+config LIBUNWIND_LINK_FLAGS "$libunwind_lib"
+config PROFINFO_WIDTH "$profinfo_width"
+config WITH_CPLUGINS "$with_cplugins"
+config WITH_FPIC "$with_fpic"
+config TARGET "$target"
+config HOST "$host"
if [ "$ostype" = Cygwin ]; then
- echo "DIFF=diff -q --strip-trailing-cr" >>Makefile
+ config DIFF "diff -q --strip-trailing-cr"
fi
-echo "FLAMBDA=$flambda" >> Makefile
-echo "SAFE_STRING=$safe_string" >> Makefile
-echo "AFL_INSTRUMENT=$afl_instrument" >> Makefile
-echo "MAX_TESTSUITE_DIR_RETRIES=$max_testsuite_dir_retries" >> Makefile
+config FLAMBDA "$flambda"
+config SAFE_STRING "$safe_string"
+config AFL_INSTRUMENT "$afl_instrument"
+config MAX_TESTSUITE_DIR_RETRIES "$max_testsuite_dir_retries"
rm -f tst hasgot.c