|
Packit |
bf408e |
/* configure.c - core analysis suite
|
|
Packit |
bf408e |
*
|
|
Packit |
bf408e |
* Copyright (C) 1999, 2000, 2001, 2002 Mission Critical Linux, Inc.
|
|
Packit |
bf408e |
* Copyright (C) 2002-2013 David Anderson
|
|
Packit |
bf408e |
* Copyright (C) 2002-2013 Red Hat, Inc. All rights reserved.
|
|
Packit |
bf408e |
*
|
|
Packit |
bf408e |
* This program is free software; you can redistribute it and/or modify
|
|
Packit |
bf408e |
* it under the terms of the GNU General Public License as published by
|
|
Packit |
bf408e |
* the Free Software Foundation; either version 2 of the License, or
|
|
Packit |
bf408e |
* (at your option) any later version.
|
|
Packit |
bf408e |
*
|
|
Packit |
bf408e |
* This program is distributed in the hope that it will be useful,
|
|
Packit |
bf408e |
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
|
Packit |
bf408e |
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
|
Packit |
bf408e |
* GNU General Public License for more details.
|
|
Packit |
bf408e |
*/
|
|
Packit |
bf408e |
|
|
Packit |
bf408e |
/*
|
|
Packit |
bf408e |
* define, clear and undef dynamically update the top-level Makefile:
|
|
Packit |
bf408e |
*
|
|
Packit |
bf408e |
* -b define: TARGET, GDB, GDB_FILES, GDB_OFILES, GDB_PATCH_FILES,
|
|
Packit |
bf408e |
* TARGET_CFLAGS, LDFLAGS, GDB_CONF_FLAGS and GPL_FILES
|
|
Packit |
bf408e |
* create: build_data.c
|
|
Packit |
bf408e |
*
|
|
Packit |
bf408e |
* -d define: TARGET, GDB, GDB_FILES, GDB_OFILES, GDB_PATCH_FILES,
|
|
Packit |
bf408e |
* TARGET_CFLAGS, LDFLAGS, GDB_CONF_FLAGS and PROGRAM (for daemon)
|
|
Packit |
bf408e |
* create: build_data.c
|
|
Packit |
bf408e |
*
|
|
Packit |
bf408e |
* -u clear: TARGET, GDB, GDB_FILES, GDB_OFILES, VERSION, GDB_PATCH_FILES,
|
|
Packit |
bf408e |
* TARGET_CFLAGS, LDFLAGS, GDB_CONF_FLAGS and GPL_FILES
|
|
Packit |
bf408e |
* undef: WARNING_ERROR, WARNING_OPTIONS
|
|
Packit |
bf408e |
*
|
|
Packit |
bf408e |
* -r define: GDB_FILES, VERSION, GDB_PATCH_FILES GPL_FILES
|
|
Packit |
bf408e |
*
|
|
Packit |
bf408e |
* -w define: WARNING_OPTIONS
|
|
Packit |
bf408e |
* undef: WARNING_ERROR
|
|
Packit |
bf408e |
*
|
|
Packit |
bf408e |
* -W define: WARNING_ERROR, WARNING_OPTIONS
|
|
Packit |
bf408e |
*
|
|
Packit |
bf408e |
* -n undef: WARNING_ERROR, WARNING_OPTIONS
|
|
Packit |
bf408e |
*
|
|
Packit |
bf408e |
* -g define: GDB
|
|
Packit |
bf408e |
*
|
|
Packit |
bf408e |
* -p Create or remove .rh_rpm_package file
|
|
Packit |
bf408e |
*
|
|
Packit |
bf408e |
* -q Don't print configuration
|
|
Packit |
bf408e |
*
|
|
Packit |
bf408e |
* -s Create crash.spec file
|
|
Packit |
bf408e |
*
|
|
Packit |
bf408e |
* -x Add extra libraries/flags to build
|
|
Packit |
bf408e |
*/
|
|
Packit |
bf408e |
|
|
Packit |
bf408e |
#include <stdio.h>
|
|
Packit |
bf408e |
#include <stdlib.h>
|
|
Packit |
bf408e |
#include <string.h>
|
|
Packit |
bf408e |
#include <sys/stat.h>
|
|
Packit |
bf408e |
#include <unistd.h>
|
|
Packit |
bf408e |
#include <ctype.h>
|
|
Packit |
bf408e |
|
|
Packit |
bf408e |
struct supported_gdb_version;
|
|
Packit |
bf408e |
void build_configure(struct supported_gdb_version *);
|
|
Packit |
bf408e |
void release_configure(char *, struct supported_gdb_version *);
|
|
Packit |
bf408e |
void make_rh_rpm_package(char *, int);
|
|
Packit |
bf408e |
void unconfigure(void);
|
|
Packit |
bf408e |
void set_warnings(int);
|
|
Packit |
bf408e |
void show_configuration(void);
|
|
Packit |
bf408e |
void target_rebuild_instructions(struct supported_gdb_version *, char *);
|
|
Packit |
bf408e |
void arch_mismatch(struct supported_gdb_version *);
|
|
Packit |
bf408e |
void get_current_configuration(struct supported_gdb_version *);
|
|
Packit |
bf408e |
void makefile_setup(FILE **, FILE **);
|
|
Packit |
bf408e |
void makefile_create(FILE **, FILE **);
|
|
Packit |
bf408e |
char *strip_linefeeds(char *);
|
|
Packit |
bf408e |
char *upper_case(char *, char *);
|
|
Packit |
bf408e |
char *lower_case(char *, char *);
|
|
Packit |
bf408e |
char *shift_string_left(char *, int);
|
|
Packit |
bf408e |
char *shift_string_right(char *, int);
|
|
Packit |
bf408e |
char *strip_beginning_whitespace(char *);
|
|
Packit |
bf408e |
char *strip_ending_whitespace(char *);
|
|
Packit |
bf408e |
char *strip_linefeeds(char *);
|
|
Packit |
bf408e |
int file_exists(char *);
|
|
Packit |
bf408e |
int count_chars(char *, char);
|
|
Packit |
bf408e |
void make_build_data(char *);
|
|
Packit |
bf408e |
void gdb_configure(struct supported_gdb_version *);
|
|
Packit |
bf408e |
int parse_line(char *, char **);
|
|
Packit |
bf408e |
struct supported_gdb_version *setup_gdb_defaults(void);
|
|
Packit |
bf408e |
struct supported_gdb_version *store_gdb_defaults(struct supported_gdb_version *);
|
|
Packit |
bf408e |
void make_spec_file(struct supported_gdb_version *);
|
|
Packit |
bf408e |
void set_initial_target(struct supported_gdb_version *);
|
|
Packit |
bf408e |
char *target_to_name(int);
|
|
Packit |
bf408e |
int name_to_target(char *);
|
|
Packit |
bf408e |
char *get_extra_flags(char *, char *);
|
|
Packit |
bf408e |
void add_extra_lib(char *);
|
|
Packit |
bf408e |
|
|
Packit |
bf408e |
#define TRUE 1
|
|
Packit |
bf408e |
#define FALSE 0
|
|
Packit |
bf408e |
|
|
Packit |
bf408e |
#undef X86
|
|
Packit |
bf408e |
#undef ALPHA
|
|
Packit |
bf408e |
#undef PPC
|
|
Packit |
bf408e |
#undef IA64
|
|
Packit |
bf408e |
#undef S390
|
|
Packit |
bf408e |
#undef S390X
|
|
Packit |
bf408e |
#undef PPC64
|
|
Packit |
bf408e |
#undef X86_64
|
|
Packit |
bf408e |
#undef ARM
|
|
Packit |
bf408e |
#undef ARM64
|
|
Packit |
bf408e |
#undef SPARC64
|
|
Packit |
bf408e |
|
|
Packit |
bf408e |
#define UNKNOWN 0
|
|
Packit |
bf408e |
#define X86 1
|
|
Packit |
bf408e |
#define ALPHA 2
|
|
Packit |
bf408e |
#define PPC 3
|
|
Packit |
bf408e |
#define IA64 4
|
|
Packit |
bf408e |
#define S390 5
|
|
Packit |
bf408e |
#define S390X 6
|
|
Packit |
bf408e |
#define PPC64 7
|
|
Packit |
bf408e |
#define X86_64 8
|
|
Packit |
bf408e |
#define ARM 9
|
|
Packit |
bf408e |
#define ARM64 10
|
|
Packit |
bf408e |
#define MIPS 11
|
|
Packit |
bf408e |
#define SPARC64 12
|
|
Packit |
bf408e |
|
|
Packit |
bf408e |
#define TARGET_X86 "TARGET=X86"
|
|
Packit |
bf408e |
#define TARGET_ALPHA "TARGET=ALPHA"
|
|
Packit |
bf408e |
#define TARGET_PPC "TARGET=PPC"
|
|
Packit |
bf408e |
#define TARGET_IA64 "TARGET=IA64"
|
|
Packit |
bf408e |
#define TARGET_S390 "TARGET=S390"
|
|
Packit |
bf408e |
#define TARGET_S390X "TARGET=S390X"
|
|
Packit |
bf408e |
#define TARGET_PPC64 "TARGET=PPC64"
|
|
Packit |
bf408e |
#define TARGET_X86_64 "TARGET=X86_64"
|
|
Packit |
bf408e |
#define TARGET_ARM "TARGET=ARM"
|
|
Packit |
bf408e |
#define TARGET_ARM64 "TARGET=ARM64"
|
|
Packit |
bf408e |
#define TARGET_MIPS "TARGET=MIPS"
|
|
Packit |
bf408e |
#define TARGET_SPARC64 "TARGET=SPARC64"
|
|
Packit |
bf408e |
|
|
Packit |
bf408e |
#define TARGET_CFLAGS_X86 "TARGET_CFLAGS=-D_FILE_OFFSET_BITS=64"
|
|
Packit |
bf408e |
#define TARGET_CFLAGS_ALPHA "TARGET_CFLAGS="
|
|
Packit |
bf408e |
#define TARGET_CFLAGS_PPC "TARGET_CFLAGS=-D_FILE_OFFSET_BITS=64"
|
|
Packit |
bf408e |
#define TARGET_CFLAGS_IA64 "TARGET_CFLAGS="
|
|
Packit |
bf408e |
#define TARGET_CFLAGS_S390 "TARGET_CFLAGS=-D_FILE_OFFSET_BITS=64"
|
|
Packit |
bf408e |
#define TARGET_CFLAGS_S390X "TARGET_CFLAGS="
|
|
Packit |
bf408e |
#define TARGET_CFLAGS_PPC64 "TARGET_CFLAGS=-m64"
|
|
Packit |
bf408e |
#define TARGET_CFLAGS_X86_64 "TARGET_CFLAGS="
|
|
Packit |
bf408e |
#define TARGET_CFLAGS_ARM "TARGET_CFLAGS=-D_FILE_OFFSET_BITS=64"
|
|
Packit |
bf408e |
#define TARGET_CFLAGS_ARM_ON_X86 "TARGET_CFLAGS=-D_FILE_OFFSET_BITS=64"
|
|
Packit |
bf408e |
#define TARGET_CFLAGS_ARM_ON_X86_64 "TARGET_CFLAGS=-m32 -D_FILE_OFFSET_BITS=64"
|
|
Packit |
bf408e |
#define TARGET_CFLAGS_X86_ON_X86_64 "TARGET_CFLAGS=-m32 -D_FILE_OFFSET_BITS=64"
|
|
Packit |
bf408e |
#define TARGET_CFLAGS_PPC_ON_PPC64 "TARGET_CFLAGS=-m32 -D_FILE_OFFSET_BITS=64 -fPIC"
|
|
Packit |
bf408e |
#define TARGET_CFLAGS_ARM64 "TARGET_CFLAGS="
|
|
Packit |
bf408e |
#define TARGET_CFLAGS_ARM64_ON_X86_64 "TARGET_CFLAGS="
|
|
Packit |
bf408e |
#define TARGET_CFLAGS_PPC64_ON_X86_64 "TARGET_CFLAGS="
|
|
Packit |
bf408e |
#define TARGET_CFLAGS_MIPS "TARGET_CFLAGS=-D_FILE_OFFSET_BITS=64"
|
|
Packit |
bf408e |
#define TARGET_CFLAGS_MIPS_ON_X86 "TARGET_CFLAGS=-D_FILE_OFFSET_BITS=64"
|
|
Packit |
bf408e |
#define TARGET_CFLAGS_MIPS_ON_X86_64 "TARGET_CFLAGS=-m32 -D_FILE_OFFSET_BITS=64"
|
|
Packit |
bf408e |
#define TARGET_CFLAGS_SPARC64 "TARGET_CFLAGS="
|
|
Packit |
bf408e |
|
|
Packit |
bf408e |
#define GDB_TARGET_DEFAULT "GDB_CONF_FLAGS="
|
|
Packit |
bf408e |
#define GDB_TARGET_ARM_ON_X86 "GDB_CONF_FLAGS=--target=arm-elf-linux"
|
|
Packit |
bf408e |
#define GDB_TARGET_ARM_ON_X86_64 "GDB_CONF_FLAGS=--target=arm-elf-linux CFLAGS=-m32"
|
|
Packit |
bf408e |
#define GDB_TARGET_X86_ON_X86_64 "GDB_CONF_FLAGS=--target=i686-pc-linux-gnu CFLAGS=-m32"
|
|
Packit |
bf408e |
#define GDB_TARGET_PPC_ON_PPC64 "GDB_CONF_FLAGS=--target=ppc-elf-linux CFLAGS=-m32"
|
|
Packit |
bf408e |
#define GDB_TARGET_ARM64_ON_X86_64 "GDB_CONF_FLAGS=--target=aarch64-elf-linux" /* TBD */
|
|
Packit |
bf408e |
#define GDB_TARGET_PPC64_ON_X86_64 "GDB_CONF_FLAGS=--target=powerpc64le-unknown-linux-gnu"
|
|
Packit |
bf408e |
#define GDB_TARGET_MIPS_ON_X86 "GDB_CONF_FLAGS=--target=mipsel-elf-linux"
|
|
Packit |
bf408e |
#define GDB_TARGET_MIPS_ON_X86_64 "GDB_CONF_FLAGS=--target=mipsel-elf-linux CFLAGS=-m32"
|
|
Packit |
bf408e |
|
|
Packit |
bf408e |
/*
|
|
Packit |
bf408e |
* The original plan was to allow the use of a particular version
|
|
Packit |
bf408e |
* of gdb for a given architecture. But for practical purposes,
|
|
Packit |
bf408e |
* it's a one-size-fits-all scheme, and they all use the default
|
|
Packit |
bf408e |
* unless overridden.
|
|
Packit |
bf408e |
*/
|
|
Packit |
bf408e |
|
|
Packit |
bf408e |
#define GDB_5_3 (0)
|
|
Packit |
bf408e |
#define GDB_6_0 (1)
|
|
Packit |
bf408e |
#define GDB_6_1 (2)
|
|
Packit |
bf408e |
#define GDB_7_0 (3)
|
|
Packit |
bf408e |
#define GDB_7_3_1 (4)
|
|
Packit |
bf408e |
#define GDB_7_6 (5)
|
|
Packit |
bf408e |
#define SUPPORTED_GDB_VERSIONS (GDB_7_6 + 1)
|
|
Packit |
bf408e |
|
|
Packit |
bf408e |
int default_gdb = GDB_7_6;
|
|
Packit |
bf408e |
|
|
Packit |
bf408e |
struct supported_gdb_version {
|
|
Packit |
bf408e |
char *GDB;
|
|
Packit |
bf408e |
char *GDB_VERSION_IN;
|
|
Packit |
bf408e |
char *GDB_FILES;
|
|
Packit |
bf408e |
char *GDB_OFILES;
|
|
Packit |
bf408e |
char *GDB_PATCH_FILES;
|
|
Packit |
bf408e |
char *GDB_FLAGS;
|
|
Packit |
bf408e |
char *GPL;
|
|
Packit |
bf408e |
} supported_gdb_versions[SUPPORTED_GDB_VERSIONS] = {
|
|
Packit |
bf408e |
{
|
|
Packit |
bf408e |
"GDB=gdb-5.3post-0.20021129.36rh",
|
|
Packit |
bf408e |
"Red Hat Linux (5.3post-0.20021129.36rh)",
|
|
Packit |
bf408e |
"GDB_FILES=${GDB_5.3post-0.20021129.36rh_FILES}",
|
|
Packit |
bf408e |
"GDB_OFILES=${GDB_5.3post-0.20021129.36rh_OFILES}",
|
|
Packit |
bf408e |
"GDB_PATCH_FILES=",
|
|
Packit |
bf408e |
"GDB_FLAGS=-DGDB_5_3",
|
|
Packit |
bf408e |
"GPLv2"
|
|
Packit |
bf408e |
},
|
|
Packit |
bf408e |
{
|
|
Packit |
bf408e |
"GDB=gdb-6.0",
|
|
Packit |
bf408e |
"6.0",
|
|
Packit |
bf408e |
"GDB_FILES=${GDB_6.0_FILES}",
|
|
Packit |
bf408e |
"GDB_OFILES=${GDB_6.0_OFILES}",
|
|
Packit |
bf408e |
"GDB_PATCH_FILES=",
|
|
Packit |
bf408e |
"GDB_FLAGS=-DGDB_6_0",
|
|
Packit |
bf408e |
"GPLv2"
|
|
Packit |
bf408e |
},
|
|
Packit |
bf408e |
{
|
|
Packit |
bf408e |
"GDB=gdb-6.1",
|
|
Packit |
bf408e |
"6.1",
|
|
Packit |
bf408e |
"GDB_FILES=${GDB_6.1_FILES}",
|
|
Packit |
bf408e |
"GDB_OFILES=${GDB_6.1_OFILES}",
|
|
Packit |
bf408e |
"GDB_PATCH_FILES=gdb-6.1.patch",
|
|
Packit |
bf408e |
"GDB_FLAGS=-DGDB_6_1",
|
|
Packit |
bf408e |
"GPLv2"
|
|
Packit |
bf408e |
},
|
|
Packit |
bf408e |
{
|
|
Packit |
bf408e |
"GDB=gdb-7.0",
|
|
Packit |
bf408e |
"7.0",
|
|
Packit |
bf408e |
"GDB_FILES=${GDB_7.0_FILES}",
|
|
Packit |
bf408e |
"GDB_OFILES=${GDB_7.0_OFILES}",
|
|
Packit |
bf408e |
"GDB_PATCH_FILES=gdb-7.0.patch",
|
|
Packit |
bf408e |
"GDB_FLAGS=-DGDB_7_0",
|
|
Packit |
bf408e |
"GPLv3"
|
|
Packit |
bf408e |
},
|
|
Packit |
bf408e |
{
|
|
Packit |
bf408e |
"GDB=gdb-7.3.1",
|
|
Packit |
bf408e |
"7.3.1",
|
|
Packit |
bf408e |
"GDB_FILES=${GDB_7.3.1_FILES}",
|
|
Packit |
bf408e |
"GDB_OFILES=${GDB_7.3.1_OFILES}",
|
|
Packit |
bf408e |
"GDB_PATCH_FILES=gdb-7.3.1.patch",
|
|
Packit |
bf408e |
"GDB_FLAGS=-DGDB_7_3_1",
|
|
Packit |
bf408e |
"GPLv3"
|
|
Packit |
bf408e |
},
|
|
Packit |
bf408e |
{
|
|
Packit |
bf408e |
"GDB=gdb-7.6",
|
|
Packit |
bf408e |
"7.6",
|
|
Packit |
bf408e |
"GDB_FILES=${GDB_7.6_FILES}",
|
|
Packit |
bf408e |
"GDB_OFILES=${GDB_7.6_OFILES}",
|
|
Packit |
bf408e |
"GDB_PATCH_FILES=gdb-7.6.patch gdb-7.6-ppc64le-support.patch gdb-7.6-proc_service.h.patch",
|
|
Packit |
bf408e |
"GDB_FLAGS=-DGDB_7_6",
|
|
Packit |
bf408e |
"GPLv3"
|
|
Packit |
bf408e |
},
|
|
Packit |
bf408e |
};
|
|
Packit |
bf408e |
|
|
Packit |
bf408e |
#define DAEMON 0x1
|
|
Packit |
bf408e |
#define QUIET 0x2
|
|
Packit |
bf408e |
|
|
Packit |
bf408e |
#define MAXSTRLEN 256
|
|
Packit |
bf408e |
#define MIN(a,b) (((a)<(b))?(a):(b))
|
|
Packit |
bf408e |
|
|
Packit |
bf408e |
struct target_data {
|
|
Packit |
bf408e |
int target;
|
|
Packit |
bf408e |
int host;
|
|
Packit |
bf408e |
int initial_gdb_target;
|
|
Packit |
bf408e |
int flags;
|
|
Packit |
bf408e |
char program[MAXSTRLEN];
|
|
Packit |
bf408e |
char gdb_version[MAXSTRLEN];
|
|
Packit |
bf408e |
char release[MAXSTRLEN];
|
|
Packit |
bf408e |
struct stat statbuf;
|
|
Packit |
bf408e |
const char *target_as_param;
|
|
Packit |
bf408e |
} target_data = { 0 };
|
|
Packit |
bf408e |
|
|
Packit |
bf408e |
int
|
|
Packit |
bf408e |
main(int argc, char **argv)
|
|
Packit |
bf408e |
{
|
|
Packit |
bf408e |
int c;
|
|
Packit |
bf408e |
struct supported_gdb_version *sp;
|
|
Packit |
bf408e |
|
|
Packit |
bf408e |
sp = setup_gdb_defaults();
|
|
Packit |
bf408e |
|
|
Packit |
bf408e |
while ((c = getopt(argc, argv, "gsqnWwubdr:p:P:t:x:")) > 0) {
|
|
Packit |
bf408e |
switch (c) {
|
|
Packit |
bf408e |
case 'q':
|
|
Packit |
bf408e |
target_data.flags |= QUIET;
|
|
Packit |
bf408e |
break;
|
|
Packit |
bf408e |
case 'u':
|
|
Packit |
bf408e |
unconfigure();
|
|
Packit |
bf408e |
break;
|
|
Packit |
bf408e |
case 'd':
|
|
Packit |
bf408e |
target_data.flags |= DAEMON;
|
|
Packit |
bf408e |
case 'b':
|
|
Packit |
bf408e |
build_configure(sp);
|
|
Packit |
bf408e |
break;
|
|
Packit |
bf408e |
case 'r':
|
|
Packit |
bf408e |
release_configure(optarg, sp);
|
|
Packit |
bf408e |
break;
|
|
Packit |
bf408e |
case 'p':
|
|
Packit |
bf408e |
make_rh_rpm_package(optarg, 0);
|
|
Packit |
bf408e |
break;
|
|
Packit |
bf408e |
case 'P':
|
|
Packit |
bf408e |
make_rh_rpm_package(optarg, 1);
|
|
Packit |
bf408e |
break;
|
|
Packit |
bf408e |
case 'W':
|
|
Packit |
bf408e |
case 'w':
|
|
Packit |
bf408e |
case 'n':
|
|
Packit |
bf408e |
set_warnings(c);
|
|
Packit |
bf408e |
break;
|
|
Packit |
bf408e |
case 's':
|
|
Packit |
bf408e |
make_spec_file(sp);
|
|
Packit |
bf408e |
break;
|
|
Packit |
bf408e |
case 'g':
|
|
Packit |
bf408e |
gdb_configure(sp);
|
|
Packit |
bf408e |
break;
|
|
Packit |
bf408e |
case 't':
|
|
Packit |
bf408e |
target_data.target_as_param = optarg;
|
|
Packit |
bf408e |
break;
|
|
Packit |
bf408e |
case 'x':
|
|
Packit |
bf408e |
add_extra_lib(optarg);
|
|
Packit |
bf408e |
break;
|
|
Packit |
bf408e |
}
|
|
Packit |
bf408e |
}
|
|
Packit |
bf408e |
|
|
Packit |
bf408e |
exit(0);
|
|
Packit |
bf408e |
}
|
|
Packit |
bf408e |
|
|
Packit |
bf408e |
void
|
|
Packit |
bf408e |
target_rebuild_instructions(struct supported_gdb_version *sp, char *target)
|
|
Packit |
bf408e |
{
|
|
Packit |
bf408e |
fprintf(stderr,
|
|
Packit |
bf408e |
"\nIn order to build a crash binary for the %s architecture:\n",
|
|
Packit |
bf408e |
target);
|
|
Packit |
bf408e |
|
|
Packit |
bf408e |
fprintf(stderr, " 1. remove the %s subdirectory\n",
|
|
Packit |
bf408e |
&sp->GDB[strlen("GDB=")]);
|
|
Packit |
bf408e |
fprintf(stderr, " 2. perform a \"make clean\"\n");
|
|
Packit |
bf408e |
fprintf(stderr, " 3. retry the build\n\n");
|
|
Packit |
bf408e |
}
|
|
Packit |
bf408e |
|
|
Packit |
bf408e |
void
|
|
Packit |
bf408e |
arch_mismatch(struct supported_gdb_version *sp)
|
|
Packit |
bf408e |
{
|
|
Packit |
bf408e |
fprintf(stderr,
|
|
Packit |
bf408e |
"\nThe initial build in this source tree was for the %s architecture.\n",
|
|
Packit |
bf408e |
target_to_name(target_data.initial_gdb_target));
|
|
Packit |
bf408e |
|
|
Packit |
bf408e |
target_rebuild_instructions(sp, target_to_name(target_data.target));
|
|
Packit |
bf408e |
|
|
Packit |
bf408e |
exit(1);
|
|
Packit |
bf408e |
}
|
|
Packit |
bf408e |
|
|
Packit |
bf408e |
void
|
|
Packit |
bf408e |
get_current_configuration(struct supported_gdb_version *sp)
|
|
Packit |
bf408e |
{
|
|
Packit |
bf408e |
FILE *fp;
|
|
Packit |
bf408e |
static char buf[512];
|
|
Packit |
bf408e |
char *p;
|
|
Packit |
bf408e |
|
|
Packit |
bf408e |
#ifdef __alpha__
|
|
Packit |
bf408e |
target_data.target = ALPHA;
|
|
Packit |
bf408e |
#endif
|
|
Packit |
bf408e |
#ifdef __i386__
|
|
Packit |
bf408e |
target_data.target = X86;
|
|
Packit |
bf408e |
#endif
|
|
Packit |
bf408e |
#ifdef __powerpc__
|
|
Packit |
bf408e |
target_data.target = PPC;
|
|
Packit |
bf408e |
#endif
|
|
Packit |
bf408e |
#ifdef __ia64__
|
|
Packit |
bf408e |
target_data.target = IA64;
|
|
Packit |
bf408e |
#endif
|
|
Packit |
bf408e |
#ifdef __s390__
|
|
Packit |
bf408e |
target_data.target = S390;
|
|
Packit |
bf408e |
#endif
|
|
Packit |
bf408e |
#ifdef __s390x__
|
|
Packit |
bf408e |
target_data.target = S390X;
|
|
Packit |
bf408e |
#endif
|
|
Packit |
bf408e |
#ifdef __powerpc64__
|
|
Packit |
bf408e |
target_data.target = PPC64;
|
|
Packit |
bf408e |
#endif
|
|
Packit |
bf408e |
#ifdef __x86_64__
|
|
Packit |
bf408e |
target_data.target = X86_64;
|
|
Packit |
bf408e |
#endif
|
|
Packit |
bf408e |
#ifdef __arm__
|
|
Packit |
bf408e |
target_data.target = ARM;
|
|
Packit |
bf408e |
#endif
|
|
Packit |
bf408e |
#ifdef __aarch64__
|
|
Packit |
bf408e |
target_data.target = ARM64;
|
|
Packit |
bf408e |
#endif
|
|
Packit |
bf408e |
#ifdef __mips__
|
|
Packit |
bf408e |
target_data.target = MIPS;
|
|
Packit |
bf408e |
#endif
|
|
Packit |
bf408e |
#ifdef __sparc_v9__
|
|
Packit |
bf408e |
target_data.target = SPARC64;
|
|
Packit |
bf408e |
#endif
|
|
Packit |
bf408e |
|
|
Packit |
bf408e |
set_initial_target(sp);
|
|
Packit |
bf408e |
|
|
Packit |
bf408e |
/*
|
|
Packit |
bf408e |
* Override target if specified on command line.
|
|
Packit |
bf408e |
*/
|
|
Packit |
bf408e |
target_data.host = target_data.target;
|
|
Packit |
bf408e |
|
|
Packit |
bf408e |
if (target_data.target_as_param) {
|
|
Packit |
bf408e |
if ((target_data.target == X86 || target_data.target == X86_64) &&
|
|
Packit |
bf408e |
(name_to_target((char *)target_data.target_as_param) == ARM)) {
|
|
Packit |
bf408e |
/*
|
|
Packit |
bf408e |
* Debugging of ARM core files supported on X86, and on
|
|
Packit |
bf408e |
* X86_64 when built as a 32-bit executable.
|
|
Packit |
bf408e |
*/
|
|
Packit |
bf408e |
target_data.target = ARM;
|
|
Packit |
bf408e |
} else if ((target_data.target == X86 || target_data.target == X86_64) &&
|
|
Packit |
bf408e |
(name_to_target((char *)target_data.target_as_param) == MIPS)) {
|
|
Packit |
bf408e |
/*
|
|
Packit |
bf408e |
* Debugging of MIPS little-endian core files
|
|
Packit |
bf408e |
* supported on X86, and on X86_64 when built as a
|
|
Packit |
bf408e |
* 32-bit executable.
|
|
Packit |
bf408e |
*/
|
|
Packit |
bf408e |
target_data.target = MIPS;
|
|
Packit |
bf408e |
} else if ((target_data.target == X86_64) &&
|
|
Packit |
bf408e |
(name_to_target((char *)target_data.target_as_param) == X86)) {
|
|
Packit |
bf408e |
/*
|
|
Packit |
bf408e |
* Build an X86 crash binary on an X86_64 host.
|
|
Packit |
bf408e |
*/
|
|
Packit |
bf408e |
target_data.target = X86;
|
|
Packit |
bf408e |
} else if ((target_data.target == X86_64) &&
|
|
Packit |
bf408e |
(name_to_target((char *)target_data.target_as_param) == ARM64)) {
|
|
Packit |
bf408e |
/*
|
|
Packit |
bf408e |
* Build an ARM64 crash binary on an X86_64 host.
|
|
Packit |
bf408e |
*/
|
|
Packit |
bf408e |
target_data.target = ARM64;
|
|
Packit |
bf408e |
} else if ((target_data.target == X86_64) &&
|
|
Packit |
bf408e |
(name_to_target((char *)target_data.target_as_param) == PPC64)) {
|
|
Packit |
bf408e |
/*
|
|
Packit |
bf408e |
* Build a PPC64 little-endian crash binary on an X86_64 host.
|
|
Packit |
bf408e |
*/
|
|
Packit |
bf408e |
target_data.target = PPC64;
|
|
Packit |
bf408e |
} else if ((target_data.target == PPC64) &&
|
|
Packit |
bf408e |
(name_to_target((char *)target_data.target_as_param) == PPC)) {
|
|
Packit |
bf408e |
/*
|
|
Packit |
bf408e |
* Build an PPC crash binary on an PPC64 host.
|
|
Packit |
bf408e |
*/
|
|
Packit |
bf408e |
target_data.target = PPC;
|
|
Packit |
bf408e |
} else if (name_to_target((char *)target_data.target_as_param) ==
|
|
Packit |
bf408e |
target_data.host) {
|
|
Packit |
bf408e |
if ((target_data.initial_gdb_target != UNKNOWN) &&
|
|
Packit |
bf408e |
(target_data.host != target_data.initial_gdb_target))
|
|
Packit |
bf408e |
arch_mismatch(sp);
|
|
Packit |
bf408e |
} else {
|
|
Packit |
bf408e |
fprintf(stderr,
|
|
Packit |
bf408e |
"\ntarget=%s is not supported on the %s host architecture\n\n",
|
|
Packit |
bf408e |
target_data.target_as_param,
|
|
Packit |
bf408e |
target_to_name(target_data.host));
|
|
Packit |
bf408e |
exit(1);
|
|
Packit |
bf408e |
}
|
|
Packit |
bf408e |
}
|
|
Packit |
bf408e |
|
|
Packit |
bf408e |
/*
|
|
Packit |
bf408e |
* Impose implied (sticky) target if an initial build has been
|
|
Packit |
bf408e |
* done in the source tree.
|
|
Packit |
bf408e |
*/
|
|
Packit |
bf408e |
if (target_data.initial_gdb_target &&
|
|
Packit |
bf408e |
(target_data.target != target_data.initial_gdb_target)) {
|
|
Packit |
bf408e |
if ((target_data.initial_gdb_target == ARM) &&
|
|
Packit |
bf408e |
(target_data.target != ARM)) {
|
|
Packit |
bf408e |
if ((target_data.target == X86) ||
|
|
Packit |
bf408e |
(target_data.target == X86_64))
|
|
Packit |
bf408e |
target_data.target = ARM;
|
|
Packit |
bf408e |
else
|
|
Packit |
bf408e |
arch_mismatch(sp);
|
|
Packit |
bf408e |
}
|
|
Packit |
bf408e |
if ((target_data.target == ARM) &&
|
|
Packit |
bf408e |
(target_data.initial_gdb_target != ARM))
|
|
Packit |
bf408e |
arch_mismatch(sp);
|
|
Packit |
bf408e |
|
|
Packit |
bf408e |
if ((target_data.initial_gdb_target == MIPS) &&
|
|
Packit |
bf408e |
(target_data.target != MIPS)) {
|
|
Packit |
bf408e |
if ((target_data.target == X86) ||
|
|
Packit |
bf408e |
(target_data.target == X86_64))
|
|
Packit |
bf408e |
target_data.target = MIPS;
|
|
Packit |
bf408e |
else
|
|
Packit |
bf408e |
arch_mismatch(sp);
|
|
Packit |
bf408e |
}
|
|
Packit |
bf408e |
|
|
Packit |
bf408e |
if ((target_data.initial_gdb_target == X86) &&
|
|
Packit |
bf408e |
(target_data.target != X86)) {
|
|
Packit |
bf408e |
if (target_data.target == X86_64)
|
|
Packit |
bf408e |
target_data.target = X86;
|
|
Packit |
bf408e |
else
|
|
Packit |
bf408e |
arch_mismatch(sp);
|
|
Packit |
bf408e |
}
|
|
Packit |
bf408e |
if ((target_data.target == X86) &&
|
|
Packit |
bf408e |
(target_data.initial_gdb_target != X86))
|
|
Packit |
bf408e |
arch_mismatch(sp);
|
|
Packit |
bf408e |
|
|
Packit |
bf408e |
if ((target_data.initial_gdb_target == ARM64) &&
|
|
Packit |
bf408e |
(target_data.target != ARM64)) {
|
|
Packit |
bf408e |
if (target_data.target == X86_64)
|
|
Packit |
bf408e |
target_data.target = ARM64;
|
|
Packit |
bf408e |
else
|
|
Packit |
bf408e |
arch_mismatch(sp);
|
|
Packit |
bf408e |
}
|
|
Packit |
bf408e |
if ((target_data.target == ARM64) &&
|
|
Packit |
bf408e |
(target_data.initial_gdb_target != ARM64))
|
|
Packit |
bf408e |
arch_mismatch(sp);
|
|
Packit |
bf408e |
|
|
Packit |
bf408e |
if ((target_data.initial_gdb_target == PPC64) &&
|
|
Packit |
bf408e |
(target_data.target != PPC64)) {
|
|
Packit |
bf408e |
if (target_data.target == X86_64)
|
|
Packit |
bf408e |
target_data.target = PPC64;
|
|
Packit |
bf408e |
else
|
|
Packit |
bf408e |
arch_mismatch(sp);
|
|
Packit |
bf408e |
}
|
|
Packit |
bf408e |
if ((target_data.target == PPC64) &&
|
|
Packit |
bf408e |
(target_data.initial_gdb_target != PPC64))
|
|
Packit |
bf408e |
arch_mismatch(sp);
|
|
Packit |
bf408e |
|
|
Packit |
bf408e |
if ((target_data.initial_gdb_target == PPC) &&
|
|
Packit |
bf408e |
(target_data.target != PPC)) {
|
|
Packit |
bf408e |
if (target_data.target == PPC64)
|
|
Packit |
bf408e |
target_data.target = PPC;
|
|
Packit |
bf408e |
else
|
|
Packit |
bf408e |
arch_mismatch(sp);
|
|
Packit |
bf408e |
}
|
|
Packit |
bf408e |
if ((target_data.target == PPC) &&
|
|
Packit |
bf408e |
(target_data.initial_gdb_target != PPC))
|
|
Packit |
bf408e |
arch_mismatch(sp);
|
|
Packit |
bf408e |
|
|
Packit |
bf408e |
if ((target_data.target == SPARC64) &&
|
|
Packit |
bf408e |
(target_data.initial_gdb_target != SPARC64))
|
|
Packit |
bf408e |
arch_mismatch(sp);
|
|
Packit |
bf408e |
}
|
|
Packit |
bf408e |
|
|
Packit |
bf408e |
if ((fp = fopen("Makefile", "r")) == NULL) {
|
|
Packit |
bf408e |
perror("Makefile");
|
|
Packit |
bf408e |
goto get_release;
|
|
Packit |
bf408e |
}
|
|
Packit |
bf408e |
|
|
Packit |
bf408e |
while (fgets(buf, 512, fp)) {
|
|
Packit |
bf408e |
if (strncmp(buf, "PROGRAM=", strlen("PROGRAM=")) == 0) {
|
|
Packit |
bf408e |
p = strstr(buf, "=") + 1;
|
|
Packit |
bf408e |
strip_linefeeds(p);
|
|
Packit |
bf408e |
upper_case(p, target_data.program);
|
|
Packit |
bf408e |
if (target_data.flags & DAEMON)
|
|
Packit |
bf408e |
strcat(target_data.program, "D");
|
|
Packit |
bf408e |
continue;
|
|
Packit |
bf408e |
}
|
|
Packit |
bf408e |
}
|
|
Packit |
bf408e |
|
|
Packit |
bf408e |
fclose(fp);
|
|
Packit |
bf408e |
|
|
Packit |
bf408e |
get_release:
|
|
Packit |
bf408e |
|
|
Packit |
bf408e |
target_data.release[0] = '\0';
|
|
Packit |
bf408e |
|
|
Packit |
bf408e |
if (file_exists(".rh_rpm_package")) {
|
|
Packit |
bf408e |
if ((fp = fopen(".rh_rpm_package", "r")) == NULL) {
|
|
Packit |
bf408e |
perror(".rh_rpm_package");
|
|
Packit |
bf408e |
} else {
|
|
Packit |
bf408e |
if (fgets(buf, 512, fp)) {
|
|
Packit |
bf408e |
strip_linefeeds(buf);
|
|
Packit |
bf408e |
if (strlen(buf)) {
|
|
Packit |
bf408e |
buf[MAXSTRLEN-1] = '\0';
|
|
Packit |
bf408e |
strcpy(target_data.release, buf);
|
|
Packit |
bf408e |
} else
|
|
Packit |
bf408e |
fprintf(stderr,
|
|
Packit |
bf408e |
"WARNING: .rh_rpm_package file is empty!\n");
|
|
Packit |
bf408e |
} else
|
|
Packit |
bf408e |
fprintf(stderr,
|
|
Packit |
bf408e |
"WARNING: .rh_rpm_package file is empty!\n");
|
|
Packit |
bf408e |
fclose(fp);
|
|
Packit |
bf408e |
|
|
Packit |
bf408e |
if (strlen(target_data.release))
|
|
Packit |
bf408e |
return;
|
|
Packit |
bf408e |
}
|
|
Packit |
bf408e |
} else
|
|
Packit |
bf408e |
fprintf(stderr,
|
|
Packit |
bf408e |
"WARNING: .rh_rpm_package file does not exist!\n");
|
|
Packit |
bf408e |
|
|
Packit |
bf408e |
if ((fp = fopen("defs.h", "r")) == NULL) {
|
|
Packit |
bf408e |
perror("defs.h");
|
|
Packit |
bf408e |
return;
|
|
Packit |
bf408e |
}
|
|
Packit |
bf408e |
|
|
Packit |
bf408e |
while (fgets(buf, 512, fp)) {
|
|
Packit |
bf408e |
if (strncmp(buf, "#define BASELEVEL_REVISION",
|
|
Packit |
bf408e |
strlen("#define BASELEVEL_REVISION")) == 0) {
|
|
Packit |
bf408e |
p = strstr(buf, "\"") + 1;
|
|
Packit |
bf408e |
strip_linefeeds(p);
|
|
Packit |
bf408e |
p[strlen(p)-1] = '\0';
|
|
Packit |
bf408e |
strcpy(target_data.release, p);
|
|
Packit |
bf408e |
break;
|
|
Packit |
bf408e |
}
|
|
Packit |
bf408e |
}
|
|
Packit |
bf408e |
|
|
Packit |
bf408e |
fclose(fp);
|
|
Packit |
bf408e |
}
|
|
Packit |
bf408e |
|
|
Packit |
bf408e |
void
|
|
Packit |
bf408e |
show_configuration(void)
|
|
Packit |
bf408e |
{
|
|
Packit |
bf408e |
int i;
|
|
Packit |
bf408e |
|
|
Packit |
bf408e |
if (target_data.flags & QUIET)
|
|
Packit |
bf408e |
return;
|
|
Packit |
bf408e |
|
|
Packit |
bf408e |
switch (target_data.target)
|
|
Packit |
bf408e |
{
|
|
Packit |
bf408e |
case X86:
|
|
Packit |
bf408e |
printf("TARGET: X86\n");
|
|
Packit |
bf408e |
break;
|
|
Packit |
bf408e |
case ALPHA:
|
|
Packit |
bf408e |
printf("TARGET: ALPHA\n");
|
|
Packit |
bf408e |
break;
|
|
Packit |
bf408e |
case PPC:
|
|
Packit |
bf408e |
printf("TARGET: PPC\n");
|
|
Packit |
bf408e |
break;
|
|
Packit |
bf408e |
case IA64:
|
|
Packit |
bf408e |
printf("TARGET: IA64\n");
|
|
Packit |
bf408e |
break;
|
|
Packit |
bf408e |
case S390:
|
|
Packit |
bf408e |
printf("TARGET: S390\n");
|
|
Packit |
bf408e |
break;
|
|
Packit |
bf408e |
case S390X:
|
|
Packit |
bf408e |
printf("TARGET: S390X\n");
|
|
Packit |
bf408e |
break;
|
|
Packit |
bf408e |
case PPC64:
|
|
Packit |
bf408e |
printf("TARGET: PPC64\n");
|
|
Packit |
bf408e |
break;
|
|
Packit |
bf408e |
case X86_64:
|
|
Packit |
bf408e |
printf("TARGET: X86_64\n");
|
|
Packit |
bf408e |
break;
|
|
Packit |
bf408e |
case ARM:
|
|
Packit |
bf408e |
printf("TARGET: ARM\n");
|
|
Packit |
bf408e |
break;
|
|
Packit |
bf408e |
case ARM64:
|
|
Packit |
bf408e |
printf("TARGET: ARM64\n");
|
|
Packit |
bf408e |
break;
|
|
Packit |
bf408e |
case MIPS:
|
|
Packit |
bf408e |
printf("TARGET: MIPS\n");
|
|
Packit |
bf408e |
break;
|
|
Packit |
bf408e |
case SPARC64:
|
|
Packit |
bf408e |
printf("TARGET: SPARC64\n");
|
|
Packit |
bf408e |
break;
|
|
Packit |
bf408e |
}
|
|
Packit |
bf408e |
|
|
Packit |
bf408e |
if (strlen(target_data.program)) {
|
|
Packit |
bf408e |
for (i = 0; i < (strlen("TARGET")-strlen(target_data.program));
|
|
Packit |
bf408e |
i++)
|
|
Packit |
bf408e |
printf(" ");
|
|
Packit |
bf408e |
printf("%s: ", target_data.program);
|
|
Packit |
bf408e |
if (strlen(target_data.release))
|
|
Packit |
bf408e |
printf("%s\n", target_data.release);
|
|
Packit |
bf408e |
else
|
|
Packit |
bf408e |
printf("???\n");
|
|
Packit |
bf408e |
}
|
|
Packit |
bf408e |
|
|
Packit |
bf408e |
if (strlen(target_data.gdb_version))
|
|
Packit |
bf408e |
printf(" GDB: %s\n\n", &target_data.gdb_version[4]);
|
|
Packit |
bf408e |
}
|
|
Packit |
bf408e |
|
|
Packit |
bf408e |
void
|
|
Packit |
bf408e |
build_configure(struct supported_gdb_version *sp)
|
|
Packit |
bf408e |
{
|
|
Packit |
bf408e |
FILE *fp1, *fp2;
|
|
Packit |
bf408e |
char buf[512];
|
|
Packit |
bf408e |
char *target;
|
|
Packit |
bf408e |
char *target_CFLAGS;
|
|
Packit |
bf408e |
char *gdb_conf_flags;
|
|
Packit |
bf408e |
char *ldflags;
|
|
Packit |
bf408e |
char *cflags;
|
|
Packit |
bf408e |
|
|
Packit |
bf408e |
get_current_configuration(sp);
|
|
Packit |
bf408e |
|
|
Packit |
bf408e |
target = target_CFLAGS = NULL;
|
|
Packit |
bf408e |
|
|
Packit |
bf408e |
gdb_conf_flags = GDB_TARGET_DEFAULT;
|
|
Packit |
bf408e |
switch (target_data.target)
|
|
Packit |
bf408e |
{
|
|
Packit |
bf408e |
case X86:
|
|
Packit |
bf408e |
target = TARGET_X86;
|
|
Packit |
bf408e |
if (target_data.host == X86_64) {
|
|
Packit |
bf408e |
target_CFLAGS = TARGET_CFLAGS_X86_ON_X86_64;
|
|
Packit |
bf408e |
gdb_conf_flags = GDB_TARGET_X86_ON_X86_64;
|
|
Packit |
bf408e |
} else
|
|
Packit |
bf408e |
target_CFLAGS = TARGET_CFLAGS_X86;
|
|
Packit |
bf408e |
break;
|
|
Packit |
bf408e |
case ALPHA:
|
|
Packit |
bf408e |
target = TARGET_ALPHA;
|
|
Packit |
bf408e |
target_CFLAGS = TARGET_CFLAGS_ALPHA;
|
|
Packit |
bf408e |
break;
|
|
Packit |
bf408e |
case PPC:
|
|
Packit |
bf408e |
target = TARGET_PPC;
|
|
Packit |
bf408e |
if (target_data.host == PPC64) {
|
|
Packit |
bf408e |
target_CFLAGS = TARGET_CFLAGS_PPC_ON_PPC64;
|
|
Packit |
bf408e |
gdb_conf_flags = GDB_TARGET_PPC_ON_PPC64;
|
|
Packit |
bf408e |
} else
|
|
Packit |
bf408e |
target_CFLAGS = TARGET_CFLAGS_PPC;
|
|
Packit |
bf408e |
break;
|
|
Packit |
bf408e |
case IA64:
|
|
Packit |
bf408e |
target = TARGET_IA64;
|
|
Packit |
bf408e |
target_CFLAGS = TARGET_CFLAGS_IA64;
|
|
Packit |
bf408e |
break;
|
|
Packit |
bf408e |
case S390:
|
|
Packit |
bf408e |
target = TARGET_S390;
|
|
Packit |
bf408e |
target_CFLAGS = TARGET_CFLAGS_S390;
|
|
Packit |
bf408e |
break;
|
|
Packit |
bf408e |
case S390X:
|
|
Packit |
bf408e |
target = TARGET_S390X;
|
|
Packit |
bf408e |
target_CFLAGS = TARGET_CFLAGS_S390X;
|
|
Packit |
bf408e |
break;
|
|
Packit |
bf408e |
case PPC64:
|
|
Packit |
bf408e |
target = TARGET_PPC64;
|
|
Packit |
bf408e |
if (target_data.host == X86_64) {
|
|
Packit |
bf408e |
target_CFLAGS = TARGET_CFLAGS_PPC64_ON_X86_64;
|
|
Packit |
bf408e |
gdb_conf_flags = GDB_TARGET_PPC64_ON_X86_64;
|
|
Packit |
bf408e |
} else
|
|
Packit |
bf408e |
target_CFLAGS = TARGET_CFLAGS_PPC64;
|
|
Packit |
bf408e |
break;
|
|
Packit |
bf408e |
case X86_64:
|
|
Packit |
bf408e |
target = TARGET_X86_64;
|
|
Packit |
bf408e |
target_CFLAGS = TARGET_CFLAGS_X86_64;
|
|
Packit |
bf408e |
break;
|
|
Packit |
bf408e |
case ARM:
|
|
Packit |
bf408e |
target = TARGET_ARM;
|
|
Packit |
bf408e |
if (target_data.host == X86) {
|
|
Packit |
bf408e |
target_CFLAGS = TARGET_CFLAGS_ARM_ON_X86;
|
|
Packit |
bf408e |
gdb_conf_flags = GDB_TARGET_ARM_ON_X86;
|
|
Packit |
bf408e |
} else if (target_data.host == X86_64) {
|
|
Packit |
bf408e |
target_CFLAGS = TARGET_CFLAGS_ARM_ON_X86_64;
|
|
Packit |
bf408e |
gdb_conf_flags = GDB_TARGET_ARM_ON_X86_64;
|
|
Packit |
bf408e |
} else
|
|
Packit |
bf408e |
target_CFLAGS = TARGET_CFLAGS_ARM;
|
|
Packit |
bf408e |
break;
|
|
Packit |
bf408e |
case ARM64:
|
|
Packit |
bf408e |
target = TARGET_ARM64;
|
|
Packit |
bf408e |
if (target_data.host == X86_64) {
|
|
Packit |
bf408e |
target_CFLAGS = TARGET_CFLAGS_ARM64_ON_X86_64;
|
|
Packit |
bf408e |
gdb_conf_flags = GDB_TARGET_ARM64_ON_X86_64;
|
|
Packit |
bf408e |
} else
|
|
Packit |
bf408e |
target_CFLAGS = TARGET_CFLAGS_ARM64;
|
|
Packit |
bf408e |
break;
|
|
Packit |
bf408e |
case MIPS:
|
|
Packit |
bf408e |
target = TARGET_MIPS;
|
|
Packit |
bf408e |
if (target_data.host == X86) {
|
|
Packit |
bf408e |
target_CFLAGS = TARGET_CFLAGS_MIPS_ON_X86;
|
|
Packit |
bf408e |
gdb_conf_flags = GDB_TARGET_MIPS_ON_X86;
|
|
Packit |
bf408e |
} else if (target_data.host == X86_64) {
|
|
Packit |
bf408e |
target_CFLAGS = TARGET_CFLAGS_MIPS_ON_X86_64;
|
|
Packit |
bf408e |
gdb_conf_flags = GDB_TARGET_MIPS_ON_X86_64;
|
|
Packit |
bf408e |
} else
|
|
Packit |
bf408e |
target_CFLAGS = TARGET_CFLAGS_MIPS;
|
|
Packit |
bf408e |
break;
|
|
Packit |
bf408e |
case SPARC64:
|
|
Packit |
bf408e |
target = TARGET_SPARC64;
|
|
Packit |
bf408e |
target_CFLAGS = TARGET_CFLAGS_SPARC64;
|
|
Packit |
bf408e |
break;
|
|
Packit |
bf408e |
}
|
|
Packit |
bf408e |
|
|
Packit |
bf408e |
ldflags = get_extra_flags("LDFLAGS.extra", NULL);
|
|
Packit |
bf408e |
cflags = get_extra_flags("CFLAGS.extra", NULL);
|
|
Packit |
bf408e |
gdb_conf_flags = get_extra_flags("GDBFLAGS.extra", gdb_conf_flags);
|
|
Packit |
bf408e |
|
|
Packit |
bf408e |
makefile_setup(&fp1, &fp2;;
|
|
Packit |
bf408e |
|
|
Packit |
bf408e |
while (fgets(buf, 512, fp1)) {
|
|
Packit |
bf408e |
if (strncmp(buf, "TARGET=", strlen("TARGET=")) == 0)
|
|
Packit |
bf408e |
fprintf(fp2, "%s\n", target);
|
|
Packit |
bf408e |
else if (strncmp(buf, "TARGET_CFLAGS=",
|
|
Packit |
bf408e |
strlen("TARGET_CFLAGS=")) == 0)
|
|
Packit |
bf408e |
fprintf(fp2, "%s%s%s\n", target_CFLAGS,
|
|
Packit |
bf408e |
cflags ? " " : "", cflags ? cflags : "");
|
|
Packit |
bf408e |
else if (strncmp(buf, "GDB_CONF_FLAGS=",
|
|
Packit |
bf408e |
strlen("GDB_CONF_FLAGS=")) == 0)
|
|
Packit |
bf408e |
fprintf(fp2, "%s\n", gdb_conf_flags);
|
|
Packit |
bf408e |
else if (strncmp(buf, "GDB_FILES=",strlen("GDB_FILES=")) == 0)
|
|
Packit |
bf408e |
fprintf(fp2, "%s\n", sp->GDB_FILES);
|
|
Packit |
bf408e |
else if (strncmp(buf, "GDB_OFILES=",strlen("GDB_OFILES=")) == 0)
|
|
Packit |
bf408e |
fprintf(fp2, "%s\n", sp->GDB_OFILES);
|
|
Packit |
bf408e |
else if (strncmp(buf, "GDB_PATCH_FILES=",strlen("GDB_PATCH_FILES=")) == 0)
|
|
Packit |
bf408e |
fprintf(fp2, "%s\n", sp->GDB_PATCH_FILES);
|
|
Packit |
bf408e |
else if (strncmp(buf, "GDB_FLAGS=",strlen("GDB_FLAGS=")) == 0)
|
|
Packit |
bf408e |
fprintf(fp2, "%s\n", sp->GDB_FLAGS);
|
|
Packit |
bf408e |
else if (strncmp(buf, "GPL_FILES=", strlen("GPL_FILES=")) == 0)
|
|
Packit |
bf408e |
fprintf(fp2, "GPL_FILES=%s\n", strcmp(sp->GPL, "GPLv2") == 0 ?
|
|
Packit |
bf408e |
"COPYING" : "COPYING3");
|
|
Packit |
bf408e |
else if (strncmp(buf, "GDB=", strlen("GDB=")) == 0) {
|
|
Packit |
bf408e |
fprintf(fp2, "%s\n", sp->GDB);
|
|
Packit |
bf408e |
sprintf(target_data.gdb_version, "%s", &sp->GDB[4]);
|
|
Packit |
bf408e |
} else if (strncmp(buf, "LDFLAGS=", strlen("LDFLAGS=")) == 0) {
|
|
Packit Service |
b3827b |
fprintf(fp2, "LDFLAGS=%s\n", ldflags ? ldflags : "");
|
|
Packit |
bf408e |
} else
|
|
Packit |
bf408e |
fprintf(fp2, "%s", buf);
|
|
Packit |
bf408e |
|
|
Packit |
bf408e |
}
|
|
Packit |
bf408e |
|
|
Packit |
bf408e |
makefile_create(&fp1, &fp2;;
|
|
Packit |
bf408e |
show_configuration();
|
|
Packit |
bf408e |
make_build_data(&target[strlen("TARGET=")]);
|
|
Packit |
bf408e |
}
|
|
Packit |
bf408e |
|
|
Packit |
bf408e |
void
|
|
Packit |
bf408e |
release_configure(char *gdb_version, struct supported_gdb_version *sp)
|
|
Packit |
bf408e |
{
|
|
Packit |
bf408e |
FILE *fp1, *fp2;
|
|
Packit |
bf408e |
int found;
|
|
Packit |
bf408e |
char buf[512];
|
|
Packit |
bf408e |
char gdb_files[MAXSTRLEN];
|
|
Packit |
bf408e |
|
|
Packit |
bf408e |
get_current_configuration(sp);
|
|
Packit |
bf408e |
|
|
Packit |
bf408e |
sprintf(buf, "%s/gdb", gdb_version);
|
|
Packit |
bf408e |
if (!file_exists(buf)) {
|
|
Packit |
bf408e |
fprintf(stderr, "make release: no such directory: %s\n", buf);
|
|
Packit |
bf408e |
exit(1);
|
|
Packit |
bf408e |
}
|
|
Packit |
bf408e |
sprintf(gdb_files, "GDB_%s_FILES",
|
|
Packit |
bf408e |
&gdb_version[strlen("gdb-")]);
|
|
Packit |
bf408e |
|
|
Packit |
bf408e |
makefile_setup(&fp1, &fp2;;
|
|
Packit |
bf408e |
|
|
Packit |
bf408e |
found = 0;
|
|
Packit |
bf408e |
while (fgets(buf, 512, fp1)) {
|
|
Packit |
bf408e |
if (strncmp(buf, gdb_files, strlen(gdb_files)) == 0)
|
|
Packit |
bf408e |
found++;
|
|
Packit |
bf408e |
if (strncmp(buf, "GDB_FILES=", strlen("GDB_FILES=")) == 0)
|
|
Packit |
bf408e |
fprintf(fp2, "GDB_FILES=${%s}\n", gdb_files);
|
|
Packit |
bf408e |
else if (strncmp(buf, "VERSION=", strlen("VERSION=")) == 0)
|
|
Packit |
bf408e |
fprintf(fp2, "VERSION=%s\n",
|
|
Packit |
bf408e |
target_data.release);
|
|
Packit |
bf408e |
else if (strncmp(buf, "GDB_PATCH_FILES=", strlen("GDB_PATCH_FILES=")) == 0)
|
|
Packit |
bf408e |
fprintf(fp2, "%s\n", sp->GDB_PATCH_FILES);
|
|
Packit |
bf408e |
else if (strncmp(buf, "GPL_FILES=", strlen("GPL_FILES=")) == 0)
|
|
Packit |
bf408e |
fprintf(fp2, "GPL_FILES=%s\n", strcmp(sp->GPL, "GPLv2") == 0 ?
|
|
Packit |
bf408e |
"COPYING" : "COPYING3");
|
|
Packit |
bf408e |
else
|
|
Packit |
bf408e |
fprintf(fp2, "%s", buf);
|
|
Packit |
bf408e |
|
|
Packit |
bf408e |
}
|
|
Packit |
bf408e |
|
|
Packit |
bf408e |
if (!found) {
|
|
Packit |
bf408e |
fprintf(stderr, "make release: cannot find %s\n", gdb_files);
|
|
Packit |
bf408e |
exit(1);
|
|
Packit |
bf408e |
}
|
|
Packit |
bf408e |
|
|
Packit |
bf408e |
makefile_create(&fp1, &fp2;;
|
|
Packit |
bf408e |
}
|
|
Packit |
bf408e |
|
|
Packit |
bf408e |
/*
|
|
Packit |
bf408e |
* Create an .rh_rpm_package file if the passed-in variable is set.
|
|
Packit |
bf408e |
*/
|
|
Packit |
bf408e |
void
|
|
Packit |
bf408e |
make_rh_rpm_package(char *package, int release)
|
|
Packit |
bf408e |
{
|
|
Packit |
bf408e |
char *p, *cur;
|
|
Packit |
bf408e |
FILE *fp;
|
|
Packit |
bf408e |
char buf[256];
|
|
Packit |
bf408e |
|
|
Packit |
bf408e |
if ((strcmp(package, "remove") == 0)) {
|
|
Packit |
bf408e |
if (file_exists(".rh_rpm_package")) {
|
|
Packit |
bf408e |
if (unlink(".rh_rpm_package")) {
|
|
Packit |
bf408e |
perror("unlink");
|
|
Packit |
bf408e |
fprintf(stderr,
|
|
Packit |
bf408e |
"cannot remove .rh_rpm_package\n");
|
|
Packit |
bf408e |
exit(1);
|
|
Packit |
bf408e |
}
|
|
Packit |
bf408e |
}
|
|
Packit |
bf408e |
return;
|
|
Packit |
bf408e |
}
|
|
Packit |
bf408e |
|
|
Packit |
bf408e |
if (!(p = strstr(package, "=")))
|
|
Packit |
bf408e |
return;
|
|
Packit |
bf408e |
|
|
Packit |
bf408e |
if (!strlen(++p))
|
|
Packit |
bf408e |
return;
|
|
Packit |
bf408e |
|
|
Packit |
bf408e |
if (release) {
|
|
Packit |
bf408e |
if (!(fp = popen("./crash -v", "r"))) {
|
|
Packit |
bf408e |
fprintf(stderr, "cannot execute \"crash -v\"\n");
|
|
Packit |
bf408e |
exit(1);
|
|
Packit |
bf408e |
}
|
|
Packit |
bf408e |
cur = NULL;
|
|
Packit |
bf408e |
while (fgets(buf, 256, fp)) {
|
|
Packit |
bf408e |
if (strncmp(buf, "crash ", 6) == 0) {
|
|
Packit |
bf408e |
cur = &buf[6];
|
|
Packit |
bf408e |
break;
|
|
Packit |
bf408e |
}
|
|
Packit |
bf408e |
}
|
|
Packit |
bf408e |
pclose(fp);
|
|
Packit |
bf408e |
|
|
Packit |
bf408e |
if (!cur) {
|
|
Packit |
bf408e |
fprintf(stderr, "cannot get version from \"crash -v\"\n");
|
|
Packit |
bf408e |
exit(1);
|
|
Packit |
bf408e |
}
|
|
Packit |
bf408e |
strip_linefeeds(cur);
|
|
Packit |
bf408e |
|
|
Packit |
bf408e |
if (strcmp(cur, p) != 0) {
|
|
Packit |
bf408e |
fprintf(stderr, "./crash version: %s\n", cur);
|
|
Packit |
bf408e |
fprintf(stderr, "release version: %s\n", p);
|
|
Packit |
bf408e |
exit(1);
|
|
Packit |
bf408e |
}
|
|
Packit |
bf408e |
}
|
|
Packit |
bf408e |
|
|
Packit |
bf408e |
if ((fp = fopen(".rh_rpm_package", "w")) == NULL) {
|
|
Packit |
bf408e |
perror("fopen");
|
|
Packit |
bf408e |
fprintf(stderr, "cannot open .rh_rpm_package\n");
|
|
Packit |
bf408e |
exit(1);
|
|
Packit |
bf408e |
}
|
|
Packit |
bf408e |
|
|
Packit |
bf408e |
fprintf(fp, "%s\n", strip_linefeeds(p));
|
|
Packit |
bf408e |
|
|
Packit |
bf408e |
fclose(fp);
|
|
Packit |
bf408e |
}
|
|
Packit |
bf408e |
|
|
Packit |
bf408e |
void
|
|
Packit |
bf408e |
gdb_configure(struct supported_gdb_version *sp)
|
|
Packit |
bf408e |
{
|
|
Packit |
bf408e |
FILE *fp1, *fp2;
|
|
Packit |
bf408e |
char buf[512];
|
|
Packit |
bf408e |
|
|
Packit |
bf408e |
get_current_configuration(sp);
|
|
Packit |
bf408e |
|
|
Packit |
bf408e |
makefile_setup(&fp1, &fp2;;
|
|
Packit |
bf408e |
|
|
Packit |
bf408e |
while (fgets(buf, 512, fp1)) {
|
|
Packit |
bf408e |
if (strncmp(buf, "GDB=", strlen("GDB=")) == 0)
|
|
Packit |
bf408e |
fprintf(fp2, "%s\n", sp->GDB);
|
|
Packit |
bf408e |
else
|
|
Packit |
bf408e |
fprintf(fp2, "%s", buf);
|
|
Packit |
bf408e |
|
|
Packit |
bf408e |
}
|
|
Packit |
bf408e |
|
|
Packit |
bf408e |
makefile_create(&fp1, &fp2;;
|
|
Packit |
bf408e |
}
|
|
Packit |
bf408e |
|
|
Packit |
bf408e |
void
|
|
Packit |
bf408e |
unconfigure(void)
|
|
Packit |
bf408e |
{
|
|
Packit |
bf408e |
FILE *fp1, *fp2;
|
|
Packit |
bf408e |
char buf[512];
|
|
Packit |
bf408e |
|
|
Packit |
bf408e |
makefile_setup(&fp1, &fp2;;
|
|
Packit |
bf408e |
|
|
Packit |
bf408e |
while (fgets(buf, 512, fp1)) {
|
|
Packit |
bf408e |
if (strncmp(buf, "TARGET=", strlen("TARGET=")) == 0)
|
|
Packit |
bf408e |
fprintf(fp2, "TARGET=\n");
|
|
Packit |
bf408e |
else if (strncmp(buf, "TARGET_CFLAGS=",
|
|
Packit |
bf408e |
strlen("TARGET_CFLAGS=")) == 0)
|
|
Packit |
bf408e |
fprintf(fp2, "TARGET_CFLAGS=\n");
|
|
Packit |
bf408e |
else if (strncmp(buf, "GDB_CONF_FLAGS=",
|
|
Packit |
bf408e |
strlen("GDB_CONF_FLAGS=")) == 0)
|
|
Packit |
bf408e |
fprintf(fp2, "GDB_CONF_FLAGS=\n");
|
|
Packit |
bf408e |
else if (strncmp(buf, "GDB_FILES=",strlen("GDB_FILES=")) == 0)
|
|
Packit |
bf408e |
fprintf(fp2, "GDB_FILES=\n");
|
|
Packit |
bf408e |
else if (strncmp(buf, "GDB_OFILES=",strlen("GDB_OFILES=")) == 0)
|
|
Packit |
bf408e |
fprintf(fp2, "GDB_OFILES=\n");
|
|
Packit |
bf408e |
else if (strncmp(buf, "GDB_PATCH_FILES=",strlen("GDB_PATCH_FILES=")) == 0)
|
|
Packit |
bf408e |
fprintf(fp2, "GDB_PATCH_FILES=\n");
|
|
Packit |
bf408e |
else if (strncmp(buf, "GDB_FLAGS=",strlen("GDB_FLAGS=")) == 0)
|
|
Packit |
bf408e |
fprintf(fp2, "GDB_FLAGS=\n");
|
|
Packit |
bf408e |
else if (strncmp(buf, "GDB=", strlen("GDB=")) == 0)
|
|
Packit |
bf408e |
fprintf(fp2, "GDB=\n");
|
|
Packit |
bf408e |
else if (strncmp(buf, "VERSION=", strlen("VERSION=")) == 0)
|
|
Packit |
bf408e |
fprintf(fp2, "VERSION=\n");
|
|
Packit |
bf408e |
else if (strncmp(buf, "GPL_FILES=", strlen("GPL_FILES=")) == 0)
|
|
Packit |
bf408e |
fprintf(fp2, "GPL_FILES=\n");
|
|
Packit |
bf408e |
else if (strncmp(buf, "LDFLAGS=", strlen("LDFLAGS=")) == 0)
|
|
Packit |
bf408e |
fprintf(fp2, "LDFLAGS=\n");
|
|
Packit |
bf408e |
else if (strncmp(buf, "WARNING_ERROR=",
|
|
Packit |
bf408e |
strlen("WARNING_ERROR=")) == 0) {
|
|
Packit |
bf408e |
shift_string_right(buf, 1);
|
|
Packit |
bf408e |
buf[0] = '#';
|
|
Packit |
bf408e |
fprintf(fp2, "%s", buf);
|
|
Packit |
bf408e |
} else if (strncmp(buf, "WARNING_OPTIONS=",
|
|
Packit |
bf408e |
strlen("WARNING_OPTIONS=")) == 0) {
|
|
Packit |
bf408e |
shift_string_right(buf, 1);
|
|
Packit |
bf408e |
buf[0] = '#';
|
|
Packit |
bf408e |
fprintf(fp2, "%s", buf);
|
|
Packit |
bf408e |
} else
|
|
Packit |
bf408e |
fprintf(fp2, "%s", buf);
|
|
Packit |
bf408e |
}
|
|
Packit |
bf408e |
|
|
Packit |
bf408e |
makefile_create(&fp1, &fp2;;
|
|
Packit |
bf408e |
}
|
|
Packit |
bf408e |
|
|
Packit |
bf408e |
void
|
|
Packit |
bf408e |
set_warnings(int w)
|
|
Packit |
bf408e |
{
|
|
Packit |
bf408e |
FILE *fp1, *fp2;
|
|
Packit |
bf408e |
char buf[512];
|
|
Packit |
bf408e |
|
|
Packit |
bf408e |
makefile_setup(&fp1, &fp2;;
|
|
Packit |
bf408e |
|
|
Packit |
bf408e |
while (fgets(buf, 512, fp1)) {
|
|
Packit |
bf408e |
if (strncmp(buf, "#WARNING_ERROR=",
|
|
Packit |
bf408e |
strlen("#WARNING_ERROR=")) == 0) {
|
|
Packit |
bf408e |
switch (w)
|
|
Packit |
bf408e |
{
|
|
Packit |
bf408e |
case 'W':
|
|
Packit |
bf408e |
shift_string_left(buf, 1);
|
|
Packit |
bf408e |
break;
|
|
Packit |
bf408e |
case 'w':
|
|
Packit |
bf408e |
case 'n':
|
|
Packit |
bf408e |
break;
|
|
Packit |
bf408e |
}
|
|
Packit |
bf408e |
}
|
|
Packit |
bf408e |
|
|
Packit |
bf408e |
if (strncmp(buf, "WARNING_ERROR=",
|
|
Packit |
bf408e |
strlen("WARNING_ERROR=")) == 0) {
|
|
Packit |
bf408e |
switch (w)
|
|
Packit |
bf408e |
{
|
|
Packit |
bf408e |
case 'n':
|
|
Packit |
bf408e |
case 'w':
|
|
Packit |
bf408e |
shift_string_right(buf, 1);
|
|
Packit |
bf408e |
buf[0] = '#';
|
|
Packit |
bf408e |
break;
|
|
Packit |
bf408e |
case 'W':
|
|
Packit |
bf408e |
break;
|
|
Packit |
bf408e |
}
|
|
Packit |
bf408e |
}
|
|
Packit |
bf408e |
|
|
Packit |
bf408e |
if (strncmp(buf, "#WARNING_OPTIONS=",
|
|
Packit |
bf408e |
strlen("#WARNING_OPTIONS=")) == 0) {
|
|
Packit |
bf408e |
switch (w)
|
|
Packit |
bf408e |
{
|
|
Packit |
bf408e |
case 'W':
|
|
Packit |
bf408e |
case 'w':
|
|
Packit |
bf408e |
shift_string_left(buf, 1);
|
|
Packit |
bf408e |
break;
|
|
Packit |
bf408e |
case 'n':
|
|
Packit |
bf408e |
break;
|
|
Packit |
bf408e |
}
|
|
Packit |
bf408e |
}
|
|
Packit |
bf408e |
|
|
Packit |
bf408e |
if (strncmp(buf, "WARNING_OPTIONS=",
|
|
Packit |
bf408e |
strlen("WARNING_OPTIONS=")) == 0) {
|
|
Packit |
bf408e |
switch (w)
|
|
Packit |
bf408e |
{
|
|
Packit |
bf408e |
case 'w':
|
|
Packit |
bf408e |
case 'W':
|
|
Packit |
bf408e |
break;
|
|
Packit |
bf408e |
case 'n':
|
|
Packit |
bf408e |
shift_string_right(buf, 1);
|
|
Packit |
bf408e |
buf[0] = '#';
|
|
Packit |
bf408e |
break;
|
|
Packit |
bf408e |
}
|
|
Packit |
bf408e |
}
|
|
Packit |
bf408e |
|
|
Packit |
bf408e |
fprintf(fp2, "%s", buf);
|
|
Packit |
bf408e |
}
|
|
Packit |
bf408e |
|
|
Packit |
bf408e |
makefile_create(&fp1, &fp2;;
|
|
Packit |
bf408e |
}
|
|
Packit |
bf408e |
|
|
Packit |
bf408e |
void
|
|
Packit |
bf408e |
makefile_setup(FILE **fp1, FILE **fp2)
|
|
Packit |
bf408e |
{
|
|
Packit |
bf408e |
if (stat("Makefile", &target_data.statbuf) == -1) {
|
|
Packit |
bf408e |
perror("Makefile");
|
|
Packit |
bf408e |
exit(1);
|
|
Packit |
bf408e |
}
|
|
Packit |
bf408e |
|
|
Packit |
bf408e |
if ((*fp1 = fopen("Makefile", "r")) == NULL) {
|
|
Packit |
bf408e |
perror("fopen");
|
|
Packit |
bf408e |
fprintf(stderr, "cannot open existing Makefile\n");
|
|
Packit |
bf408e |
exit(1);
|
|
Packit |
bf408e |
}
|
|
Packit |
bf408e |
|
|
Packit |
bf408e |
unlink("Makefile.new");
|
|
Packit |
bf408e |
if ((*fp2 = fopen("Makefile.new", "w+")) == NULL) {
|
|
Packit |
bf408e |
perror("fopen");
|
|
Packit |
bf408e |
fprintf(stderr, "cannot create new Makefile\n");
|
|
Packit |
bf408e |
exit(1);
|
|
Packit |
bf408e |
}
|
|
Packit |
bf408e |
}
|
|
Packit |
bf408e |
|
|
Packit |
bf408e |
void
|
|
Packit |
bf408e |
makefile_create(FILE **fp1, FILE **fp2)
|
|
Packit |
bf408e |
{
|
|
Packit |
bf408e |
fclose(*fp1);
|
|
Packit |
bf408e |
fclose(*fp2);
|
|
Packit |
bf408e |
|
|
Packit |
bf408e |
if (system("mv Makefile.new Makefile") != 0) {
|
|
Packit |
bf408e |
fprintf(stderr, "Makefile: cannot create new Makefile\n");
|
|
Packit |
bf408e |
fprintf(stderr, "please copy Makefile.new to Makefile\n");
|
|
Packit |
bf408e |
exit(1);
|
|
Packit |
bf408e |
}
|
|
Packit |
bf408e |
|
|
Packit |
bf408e |
if (chown("Makefile", target_data.statbuf.st_uid,
|
|
Packit |
bf408e |
target_data.statbuf.st_gid) == -1) {
|
|
Packit |
bf408e |
fprintf(stderr,
|
|
Packit |
bf408e |
"Makefile: cannot restore original owner/group\n");
|
|
Packit |
bf408e |
}
|
|
Packit |
bf408e |
}
|
|
Packit |
bf408e |
|
|
Packit |
bf408e |
|
|
Packit |
bf408e |
|
|
Packit |
bf408e |
#define LASTCHAR(s) (s[strlen(s)-1])
|
|
Packit |
bf408e |
|
|
Packit |
bf408e |
char *
|
|
Packit |
bf408e |
strip_linefeeds(char *line)
|
|
Packit |
bf408e |
{
|
|
Packit |
bf408e |
char *p;
|
|
Packit |
bf408e |
|
|
Packit |
bf408e |
if (line == NULL || strlen(line) == 0)
|
|
Packit |
bf408e |
return(line);
|
|
Packit |
bf408e |
|
|
Packit |
bf408e |
p = &LASTCHAR(line);
|
|
Packit |
bf408e |
|
|
Packit |
bf408e |
while (*p == '\n')
|
|
Packit |
bf408e |
*p = '\0';
|
|
Packit |
bf408e |
|
|
Packit |
bf408e |
return(line);
|
|
Packit |
bf408e |
}
|
|
Packit |
bf408e |
|
|
Packit |
bf408e |
/*
|
|
Packit |
bf408e |
* Turn a string into upper-case.
|
|
Packit |
bf408e |
*/
|
|
Packit |
bf408e |
char *
|
|
Packit |
bf408e |
upper_case(char *s, char *buf)
|
|
Packit |
bf408e |
{
|
|
Packit |
bf408e |
char *p1, *p2;
|
|
Packit |
bf408e |
|
|
Packit |
bf408e |
p1 = s;
|
|
Packit |
bf408e |
p2 = buf;
|
|
Packit |
bf408e |
|
|
Packit |
bf408e |
while (*p1) {
|
|
Packit |
bf408e |
*p2 = toupper(*p1);
|
|
Packit |
bf408e |
p1++, p2++;
|
|
Packit |
bf408e |
}
|
|
Packit |
bf408e |
|
|
Packit |
bf408e |
*p2 = '\0';
|
|
Packit |
bf408e |
|
|
Packit |
bf408e |
return(buf);
|
|
Packit |
bf408e |
}
|
|
Packit |
bf408e |
|
|
Packit |
bf408e |
/*
|
|
Packit |
bf408e |
* Turn a string into lower-case.
|
|
Packit |
bf408e |
*/
|
|
Packit |
bf408e |
char *
|
|
Packit |
bf408e |
lower_case(char *s, char *buf)
|
|
Packit |
bf408e |
{
|
|
Packit |
bf408e |
char *p1, *p2;
|
|
Packit |
bf408e |
|
|
Packit |
bf408e |
p1 = s;
|
|
Packit |
bf408e |
p2 = buf;
|
|
Packit |
bf408e |
|
|
Packit |
bf408e |
while (*p1) {
|
|
Packit |
bf408e |
*p2 = tolower(*p1);
|
|
Packit |
bf408e |
p1++, p2++;
|
|
Packit |
bf408e |
}
|
|
Packit |
bf408e |
|
|
Packit |
bf408e |
*p2 = '\0';
|
|
Packit |
bf408e |
|
|
Packit |
bf408e |
return(buf);
|
|
Packit |
bf408e |
}
|
|
Packit |
bf408e |
|
|
Packit |
bf408e |
char *
|
|
Packit |
bf408e |
shift_string_left(char *s, int cnt)
|
|
Packit |
bf408e |
{
|
|
Packit |
bf408e |
int origlen;
|
|
Packit |
bf408e |
|
|
Packit |
bf408e |
if (!cnt)
|
|
Packit |
bf408e |
return(s);
|
|
Packit |
bf408e |
|
|
Packit |
bf408e |
origlen = strlen(s);
|
|
Packit |
bf408e |
memmove(s, s+cnt, (origlen-cnt));
|
|
Packit |
bf408e |
*(s+(origlen-cnt)) = '\0';
|
|
Packit |
bf408e |
return(s);
|
|
Packit |
bf408e |
}
|
|
Packit |
bf408e |
|
|
Packit |
bf408e |
char *
|
|
Packit |
bf408e |
shift_string_right(char *s, int cnt)
|
|
Packit |
bf408e |
{
|
|
Packit |
bf408e |
int i;
|
|
Packit |
bf408e |
int origlen;
|
|
Packit |
bf408e |
|
|
Packit |
bf408e |
if (!cnt)
|
|
Packit |
bf408e |
return(s);
|
|
Packit |
bf408e |
|
|
Packit |
bf408e |
origlen = strlen(s);
|
|
Packit |
bf408e |
memmove(s+cnt, s, origlen);
|
|
Packit |
bf408e |
*(s+(origlen+cnt)) = '\0';
|
|
Packit |
bf408e |
|
|
Packit |
bf408e |
for (i = 0; i < cnt; i++)
|
|
Packit |
bf408e |
s[i] = ' ';
|
|
Packit |
bf408e |
|
|
Packit |
bf408e |
return(s);
|
|
Packit |
bf408e |
}
|
|
Packit |
bf408e |
|
|
Packit |
bf408e |
char *
|
|
Packit |
bf408e |
strip_beginning_whitespace(char *line)
|
|
Packit |
bf408e |
{
|
|
Packit |
bf408e |
char buf[MAXSTRLEN];
|
|
Packit |
bf408e |
char *p;
|
|
Packit |
bf408e |
|
|
Packit |
bf408e |
if (line == NULL || strlen(line) == 0)
|
|
Packit |
bf408e |
return(line);
|
|
Packit |
bf408e |
|
|
Packit |
bf408e |
strcpy(buf, line);
|
|
Packit |
bf408e |
p = &buf[0];
|
|
Packit |
bf408e |
while (*p == ' ' || *p == '\t')
|
|
Packit |
bf408e |
p++;
|
|
Packit |
bf408e |
strcpy(line, p);
|
|
Packit |
bf408e |
|
|
Packit |
bf408e |
return(line);
|
|
Packit |
bf408e |
}
|
|
Packit |
bf408e |
|
|
Packit |
bf408e |
char *
|
|
Packit |
bf408e |
strip_ending_whitespace(char *line)
|
|
Packit |
bf408e |
{
|
|
Packit |
bf408e |
char *p;
|
|
Packit |
bf408e |
|
|
Packit |
bf408e |
if (line == NULL || strlen(line) == 0)
|
|
Packit |
bf408e |
return(line);
|
|
Packit |
bf408e |
|
|
Packit |
bf408e |
p = &line[strlen(line)-1];
|
|
Packit |
bf408e |
|
|
Packit |
bf408e |
while (*p == ' ' || *p == '\t') {
|
|
Packit |
bf408e |
*p = '\0';
|
|
Packit |
bf408e |
if (p == line)
|
|
Packit |
bf408e |
break;
|
|
Packit |
bf408e |
p--;
|
|
Packit |
bf408e |
}
|
|
Packit |
bf408e |
|
|
Packit |
bf408e |
return(line);
|
|
Packit |
bf408e |
}
|
|
Packit |
bf408e |
|
|
Packit |
bf408e |
int
|
|
Packit |
bf408e |
file_exists(char *file)
|
|
Packit |
bf408e |
{
|
|
Packit |
bf408e |
struct stat sbuf;
|
|
Packit |
bf408e |
|
|
Packit |
bf408e |
if (stat(file, &sbuf) == 0)
|
|
Packit |
bf408e |
return TRUE;
|
|
Packit |
bf408e |
|
|
Packit |
bf408e |
return FALSE;
|
|
Packit |
bf408e |
}
|
|
Packit |
bf408e |
|
|
Packit |
bf408e |
int
|
|
Packit |
bf408e |
count_chars(char *s, char c)
|
|
Packit |
bf408e |
{
|
|
Packit |
bf408e |
char *p;
|
|
Packit |
bf408e |
int count;
|
|
Packit |
bf408e |
|
|
Packit |
bf408e |
if (!s)
|
|
Packit |
bf408e |
return 0;
|
|
Packit |
bf408e |
|
|
Packit |
bf408e |
count = 0;
|
|
Packit |
bf408e |
|
|
Packit |
bf408e |
for (p = s; *p; p++) {
|
|
Packit |
bf408e |
if (*p == c)
|
|
Packit |
bf408e |
count++;
|
|
Packit |
bf408e |
}
|
|
Packit |
bf408e |
|
|
Packit |
bf408e |
return count;
|
|
Packit |
bf408e |
}
|
|
Packit |
bf408e |
|
|
Packit |
bf408e |
|
|
Packit |
bf408e |
void
|
|
Packit |
bf408e |
make_build_data(char *target)
|
|
Packit |
bf408e |
{
|
|
Packit |
bf408e |
char *p;
|
|
Packit |
bf408e |
char hostname[MAXSTRLEN];
|
|
Packit |
bf408e |
char progname[MAXSTRLEN];
|
|
Packit |
bf408e |
char inbuf1[MAXSTRLEN];
|
|
Packit |
bf408e |
char inbuf2[MAXSTRLEN];
|
|
Packit |
bf408e |
char inbuf3[MAXSTRLEN];
|
|
Packit |
bf408e |
FILE *fp1, *fp2, *fp3, *fp4;
|
|
Packit |
bf408e |
|
|
Packit |
bf408e |
unlink("build_data.c");
|
|
Packit |
bf408e |
|
|
Packit |
bf408e |
fp1 = popen("date", "r");
|
|
Packit |
bf408e |
fp2 = popen("id", "r");
|
|
Packit |
bf408e |
fp3 = popen("gcc --version", "r");
|
|
Packit |
bf408e |
|
|
Packit |
bf408e |
if ((fp4 = fopen("build_data.c", "w")) == NULL) {
|
|
Packit |
bf408e |
perror("build_data.c");
|
|
Packit |
bf408e |
exit(1);
|
|
Packit |
bf408e |
}
|
|
Packit |
bf408e |
|
|
Packit |
bf408e |
if (gethostname(hostname, MAXSTRLEN) != 0)
|
|
Packit |
bf408e |
hostname[0] = '\0';
|
|
Packit |
bf408e |
|
|
Packit |
bf408e |
p = fgets(inbuf1, 79, fp1);
|
|
Packit |
bf408e |
|
|
Packit |
bf408e |
p = fgets(inbuf2, 79, fp2);
|
|
Packit |
bf408e |
p = strstr(inbuf2, " ");
|
|
Packit |
bf408e |
*p = '\0';
|
|
Packit |
bf408e |
|
|
Packit |
bf408e |
p = fgets(inbuf3, 79, fp3);
|
|
Packit |
bf408e |
|
|
Packit |
bf408e |
lower_case(target_data.program, progname);
|
|
Packit |
bf408e |
|
|
Packit |
bf408e |
fprintf(fp4, "char *build_command = \"%s\";\n", progname);
|
|
Packit |
bf408e |
if (getenv("SOURCE_DATE_EPOCH"))
|
|
Packit |
bf408e |
fprintf(fp4, "char *build_data = \"reproducible build\";\n");
|
|
Packit |
bf408e |
else if (strlen(hostname))
|
|
Packit |
bf408e |
fprintf(fp4, "char *build_data = \"%s by %s on %s\";\n",
|
|
Packit |
bf408e |
strip_linefeeds(inbuf1), inbuf2, hostname);
|
|
Packit |
bf408e |
else
|
|
Packit |
bf408e |
fprintf(fp4, "char *build_data = \"%s by %s\";\n",
|
|
Packit |
bf408e |
strip_linefeeds(inbuf1), inbuf2);
|
|
Packit |
bf408e |
|
|
Packit |
bf408e |
bzero(inbuf1, MAXSTRLEN);
|
|
Packit |
bf408e |
sprintf(inbuf1, "%s", target_data.release);
|
|
Packit |
bf408e |
|
|
Packit |
bf408e |
fprintf(fp4, "char *build_target = \"%s\";\n", target);
|
|
Packit |
bf408e |
|
|
Packit |
bf408e |
fprintf(fp4, "char *build_version = \"%s\";\n", inbuf1);
|
|
Packit |
bf408e |
|
|
Packit |
bf408e |
fprintf(fp4, "char *compiler_version = \"%s\";\n",
|
|
Packit |
bf408e |
strip_linefeeds(inbuf3));
|
|
Packit |
bf408e |
|
|
Packit |
bf408e |
pclose(fp1);
|
|
Packit |
bf408e |
pclose(fp2);
|
|
Packit |
bf408e |
pclose(fp3);
|
|
Packit |
bf408e |
fclose(fp4);
|
|
Packit |
bf408e |
}
|
|
Packit |
bf408e |
|
|
Packit |
bf408e |
void
|
|
Packit |
bf408e |
make_spec_file(struct supported_gdb_version *sp)
|
|
Packit |
bf408e |
{
|
|
Packit |
bf408e |
char *Version, *Release;
|
|
Packit |
bf408e |
char buf[512];
|
|
Packit |
bf408e |
|
|
Packit |
bf408e |
get_current_configuration(sp);
|
|
Packit |
bf408e |
|
|
Packit |
bf408e |
Release = strstr(target_data.release, "-");
|
|
Packit |
bf408e |
if (!Release) {
|
|
Packit |
bf408e |
Version = target_data.release;
|
|
Packit |
bf408e |
Release = "0";
|
|
Packit |
bf408e |
} else {
|
|
Packit |
bf408e |
fprintf(stderr,
|
|
Packit |
bf408e |
"crash.spec: obsolete src.rpm build manner -- no dashes allowed: %s\n",
|
|
Packit |
bf408e |
target_data.release);
|
|
Packit |
bf408e |
return;
|
|
Packit |
bf408e |
}
|
|
Packit |
bf408e |
|
|
Packit |
bf408e |
printf("#\n");
|
|
Packit |
bf408e |
printf("# crash core analysis suite\n");
|
|
Packit |
bf408e |
printf("#\n");
|
|
Packit |
bf408e |
printf("Summary: crash utility for live systems; netdump, diskdump, kdump, LKCD or mcore dumpfiles\n");
|
|
Packit |
bf408e |
printf("Name: %s\n", lower_case(target_data.program, buf));
|
|
Packit |
bf408e |
printf("Version: %s\n", Version);
|
|
Packit |
bf408e |
printf("Release: %s\n", Release);
|
|
Packit |
bf408e |
printf("License: %s\n", sp->GPL);
|
|
Packit |
bf408e |
printf("Group: Development/Debuggers\n");
|
|
Packit |
bf408e |
printf("Source: %%{name}-%%{version}.tar.gz\n");
|
|
Packit Service |
b3827b |
printf("URL: http://people.redhat.com/anderson\n");
|
|
Packit |
bf408e |
printf("Distribution: Linux 2.2 or greater\n");
|
|
Packit |
bf408e |
printf("Vendor: Red Hat, Inc.\n");
|
|
Packit |
bf408e |
printf("Packager: Dave Anderson <anderson@redhat.com>\n");
|
|
Packit |
bf408e |
printf("ExclusiveOS: Linux\n");
|
|
Packit |
bf408e |
printf("ExclusiveArch: %%{ix86} alpha ia64 ppc ppc64 ppc64pseries ppc64iseries x86_64 s390 s390x arm aarch64 ppc64le mips mipsel sparc64\n");
|
|
Packit |
bf408e |
printf("Buildroot: %%{_tmppath}/%%{name}-root\n");
|
|
Packit |
bf408e |
printf("BuildRequires: ncurses-devel zlib-devel bison\n");
|
|
Packit |
bf408e |
printf("Requires: binutils\n");
|
|
Packit |
bf408e |
printf("# Patch0: crash-3.3-20.installfix.patch (patch example)\n");
|
|
Packit |
bf408e |
printf("\n");
|
|
Packit |
bf408e |
printf("%%description\n");
|
|
Packit |
bf408e |
printf("The core analysis suite is a self-contained tool that can be used to\n");
|
|
Packit |
bf408e |
printf("investigate either live systems, kernel core dumps created from the\n");
|
|
Packit |
bf408e |
printf("netdump, diskdump and kdump facilities from Red Hat Linux, the mcore kernel patch\n");
|
|
Packit |
bf408e |
printf("offered by Mission Critical Linux, or the LKCD kernel patch.\n");
|
|
Packit |
bf408e |
printf("\n");
|
|
Packit |
bf408e |
printf("%%package devel\n");
|
|
Packit |
bf408e |
printf("Requires: %%{name} = %%{version}, zlib-devel\n");
|
|
Packit |
bf408e |
printf("Summary: crash utility for live systems; netdump, diskdump, kdump, LKCD or mcore dumpfiles\n");
|
|
Packit |
bf408e |
printf("Group: Development/Debuggers\n");
|
|
Packit |
bf408e |
printf("\n");
|
|
Packit |
bf408e |
printf("%%description devel\n");
|
|
Packit |
bf408e |
printf("The core analysis suite is a self-contained tool that can be used to\n");
|
|
Packit |
bf408e |
printf("investigate either live systems, kernel core dumps created from the\n");
|
|
Packit |
bf408e |
printf("netdump, diskdump and kdump packages from Red Hat Linux, the mcore kernel patch\n");
|
|
Packit |
bf408e |
printf("offered by Mission Critical Linux, or the LKCD kernel patch.\n");
|
|
Packit |
bf408e |
printf("\n");
|
|
Packit |
bf408e |
printf("%%package extensions\n");
|
|
Packit |
bf408e |
printf("Summary: Additional commands for the crash dump analysis tool\n");
|
|
Packit |
bf408e |
printf("Group: Development/Debuggers\n");
|
|
Packit |
bf408e |
printf("\n");
|
|
Packit |
bf408e |
printf("%%description extensions\n");
|
|
Packit |
bf408e |
printf("The extensions package contains plugins that provide additional crash\n");
|
|
Packit |
bf408e |
printf("commands. The extensions can be loaded in crash via the \"extend\" command.\n");
|
|
Packit |
bf408e |
printf("\n");
|
|
Packit |
bf408e |
printf("The following extensions are provided:\n");
|
|
Packit |
bf408e |
printf("* eppic: Provides C-like language for writing dump analysis scripts\n");
|
|
Packit |
bf408e |
printf("* dminfo: Device-mapper target analyzer\n");
|
|
Packit |
bf408e |
printf("* snap: Takes a snapshot of live memory and creates a kdump dumpfile\n");
|
|
Packit |
bf408e |
printf("* trace: Displays kernel tracing data and traced events that occurred prior to a panic.\n");
|
|
Packit |
bf408e |
printf("\n");
|
|
Packit |
bf408e |
printf("%%prep\n");
|
|
Packit |
bf408e |
printf("%%setup -n %%{name}-%%{version}\n");
|
|
Packit |
bf408e |
printf("# %%patch0 -p1 -b .install (patch example)\n");
|
|
Packit |
bf408e |
printf("\n");
|
|
Packit |
bf408e |
printf("%%build\n");
|
|
Packit |
bf408e |
printf("make RPMPKG=\"%%{version}\"\n");
|
|
Packit |
bf408e |
printf("# make RPMPKG=\"%%{version}-%%{release}\"\n");
|
|
Packit |
bf408e |
printf("make extensions\n");
|
|
Packit |
bf408e |
/* printf("make crashd\n"); */
|
|
Packit |
bf408e |
printf("\n");
|
|
Packit |
bf408e |
printf("%%install\n");
|
|
Packit |
bf408e |
printf("rm -rf %%{buildroot}\n");
|
|
Packit |
bf408e |
printf("mkdir -p %%{buildroot}/usr/bin\n");
|
|
Packit |
bf408e |
printf("make DESTDIR=%%{buildroot} install\n");
|
|
Packit |
bf408e |
printf("mkdir -p %%{buildroot}%%{_mandir}/man8\n");
|
|
Packit |
bf408e |
printf("cp crash.8 %%{buildroot}%%{_mandir}/man8/crash.8\n");
|
|
Packit |
bf408e |
printf("mkdir -p %%{buildroot}%%{_includedir}/crash\n");
|
|
Packit |
bf408e |
printf("cp defs.h %%{buildroot}%%{_includedir}/crash\n");
|
|
Packit |
bf408e |
printf("mkdir -p %%{buildroot}%%{_libdir}/crash/extensions\n");
|
|
Packit |
bf408e |
printf("if [ -f extensions/eppic.so ]\n");
|
|
Packit |
bf408e |
printf("then\n");
|
|
Packit |
bf408e |
printf("cp extensions/eppic.so %%{buildroot}%%{_libdir}/crash/extensions\n");
|
|
Packit |
bf408e |
printf("fi\n");
|
|
Packit |
bf408e |
printf("cp extensions/dminfo.so %%{buildroot}%%{_libdir}/crash/extensions\n");
|
|
Packit |
bf408e |
printf("cp extensions/snap.so %%{buildroot}%%{_libdir}/crash/extensions\n");
|
|
Packit |
bf408e |
printf("cp extensions/trace.so %%{buildroot}%%{_libdir}/crash/extensions\n");
|
|
Packit |
bf408e |
printf("\n");
|
|
Packit |
bf408e |
printf("%%clean\n");
|
|
Packit |
bf408e |
printf("rm -rf %%{buildroot}\n");
|
|
Packit |
bf408e |
printf("\n");
|
|
Packit |
bf408e |
printf("%%files\n");
|
|
Packit |
bf408e |
printf("%%defattr(-,root,root)\n");
|
|
Packit |
bf408e |
printf("/usr/bin/crash\n");
|
|
Packit |
bf408e |
printf("%%{_mandir}/man8/crash.8*\n");
|
|
Packit |
bf408e |
/* printf("/usr/bin/crashd\n"); */
|
|
Packit |
bf408e |
printf("%%doc README\n");
|
|
Packit |
bf408e |
printf("\n");
|
|
Packit |
bf408e |
printf("%%files devel\n");
|
|
Packit |
bf408e |
printf("%%defattr(-,root,root)\n");
|
|
Packit |
bf408e |
printf("%%{_includedir}/*\n");
|
|
Packit |
bf408e |
printf("\n");
|
|
Packit |
bf408e |
printf("%%files extensions\n");
|
|
Packit |
bf408e |
printf("%%defattr(-,root,root)\n");
|
|
Packit |
bf408e |
printf("%%{_libdir}/crash/extensions/*\n");
|
|
Packit |
bf408e |
}
|
|
Packit |
bf408e |
|
|
Packit |
bf408e |
/*
|
|
Packit |
bf408e |
* Use the default gdb #defines unless there's a .gdb file.
|
|
Packit |
bf408e |
*/
|
|
Packit |
bf408e |
struct supported_gdb_version *
|
|
Packit |
bf408e |
setup_gdb_defaults(void)
|
|
Packit |
bf408e |
{
|
|
Packit |
bf408e |
FILE *fp;
|
|
Packit |
bf408e |
char inbuf[512];
|
|
Packit |
bf408e |
char buf[512];
|
|
Packit |
bf408e |
struct supported_gdb_version *sp;
|
|
Packit |
bf408e |
|
|
Packit |
bf408e |
/*
|
|
Packit |
bf408e |
* Use the default, allowing for an override in .gdb
|
|
Packit |
bf408e |
*/
|
|
Packit |
bf408e |
if (!file_exists(".gdb"))
|
|
Packit |
bf408e |
return store_gdb_defaults(NULL);
|
|
Packit |
bf408e |
|
|
Packit |
bf408e |
if ((fp = fopen(".gdb", "r")) == NULL) {
|
|
Packit |
bf408e |
perror(".gdb");
|
|
Packit |
bf408e |
return store_gdb_defaults(NULL);
|
|
Packit |
bf408e |
}
|
|
Packit |
bf408e |
|
|
Packit |
bf408e |
while (fgets(inbuf, 512, fp)) {
|
|
Packit |
bf408e |
strip_linefeeds(inbuf);
|
|
Packit |
bf408e |
strip_beginning_whitespace(inbuf);
|
|
Packit |
bf408e |
|
|
Packit |
bf408e |
strcpy(buf, inbuf);
|
|
Packit |
bf408e |
|
|
Packit |
bf408e |
/*
|
|
Packit |
bf408e |
* Simple override.
|
|
Packit |
bf408e |
*/
|
|
Packit |
bf408e |
if (strcmp(buf, "5.3") == 0) {
|
|
Packit |
bf408e |
fclose(fp);
|
|
Packit |
bf408e |
sp = &supported_gdb_versions[GDB_5_3];
|
|
Packit |
bf408e |
fprintf(stderr, ".gdb configuration: %s\n\n", sp->GDB_VERSION_IN);
|
|
Packit |
bf408e |
return store_gdb_defaults(sp);
|
|
Packit |
bf408e |
}
|
|
Packit |
bf408e |
if (strcmp(buf, "6.0") == 0) {
|
|
Packit |
bf408e |
fclose(fp);
|
|
Packit |
bf408e |
sp = &supported_gdb_versions[GDB_6_0];
|
|
Packit |
bf408e |
fprintf(stderr, ".gdb configuration: %s\n\n", sp->GDB_VERSION_IN);
|
|
Packit |
bf408e |
return store_gdb_defaults(sp);
|
|
Packit |
bf408e |
}
|
|
Packit |
bf408e |
if (strcmp(buf, "6.1") == 0) {
|
|
Packit |
bf408e |
fclose(fp);
|
|
Packit |
bf408e |
sp = &supported_gdb_versions[GDB_6_1];
|
|
Packit |
bf408e |
fprintf(stderr, ".gdb configuration: %s\n", sp->GDB_VERSION_IN);
|
|
Packit |
bf408e |
return store_gdb_defaults(sp);
|
|
Packit |
bf408e |
}
|
|
Packit |
bf408e |
if (strcmp(buf, "7.0") == 0) {
|
|
Packit |
bf408e |
fclose(fp);
|
|
Packit |
bf408e |
sp = &supported_gdb_versions[GDB_7_0];
|
|
Packit |
bf408e |
fprintf(stderr, ".gdb configuration: %s\n", sp->GDB_VERSION_IN);
|
|
Packit |
bf408e |
return store_gdb_defaults(sp);
|
|
Packit |
bf408e |
}
|
|
Packit |
bf408e |
if (strcmp(buf, "7.3.1") == 0) {
|
|
Packit |
bf408e |
fclose(fp);
|
|
Packit |
bf408e |
sp = &supported_gdb_versions[GDB_7_3_1];
|
|
Packit |
bf408e |
fprintf(stderr, ".gdb configuration: %s\n", sp->GDB_VERSION_IN);
|
|
Packit |
bf408e |
return store_gdb_defaults(sp);
|
|
Packit |
bf408e |
}
|
|
Packit |
bf408e |
if (strcmp(buf, "7.6") == 0) {
|
|
Packit |
bf408e |
fclose(fp);
|
|
Packit |
bf408e |
sp = &supported_gdb_versions[GDB_7_6];
|
|
Packit |
bf408e |
fprintf(stderr, ".gdb configuration: %s\n", sp->GDB_VERSION_IN);
|
|
Packit |
bf408e |
return store_gdb_defaults(sp);
|
|
Packit |
bf408e |
}
|
|
Packit |
bf408e |
|
|
Packit |
bf408e |
}
|
|
Packit |
bf408e |
|
|
Packit |
bf408e |
fclose(fp);
|
|
Packit |
bf408e |
|
|
Packit |
bf408e |
fprintf(stderr, ".gdb: rejected -- using default gdb\n\n");
|
|
Packit |
bf408e |
return store_gdb_defaults(NULL);
|
|
Packit |
bf408e |
}
|
|
Packit |
bf408e |
|
|
Packit |
bf408e |
struct supported_gdb_version *
|
|
Packit |
bf408e |
store_gdb_defaults(struct supported_gdb_version *sp)
|
|
Packit |
bf408e |
{
|
|
Packit |
bf408e |
if (!sp)
|
|
Packit |
bf408e |
sp = &supported_gdb_versions[default_gdb];
|
|
Packit |
bf408e |
else
|
|
Packit |
bf408e |
fprintf(stderr, "WARNING: \"make clean\" may be required before rebuilding\n\n");
|
|
Packit |
bf408e |
|
|
Packit |
bf408e |
return sp;
|
|
Packit |
bf408e |
}
|
|
Packit |
bf408e |
|
|
Packit |
bf408e |
void
|
|
Packit |
bf408e |
set_initial_target(struct supported_gdb_version *sp)
|
|
Packit |
bf408e |
{
|
|
Packit |
bf408e |
FILE *fp;
|
|
Packit |
bf408e |
char crash_target[512];
|
|
Packit |
bf408e |
char buf[512];
|
|
Packit |
bf408e |
|
|
Packit |
bf408e |
target_data.initial_gdb_target = UNKNOWN;
|
|
Packit |
bf408e |
|
|
Packit |
bf408e |
sprintf(crash_target, "%s/crash.target",
|
|
Packit |
bf408e |
&sp->GDB[strlen("GDB=")]);
|
|
Packit |
bf408e |
|
|
Packit |
bf408e |
if (!file_exists(crash_target)) {
|
|
Packit |
bf408e |
if (target_data.target_as_param &&
|
|
Packit |
bf408e |
file_exists(&sp->GDB[strlen("GDB=")])) {
|
|
Packit |
bf408e |
fprintf(stderr,
|
|
Packit |
bf408e |
"\nThe \"%s\" file does not exist.\n",
|
|
Packit |
bf408e |
crash_target);
|
|
Packit |
bf408e |
target_rebuild_instructions(sp, (char *)target_data.target_as_param);
|
|
Packit |
bf408e |
exit(1);
|
|
Packit |
bf408e |
}
|
|
Packit |
bf408e |
return;
|
|
Packit |
bf408e |
}
|
|
Packit |
bf408e |
|
|
Packit |
bf408e |
if ((fp = fopen(crash_target, "r")) == NULL) {
|
|
Packit |
bf408e |
perror(crash_target);
|
|
Packit |
bf408e |
return;
|
|
Packit |
bf408e |
}
|
|
Packit |
bf408e |
|
|
Packit |
bf408e |
if (!fgets(buf, 512, fp)) {
|
|
Packit |
bf408e |
perror(crash_target);
|
|
Packit |
bf408e |
fclose(fp);
|
|
Packit |
bf408e |
return;
|
|
Packit |
bf408e |
}
|
|
Packit |
bf408e |
|
|
Packit |
bf408e |
fclose(fp);
|
|
Packit |
bf408e |
|
|
Packit |
bf408e |
if (strncmp(buf, "X86_64", strlen("X86_64")) == 0)
|
|
Packit |
bf408e |
target_data.initial_gdb_target = X86_64;
|
|
Packit |
bf408e |
else if (strncmp(buf, "X86", strlen("X86")) == 0)
|
|
Packit |
bf408e |
target_data.initial_gdb_target = X86;
|
|
Packit |
bf408e |
else if (strncmp(buf, "ALPHA", strlen("ALPHA")) == 0)
|
|
Packit |
bf408e |
target_data.initial_gdb_target = ALPHA;
|
|
Packit |
bf408e |
else if (strncmp(buf, "PPC64", strlen("PPC64")) == 0)
|
|
Packit |
bf408e |
target_data.initial_gdb_target = PPC64;
|
|
Packit |
bf408e |
else if (strncmp(buf, "PPC", strlen("PPC")) == 0)
|
|
Packit |
bf408e |
target_data.initial_gdb_target = PPC;
|
|
Packit |
bf408e |
else if (strncmp(buf, "IA64", strlen("IA64")) == 0)
|
|
Packit |
bf408e |
target_data.initial_gdb_target = IA64;
|
|
Packit |
bf408e |
else if (strncmp(buf, "S390X", strlen("S390X")) == 0)
|
|
Packit |
bf408e |
target_data.initial_gdb_target = S390X;
|
|
Packit |
bf408e |
else if (strncmp(buf, "S390", strlen("S390")) == 0)
|
|
Packit |
bf408e |
target_data.initial_gdb_target = S390;
|
|
Packit |
bf408e |
else if (strncmp(buf, "ARM64", strlen("ARM64")) == 0)
|
|
Packit |
bf408e |
target_data.initial_gdb_target = ARM64;
|
|
Packit |
bf408e |
else if (strncmp(buf, "ARM", strlen("ARM")) == 0)
|
|
Packit |
bf408e |
target_data.initial_gdb_target = ARM;
|
|
Packit |
bf408e |
else if (strncmp(buf, "MIPS", strlen("MIPS")) == 0)
|
|
Packit |
bf408e |
target_data.initial_gdb_target = MIPS;
|
|
Packit |
bf408e |
else if (strncmp(buf, "SPARC64", strlen("SPARC64")) == 0)
|
|
Packit |
bf408e |
target_data.initial_gdb_target = SPARC64;
|
|
Packit |
bf408e |
}
|
|
Packit |
bf408e |
|
|
Packit |
bf408e |
char *
|
|
Packit |
bf408e |
target_to_name(int target)
|
|
Packit |
bf408e |
{
|
|
Packit |
bf408e |
switch (target)
|
|
Packit |
bf408e |
{
|
|
Packit |
bf408e |
case X86: return("X86");
|
|
Packit |
bf408e |
case ALPHA: return("ALPHA");
|
|
Packit |
bf408e |
case PPC: return("PPC");
|
|
Packit |
bf408e |
case IA64: return("IA64");
|
|
Packit |
bf408e |
case S390: return("S390");
|
|
Packit |
bf408e |
case S390X: return("S390X");
|
|
Packit |
bf408e |
case PPC64: return("PPC64");
|
|
Packit |
bf408e |
case X86_64: return("X86_64");
|
|
Packit |
bf408e |
case ARM: return("ARM");
|
|
Packit |
bf408e |
case ARM64: return("ARM64");
|
|
Packit |
bf408e |
case MIPS: return("MIPS");
|
|
Packit |
bf408e |
case SPARC64: return("SPARC64");
|
|
Packit |
bf408e |
}
|
|
Packit |
bf408e |
|
|
Packit |
bf408e |
return "UNKNOWN";
|
|
Packit |
bf408e |
}
|
|
Packit |
bf408e |
|
|
Packit |
bf408e |
int
|
|
Packit |
bf408e |
name_to_target(char *name)
|
|
Packit |
bf408e |
{
|
|
Packit |
bf408e |
if (strncmp(name, "X86_64", strlen("X86_64")) == 0)
|
|
Packit |
bf408e |
return X86_64;
|
|
Packit |
bf408e |
else if (strncmp(name, "x86_64", strlen("x86_64")) == 0)
|
|
Packit |
bf408e |
return X86_64;
|
|
Packit |
bf408e |
else if (strncmp(name, "X86", strlen("X86")) == 0)
|
|
Packit |
bf408e |
return X86;
|
|
Packit |
bf408e |
else if (strncmp(name, "x86", strlen("x86")) == 0)
|
|
Packit |
bf408e |
return X86;
|
|
Packit |
bf408e |
else if (strncmp(name, "ALPHA", strlen("ALPHA")) == 0)
|
|
Packit |
bf408e |
return ALPHA;
|
|
Packit |
bf408e |
else if (strncmp(name, "alpha", strlen("alpha")) == 0)
|
|
Packit |
bf408e |
return ALPHA;
|
|
Packit |
bf408e |
else if (strncmp(name, "PPC64", strlen("PPC64")) == 0)
|
|
Packit |
bf408e |
return PPC64;
|
|
Packit |
bf408e |
else if (strncmp(name, "ppc64", strlen("ppc64")) == 0)
|
|
Packit |
bf408e |
return PPC64;
|
|
Packit |
bf408e |
else if (strncmp(name, "ppc64le", strlen("ppc64le")) == 0)
|
|
Packit |
bf408e |
return PPC64;
|
|
Packit |
bf408e |
else if (strncmp(name, "PPC64LE", strlen("PPC64LE")) == 0)
|
|
Packit |
bf408e |
return PPC64;
|
|
Packit |
bf408e |
else if (strncmp(name, "PPC", strlen("PPC")) == 0)
|
|
Packit |
bf408e |
return PPC;
|
|
Packit |
bf408e |
else if (strncmp(name, "ppc", strlen("ppc")) == 0)
|
|
Packit |
bf408e |
return PPC;
|
|
Packit |
bf408e |
else if (strncmp(name, "IA64", strlen("IA64")) == 0)
|
|
Packit |
bf408e |
return IA64;
|
|
Packit |
bf408e |
else if (strncmp(name, "ia64", strlen("ia64")) == 0)
|
|
Packit |
bf408e |
return IA64;
|
|
Packit |
bf408e |
else if (strncmp(name, "S390X", strlen("S390X")) == 0)
|
|
Packit |
bf408e |
return S390X;
|
|
Packit |
bf408e |
else if (strncmp(name, "s390x", strlen("s390x")) == 0)
|
|
Packit |
bf408e |
return S390X;
|
|
Packit |
bf408e |
else if (strncmp(name, "S390", strlen("S390")) == 0)
|
|
Packit |
bf408e |
return S390;
|
|
Packit |
bf408e |
else if (strncmp(name, "s390", strlen("s390")) == 0)
|
|
Packit |
bf408e |
return S390;
|
|
Packit |
bf408e |
else if (strncmp(name, "ARM64", strlen("ARM64")) == 0)
|
|
Packit |
bf408e |
return ARM64;
|
|
Packit |
bf408e |
else if (strncmp(name, "arm64", strlen("arm64")) == 0)
|
|
Packit |
bf408e |
return ARM64;
|
|
Packit |
bf408e |
else if (strncmp(name, "aarch64", strlen("aarch64")) == 0)
|
|
Packit |
bf408e |
return ARM64;
|
|
Packit |
bf408e |
else if (strncmp(name, "ARM", strlen("ARM")) == 0)
|
|
Packit |
bf408e |
return ARM;
|
|
Packit |
bf408e |
else if (strncmp(name, "arm", strlen("arm")) == 0)
|
|
Packit |
bf408e |
return ARM;
|
|
Packit |
bf408e |
else if (strncmp(name, "mips", strlen("mips")) == 0)
|
|
Packit |
bf408e |
return MIPS;
|
|
Packit |
bf408e |
else if (strncmp(name, "MIPS", strlen("MIPS")) == 0)
|
|
Packit |
bf408e |
return MIPS;
|
|
Packit |
bf408e |
else if (strncmp(name, "sparc64", strlen("sparc64")) == 0)
|
|
Packit |
bf408e |
return SPARC64;
|
|
Packit |
bf408e |
|
|
Packit |
bf408e |
return UNKNOWN;
|
|
Packit |
bf408e |
}
|
|
Packit |
bf408e |
|
|
Packit |
bf408e |
char *
|
|
Packit |
bf408e |
get_extra_flags(char *filename, char *initial)
|
|
Packit |
bf408e |
{
|
|
Packit |
bf408e |
FILE *fp;
|
|
Packit |
bf408e |
char inbuf[512];
|
|
Packit |
bf408e |
char buf[512];
|
|
Packit |
bf408e |
|
|
Packit |
bf408e |
if (!file_exists(filename))
|
|
Packit |
bf408e |
return (initial ? initial : NULL);
|
|
Packit |
bf408e |
|
|
Packit |
bf408e |
if ((fp = fopen(filename, "r")) == NULL) {
|
|
Packit |
bf408e |
perror(filename);
|
|
Packit |
bf408e |
return (initial ? initial : NULL);
|
|
Packit |
bf408e |
}
|
|
Packit |
bf408e |
|
|
Packit |
bf408e |
if (initial)
|
|
Packit |
bf408e |
strcpy(buf, initial);
|
|
Packit |
bf408e |
else
|
|
Packit |
bf408e |
buf[0] = '\0';
|
|
Packit |
bf408e |
|
|
Packit |
bf408e |
while (fgets(inbuf, 512, fp)) {
|
|
Packit |
bf408e |
strip_linefeeds(inbuf);
|
|
Packit |
bf408e |
strip_beginning_whitespace(inbuf);
|
|
Packit |
bf408e |
strip_ending_whitespace(inbuf);
|
|
Packit |
bf408e |
if (inbuf[0] == '#')
|
|
Packit |
bf408e |
continue;
|
|
Packit |
bf408e |
if (strlen(inbuf)) {
|
|
Packit |
bf408e |
if (strlen(buf))
|
|
Packit |
bf408e |
strcat(buf, " ");
|
|
Packit |
bf408e |
strcat(buf, inbuf);
|
|
Packit |
bf408e |
}
|
|
Packit |
bf408e |
}
|
|
Packit |
bf408e |
|
|
Packit |
bf408e |
fclose(fp);
|
|
Packit |
bf408e |
|
|
Packit |
bf408e |
if (strlen(buf))
|
|
Packit |
bf408e |
return strdup(buf);
|
|
Packit |
bf408e |
else
|
|
Packit |
bf408e |
return NULL;
|
|
Packit |
bf408e |
}
|
|
Packit |
bf408e |
|
|
Packit |
bf408e |
/*
|
|
Packit |
bf408e |
* Add extra compression libraries. If not already there, create
|
|
Packit |
bf408e |
* a CFLAGS.extra file and an LDFLAGS.extra file.
|
|
Packit |
bf408e |
|
|
Packit |
bf408e |
* For lzo:
|
|
Packit |
bf408e |
* - enter -DSNAPPY in the CFLAGS.extra file
|
|
Packit |
bf408e |
* - enter -lsnappy in the LDFLAGS.extra file
|
|
Packit |
bf408e |
*
|
|
Packit |
bf408e |
* For snappy:
|
|
Packit |
bf408e |
* - enter -DLZO in the CFLAGS.extra file
|
|
Packit |
bf408e |
* - enter -llzo2 in the LDFLAGS.extra file.
|
|
Packit |
bf408e |
*/
|
|
Packit |
bf408e |
void
|
|
Packit |
bf408e |
add_extra_lib(char *option)
|
|
Packit |
bf408e |
{
|
|
Packit |
bf408e |
int lzo, add_DLZO, add_llzo2;
|
|
Packit |
bf408e |
int snappy, add_DSNAPPY, add_lsnappy;
|
|
Packit |
bf408e |
char *cflags, *ldflags;
|
|
Packit |
bf408e |
FILE *fp_cflags, *fp_ldflags;
|
|
Packit |
bf408e |
char *mode;
|
|
Packit |
bf408e |
char inbuf[512];
|
|
Packit |
bf408e |
|
|
Packit |
bf408e |
lzo = add_DLZO = add_llzo2 = 0;
|
|
Packit |
bf408e |
snappy = add_DSNAPPY = add_lsnappy = 0;
|
|
Packit |
bf408e |
|
|
Packit |
bf408e |
ldflags = get_extra_flags("LDFLAGS.extra", NULL);
|
|
Packit |
bf408e |
cflags = get_extra_flags("CFLAGS.extra", NULL);
|
|
Packit |
bf408e |
|
|
Packit |
bf408e |
if (strcmp(option, "lzo") == 0) {
|
|
Packit |
bf408e |
lzo++;
|
|
Packit |
bf408e |
if (!cflags || !strstr(cflags, "-DLZO"))
|
|
Packit |
bf408e |
add_DLZO++;
|
|
Packit |
bf408e |
if (!ldflags || !strstr(ldflags, "-llzo2"))
|
|
Packit |
bf408e |
add_llzo2++;
|
|
Packit |
bf408e |
}
|
|
Packit |
bf408e |
|
|
Packit |
bf408e |
if (strcmp(option, "snappy") == 0) {
|
|
Packit |
bf408e |
snappy++;
|
|
Packit |
bf408e |
if (!cflags || !strstr(cflags, "-DSNAPPY"))
|
|
Packit |
bf408e |
add_DSNAPPY++;
|
|
Packit |
bf408e |
if (!ldflags || !strstr(ldflags, "-lsnappy"))
|
|
Packit |
bf408e |
add_lsnappy++;
|
|
Packit |
bf408e |
}
|
|
Packit |
bf408e |
|
|
Packit |
bf408e |
if ((lzo || snappy) &&
|
|
Packit |
bf408e |
file_exists("diskdump.o") && (unlink("diskdump.o") < 0)) {
|
|
Packit |
bf408e |
perror("diskdump.o");
|
|
Packit |
bf408e |
return;
|
|
Packit |
bf408e |
}
|
|
Packit |
bf408e |
|
|
Packit |
bf408e |
mode = file_exists("CFLAGS.extra") ? "r+" : "w+";
|
|
Packit |
bf408e |
if ((fp_cflags = fopen("CFLAGS.extra", mode)) == NULL) {
|
|
Packit |
bf408e |
perror("CFLAGS.extra");
|
|
Packit |
bf408e |
return;
|
|
Packit |
bf408e |
}
|
|
Packit |
bf408e |
|
|
Packit |
bf408e |
mode = file_exists("LDFLAGS.extra") ? "r+" : "w+";
|
|
Packit |
bf408e |
if ((fp_ldflags = fopen("LDFLAGS.extra", mode)) == NULL) {
|
|
Packit |
bf408e |
perror("LDFLAGS.extra");
|
|
Packit |
bf408e |
fclose(fp_cflags);
|
|
Packit |
bf408e |
return;
|
|
Packit |
bf408e |
}
|
|
Packit |
bf408e |
|
|
Packit |
bf408e |
if (add_DLZO || add_DSNAPPY) {
|
|
Packit |
bf408e |
while (fgets(inbuf, 512, fp_cflags))
|
|
Packit |
bf408e |
;
|
|
Packit |
bf408e |
if (add_DLZO)
|
|
Packit |
bf408e |
fputs("-DLZO\n", fp_cflags);
|
|
Packit |
bf408e |
if (add_DSNAPPY)
|
|
Packit |
bf408e |
fputs("-DSNAPPY\n", fp_cflags);
|
|
Packit |
bf408e |
}
|
|
Packit |
bf408e |
|
|
Packit |
bf408e |
if (add_llzo2 || add_lsnappy) {
|
|
Packit |
bf408e |
while (fgets(inbuf, 512, fp_ldflags))
|
|
Packit |
bf408e |
;
|
|
Packit |
bf408e |
if (add_llzo2)
|
|
Packit |
bf408e |
fputs("-llzo2\n", fp_ldflags);
|
|
Packit |
bf408e |
if (add_lsnappy)
|
|
Packit |
bf408e |
fputs("-lsnappy\n", fp_ldflags);
|
|
Packit |
bf408e |
}
|
|
Packit |
bf408e |
|
|
Packit |
bf408e |
fclose(fp_cflags);
|
|
Packit |
bf408e |
fclose(fp_ldflags);
|
|
Packit |
bf408e |
}
|