mirror of
https://git.code.sf.net/p/quake/quakeforge
synced 2024-11-26 06:10:56 +00:00
make cpp command line selection more intelligent. This should take care of
the stuck cpp problem on openbsd.
This commit is contained in:
parent
718c64bc2c
commit
f2a8f8ff28
2 changed files with 120 additions and 26 deletions
21
configure.ac
21
configure.ac
|
@ -94,6 +94,25 @@ AM_PROG_LIBTOOL
|
||||||
AC_PROG_YACC
|
AC_PROG_YACC
|
||||||
AM_PROG_LEX
|
AM_PROG_LEX
|
||||||
|
|
||||||
|
AC_ARG_WITH(cpp,
|
||||||
|
[ --with-cpp=CPP how qfcc should invoke cpp],
|
||||||
|
cpp_name="$withval", cpp_name=auto
|
||||||
|
)
|
||||||
|
if test "x$cpp_name" != xauto; then
|
||||||
|
CPP_NAME="$cpp_name"
|
||||||
|
else
|
||||||
|
case "$target_os" in
|
||||||
|
*bsd*)
|
||||||
|
touch conftest.c
|
||||||
|
CPP_NAME="`(f=\`$CC -v -E -Dfoo conftest.c -o conftest.i 2>&1 | grep -e -Dfoo\`; set $f; echo "$1")` %d %i %o"
|
||||||
|
rm -f conftest.[ci]
|
||||||
|
;;
|
||||||
|
linux*)
|
||||||
|
CPP_NAME="cpp %d -o %o %i"
|
||||||
|
;;
|
||||||
|
esac
|
||||||
|
fi
|
||||||
|
|
||||||
AC_CHECK_LIB(l, main, LEXLIB="-ll", AC_CHECK_LIB(fl, main, LEXLIB="-lfl"))
|
AC_CHECK_LIB(l, main, LEXLIB="-ll", AC_CHECK_LIB(fl, main, LEXLIB="-lfl"))
|
||||||
AC_SUBST(LEXLIB)
|
AC_SUBST(LEXLIB)
|
||||||
|
|
||||||
|
@ -1748,7 +1767,6 @@ AC_SUBST(QFCC_DEPS)
|
||||||
AC_SUBST(QFCC_INCS)
|
AC_SUBST(QFCC_INCS)
|
||||||
|
|
||||||
AC_DEFINE_UNQUOTED(PATH_SEPARATOR, '/')
|
AC_DEFINE_UNQUOTED(PATH_SEPARATOR, '/')
|
||||||
CPP_NAME=$ac_cv_prog_CPP
|
|
||||||
AC_DEFINE_UNQUOTED(CPP_NAME, "$CPP_NAME")
|
AC_DEFINE_UNQUOTED(CPP_NAME, "$CPP_NAME")
|
||||||
AC_DEFINE(USE_CPP)
|
AC_DEFINE(USE_CPP)
|
||||||
|
|
||||||
|
@ -1863,6 +1881,7 @@ AC_MSG_RESULT([
|
||||||
Compression support: $HAVE_ZLIB
|
Compression support: $HAVE_ZLIB
|
||||||
Compiler version : $CCVER
|
Compiler version : $CCVER
|
||||||
Compiler flags : $CFLAGS
|
Compiler flags : $CFLAGS
|
||||||
|
qfcc cpp invocation: $CPP_NAME
|
||||||
|
|
||||||
Shared game data directory: $sharepath
|
Shared game data directory: $sharepath
|
||||||
Per-user game data directory: $userpath
|
Per-user game data directory: $userpath
|
||||||
|
|
|
@ -92,12 +92,17 @@ char destfile[1024];
|
||||||
char debugfile[1024];
|
char debugfile[1024];
|
||||||
|
|
||||||
#ifdef USE_CPP
|
#ifdef USE_CPP
|
||||||
# define CPP_MAX_USER_ARGS 250
|
typedef struct cpp_arg_s {
|
||||||
# define CPP_MAX_ARGS 256
|
struct cpp_arg_s *next;
|
||||||
/*
|
const char *arg;
|
||||||
We reserve 6 args at the end.
|
} cpp_arg_t;
|
||||||
*/
|
|
||||||
char *cpp_argv[CPP_MAX_ARGS];
|
cpp_arg_t *cpp_arg_list;
|
||||||
|
cpp_arg_t **cpp_arg_tail = &cpp_arg_list;
|
||||||
|
cpp_arg_t *cpp_def_list;
|
||||||
|
cpp_arg_t **cpp_def_tail = &cpp_def_list;
|
||||||
|
const char **cpp_argv;
|
||||||
|
char *cpp_name = CPP_NAME;
|
||||||
static int cpp_argc = 0;
|
static int cpp_argc = 0;
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
|
@ -716,18 +721,87 @@ usage (int status)
|
||||||
exit (status);
|
exit (status);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
#ifdef USE_CPP
|
||||||
|
static void
|
||||||
|
add_cpp_arg (const char *arg)
|
||||||
|
{
|
||||||
|
cpp_arg_t *cpp_arg = malloc (sizeof (cpp_arg_t));
|
||||||
|
cpp_arg->next = 0;
|
||||||
|
cpp_arg->arg = arg;
|
||||||
|
*cpp_arg_tail = cpp_arg;
|
||||||
|
cpp_arg_tail = &(*cpp_arg_tail)->next;
|
||||||
|
cpp_argc++;
|
||||||
|
}
|
||||||
|
|
||||||
|
static void
|
||||||
|
add_cpp_def (const char *arg)
|
||||||
|
{
|
||||||
|
cpp_arg_t *cpp_def = malloc (sizeof (cpp_arg_t));
|
||||||
|
cpp_def->next = 0;
|
||||||
|
cpp_def->arg = arg;
|
||||||
|
*cpp_def_tail = cpp_def;
|
||||||
|
cpp_def_tail = &(*cpp_def_tail)->next;
|
||||||
|
cpp_argc++;
|
||||||
|
}
|
||||||
|
|
||||||
|
static void
|
||||||
|
parse_cpp_name ()
|
||||||
|
{
|
||||||
|
char *n;
|
||||||
|
|
||||||
|
n = strdup (cpp_name);
|
||||||
|
while (*n) {
|
||||||
|
while (*n && *n == ' ')
|
||||||
|
n++;
|
||||||
|
add_cpp_arg (n);
|
||||||
|
while (*n && *n != ' ')
|
||||||
|
n++;
|
||||||
|
if (*n)
|
||||||
|
*n++ = 0;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
static void
|
||||||
|
build_cpp_args (const char *in_name, const char *out_name)
|
||||||
|
{
|
||||||
|
cpp_arg_t *cpp_arg;
|
||||||
|
cpp_arg_t *cpp_def;
|
||||||
|
const char **arg;
|
||||||
|
|
||||||
|
if (cpp_argv)
|
||||||
|
free (cpp_argv);
|
||||||
|
cpp_argv = (const char **)malloc ((cpp_argc + 1) * sizeof (char**));
|
||||||
|
for (arg = cpp_argv, cpp_arg = cpp_arg_list;
|
||||||
|
cpp_arg;
|
||||||
|
cpp_arg = cpp_arg->next) {
|
||||||
|
if (!strcmp (cpp_arg->arg, "%d")) {
|
||||||
|
for (cpp_def = cpp_def_list; cpp_def; cpp_def = cpp_def->next)
|
||||||
|
*arg++ = cpp_def->arg;
|
||||||
|
} else if (!strcmp (cpp_arg->arg, "%i")) {
|
||||||
|
*arg++ = in_name;
|
||||||
|
} else if (!strcmp (cpp_arg->arg, "%o")) {
|
||||||
|
*arg++ = out_name;
|
||||||
|
} else {
|
||||||
|
*arg++ = cpp_arg->arg;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
*arg = 0;
|
||||||
|
for (arg = cpp_argv; *arg; arg++)
|
||||||
|
printf ("%s ", *arg);
|
||||||
|
puts ("");
|
||||||
|
}
|
||||||
|
#endif
|
||||||
|
|
||||||
static int
|
static int
|
||||||
DecodeArgs (int argc, char **argv)
|
DecodeArgs (int argc, char **argv)
|
||||||
{
|
{
|
||||||
int c;
|
int c;
|
||||||
|
|
||||||
#ifdef USE_CPP
|
#ifdef USE_CPP
|
||||||
for (c = 0; c < CPP_MAX_ARGS; cpp_argv[c++] = NULL); // clear the args
|
add_cpp_def ("-D__QFCC__=1");
|
||||||
cpp_argv[cpp_argc++] = "cpp";
|
add_cpp_def ("-D__QUAKEC__=1");
|
||||||
cpp_argv[cpp_argc++] = "-D__QFCC__=1";
|
add_cpp_def ("-D__RUAMOKO__=1");
|
||||||
cpp_argv[cpp_argc++] = "-D__QUAKEC__=1";
|
add_cpp_def ("-D__RAUMOKO__=1");
|
||||||
cpp_argv[cpp_argc++] = "-D__RUAMOKO__=1";
|
|
||||||
cpp_argv[cpp_argc++] = "-D__RAUMOKO__=1";
|
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
options.code.cpp = true;
|
options.code.cpp = true;
|
||||||
|
@ -803,7 +877,7 @@ DecodeArgs (int argc, char **argv)
|
||||||
} else if (!(strcasecmp (temp, "v6only"))) {
|
} else if (!(strcasecmp (temp, "v6only"))) {
|
||||||
options.code.progsversion = PROG_ID_VERSION;
|
options.code.progsversion = PROG_ID_VERSION;
|
||||||
#ifdef USE_CPP
|
#ifdef USE_CPP
|
||||||
cpp_argv[cpp_argc++] = "-D__VERSION6__=1";
|
add_cpp_def ("-D__VERSION6__=1");
|
||||||
#endif
|
#endif
|
||||||
} else if (!(strcasecmp (temp, "no-v6only"))) {
|
} else if (!(strcasecmp (temp, "no-v6only"))) {
|
||||||
options.code.progsversion = PROG_VERSION;
|
options.code.progsversion = PROG_VERSION;
|
||||||
|
@ -868,11 +942,11 @@ DecodeArgs (int argc, char **argv)
|
||||||
char *opts = strdup (optarg);
|
char *opts = strdup (optarg);
|
||||||
char *temp = strtok (opts, ",");
|
char *temp = strtok (opts, ",");
|
||||||
|
|
||||||
while (temp && (cpp_argc < CPP_MAX_USER_ARGS)) {
|
while (temp) {
|
||||||
char temp2[1024];
|
char temp2[1024];
|
||||||
|
|
||||||
snprintf (temp2, sizeof (temp2), "%s%s", "-D", temp);
|
snprintf (temp2, sizeof (temp2), "%s%s", "-D", temp);
|
||||||
cpp_argv[cpp_argc++] = strdup (temp2);
|
add_cpp_def (strdup (temp2));
|
||||||
temp = strtok (NULL, ",");
|
temp = strtok (NULL, ",");
|
||||||
}
|
}
|
||||||
free (opts);
|
free (opts);
|
||||||
|
@ -882,11 +956,11 @@ DecodeArgs (int argc, char **argv)
|
||||||
char *opts = strdup (optarg);
|
char *opts = strdup (optarg);
|
||||||
char *temp = strtok (opts, ",");
|
char *temp = strtok (opts, ",");
|
||||||
|
|
||||||
while (temp && (cpp_argc < CPP_MAX_USER_ARGS)) {
|
while (temp) {
|
||||||
char temp2[1024];
|
char temp2[1024];
|
||||||
|
|
||||||
snprintf (temp2, sizeof (temp2), "%s%s", "-I", temp);
|
snprintf (temp2, sizeof (temp2), "%s%s", "-I", temp);
|
||||||
cpp_argv[cpp_argc++] = strdup (temp2);
|
add_cpp_def (strdup (temp2));
|
||||||
temp = strtok (NULL, ",");
|
temp = strtok (NULL, ",");
|
||||||
}
|
}
|
||||||
free (opts);
|
free (opts);
|
||||||
|
@ -896,11 +970,11 @@ DecodeArgs (int argc, char **argv)
|
||||||
char *opts = strdup (optarg);
|
char *opts = strdup (optarg);
|
||||||
char *temp = strtok (opts, ",");
|
char *temp = strtok (opts, ",");
|
||||||
|
|
||||||
while (temp && (cpp_argc < CPP_MAX_USER_ARGS)) {
|
while (temp) {
|
||||||
char temp2[1024];
|
char temp2[1024];
|
||||||
|
|
||||||
snprintf (temp2, sizeof (temp2), "%s%s", "-U", temp);
|
snprintf (temp2, sizeof (temp2), "%s%s", "-U", temp);
|
||||||
cpp_argv[cpp_argc++] = strdup (temp2);
|
add_cpp_def (strdup (temp2));
|
||||||
temp = strtok (NULL, ",");
|
temp = strtok (NULL, ",");
|
||||||
}
|
}
|
||||||
free (opts);
|
free (opts);
|
||||||
|
@ -977,6 +1051,10 @@ main (int argc, char **argv)
|
||||||
|
|
||||||
PR_BeginCompilation ();
|
PR_BeginCompilation ();
|
||||||
|
|
||||||
|
#ifdef USE_CPP
|
||||||
|
parse_cpp_name ();
|
||||||
|
#endif
|
||||||
|
|
||||||
// compile all the files
|
// compile all the files
|
||||||
while ((src = Parse (src))) {
|
while ((src = Parse (src))) {
|
||||||
#ifdef USE_CPP
|
#ifdef USE_CPP
|
||||||
|
@ -1027,6 +1105,7 @@ main (int argc, char **argv)
|
||||||
snprintf (tempname, sizeof (tempname), "%s%c%sXXXXXX", temp1,
|
snprintf (tempname, sizeof (tempname), "%s%c%sXXXXXX", temp1,
|
||||||
PATH_SEPARATOR, temp2 ? temp2 + 1 : argv[0]);
|
PATH_SEPARATOR, temp2 ? temp2 + 1 : argv[0]);
|
||||||
}
|
}
|
||||||
|
build_cpp_args (filename, tempname);
|
||||||
|
|
||||||
# ifdef _WIN32
|
# ifdef _WIN32
|
||||||
if (!options.save_temps)
|
if (!options.save_temps)
|
||||||
|
@ -1035,7 +1114,7 @@ main (int argc, char **argv)
|
||||||
fclose (yyin);
|
fclose (yyin);
|
||||||
|
|
||||||
{
|
{
|
||||||
int status = spawnvp (_P_WAIT, "cpp", cpp_argv);
|
int status = spawnvp (_P_WAIT, cpp_argv[0], cpp_argv);
|
||||||
|
|
||||||
if (status) {
|
if (status) {
|
||||||
fprintf (stderr, "%s: cpp returned error code %d\n",
|
fprintf (stderr, "%s: cpp returned error code %d\n",
|
||||||
|
@ -1056,11 +1135,7 @@ main (int argc, char **argv)
|
||||||
}
|
}
|
||||||
if (!pid) {
|
if (!pid) {
|
||||||
// we're a child, check for abuse
|
// we're a child, check for abuse
|
||||||
cpp_argv[cpp_argc++] = "-o";
|
execvp (cpp_argv[0], (char **)cpp_argv);
|
||||||
cpp_argv[cpp_argc++] = tempname;
|
|
||||||
cpp_argv[cpp_argc++] = filename;
|
|
||||||
|
|
||||||
execvp ("cpp", cpp_argv);
|
|
||||||
fprintf (stderr, "Child shouldn't reach here\n");
|
fprintf (stderr, "Child shouldn't reach here\n");
|
||||||
exit (1);
|
exit (1);
|
||||||
} else {
|
} else {
|
||||||
|
|
Loading…
Reference in a new issue