├── m4 └── .keep ├── AUTHORS ├── NEWS ├── ChangeLog ├── README.md ├── .travis └── build.sh ├── tests └── test_twrpabx.cpp ├── README ├── src ├── main.cpp ├── twrpabx.h ├── twadbstream.h └── twrpabx.cpp ├── .travis.yml ├── man └── twrpabx.1.md ├── test.sh ├── configure.ac ├── LICENSE-twadbstream.h.txt ├── Makefile.am ├── .gitignore ├── COPYING └── INSTALL /m4/.keep: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /AUTHORS: -------------------------------------------------------------------------------- 1 | 2 | -------------------------------------------------------------------------------- /NEWS: -------------------------------------------------------------------------------- 1 | 2 | -------------------------------------------------------------------------------- /ChangeLog: -------------------------------------------------------------------------------- 1 | 2 | -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | README -------------------------------------------------------------------------------- /.travis/build.sh: -------------------------------------------------------------------------------- 1 | #!/bin/bash 2 | set -e 3 | set -x 4 | autoreconf -vfi ./configure.ac 5 | ./test.sh 6 | 7 | -------------------------------------------------------------------------------- /tests/test_twrpabx.cpp: -------------------------------------------------------------------------------- 1 | #include "twrpabx.h" 2 | 3 | int main(int argc, char** argv) { 4 | return 0; 5 | } 6 | 7 | -------------------------------------------------------------------------------- /README: -------------------------------------------------------------------------------- 1 | Extractor for TWRP ADB backup format 2 | 3 | Output format is one or more files in TWRP in-place backup format 4 | -------------------------------------------------------------------------------- /src/main.cpp: -------------------------------------------------------------------------------- 1 | #include "twrpabx.h" 2 | 3 | int main(int argc, char** argv) { 4 | return twrpabx::Main(argc, argv); 5 | } 6 | 7 | 8 | -------------------------------------------------------------------------------- /.travis.yml: -------------------------------------------------------------------------------- 1 | language: c++ 2 | os: osx 3 | 4 | before_install: 5 | - brew install pandoc 6 | 7 | script: 8 | - .travis/build.sh 9 | 10 | -------------------------------------------------------------------------------- /man/twrpabx.1.md: -------------------------------------------------------------------------------- 1 | % twrpabx(1) twrpabx TWRP ADB backup file extractor 2 | 3 | # NAME 4 | 5 | twrpabx - TWRP ADB backup file extractor 6 | 7 | # SYNOPSIS 8 | 9 | **twrpabx** TODO 10 | 11 | # DESCRIPTION 12 | 13 | TODO 14 | 15 | # OPTIONS 16 | 17 | TODO 18 | 19 | -------------------------------------------------------------------------------- /test.sh: -------------------------------------------------------------------------------- 1 | #!/bin/bash 2 | set -e 3 | ./configure CFLAGS='-Wall -Wextra -Werror -Wno-unused-parameter -O0 -g' --enable-log-level=LOG_DEBUG 4 | make clean 5 | make 6 | if ! make check; then 7 | echo "Test failure!" 1>&2 8 | find . -name '*.log' | sort | while read i; do echo "$i:"; cat "$i"; echo; done 1>&2 9 | exit 1 10 | fi 11 | echo "Success! All tests passed." 12 | 13 | -------------------------------------------------------------------------------- /configure.ac: -------------------------------------------------------------------------------- 1 | dnl Process this file with autoconf to produce a configure script. 2 | 3 | AC_PREREQ(2.59) 4 | AC_INIT(twrpabx, 0.1) 5 | AC_PROG_CC 6 | 7 | AC_CANONICAL_SYSTEM 8 | 9 | AC_CONFIG_MACRO_DIR([m4]) 10 | AC_CONFIG_HEADERS([src/twrpabx_config.h]) 11 | 12 | dnl Initialize automake 13 | AM_INIT_AUTOMAKE 14 | 15 | dnl this allows us specify individual linking flags for each target 16 | AC_PROG_CXX 17 | 18 | dnl Initialize Libtool 19 | LT_INIT 20 | 21 | AC_CONFIG_FILES(Makefile) 22 | AC_OUTPUT 23 | 24 | -------------------------------------------------------------------------------- /src/twrpabx.h: -------------------------------------------------------------------------------- 1 | /* 2 | * Copyright 2018 Ari Fogel 3 | * Released under Apache 2.0 license 4 | */ 5 | 6 | #ifndef __TWRPABX_H__ 7 | #define __TWRPABX_H__ 8 | 9 | #include 10 | 11 | #define TWRPABX_BLOCK_SIZE (512) 12 | #define TWRPABX_NAME_SIZE (468) 13 | #define TWRPABX_TYPE_SIZE (16) 14 | 15 | class twrpabx { 16 | public: 17 | static int Main(int argc, char** argv); 18 | static void ReadBackupStreamHeader(FILE* input_file, size_t* size_remaining); 19 | static bool ReadFile(FILE* input_file, size_t* size_remaining); 20 | static void ReadChunk(FILE* input_file, FILE* output_file, char* buf, size_t* size_remaining); 21 | }; 22 | 23 | 24 | #endif 25 | -------------------------------------------------------------------------------- /LICENSE-twadbstream.h.txt: -------------------------------------------------------------------------------- 1 | The file is copied from 2 | 3 | I could not find a license in that repository. 4 | However, Dees_Troy, "Lead Developer of TWRP" has written at the following: 5 | "All of TWRP 3.x source is public." 6 | 7 | I take that to mean it has been released into the public domain or equivalent. If you are a copyright holder and you hold this statement inaccurate, please contact me and let me know how you would like me to proceed. 8 | 9 | -Ari Fogel 10 | 11 | 2018-05-07 12 | 13 | -------------------------------------------------------------------------------- /Makefile.am: -------------------------------------------------------------------------------- 1 | AUTOMAKE_OPTIONS = subdir-objects serial-tests 2 | ACLOCAL_AMFLAGS=-I m4 3 | 4 | ### Module and test library 5 | 6 | TWRPABX_DOC = man/twrpabx.1 7 | 8 | dist_man_MANS = $(TWRPABX_DOC) 9 | 10 | TWRPABX_SRC = src/twadbstream.h src/twrpabx.h src/twrpabx.cpp 11 | 12 | bin_PROGRAMS = twrpabx 13 | 14 | twrpabx_SOURCES = $(TWRPABX_SRC) src/main.cpp 15 | 16 | ### Tests 17 | TEST_NAMES = \ 18 | test_twrpabx 19 | 20 | TESTS = $(TEST_NAMES) 21 | 22 | check_PROGRAMS = $(TEST_NAMES) 23 | 24 | TEST_CFLAGS = $(AM_CFLAGS) -DTWRPABX_TEST 25 | 26 | # Test template 27 | test_twrpabx_CFLAGS = $(TEST_CFLAGS) 28 | test_twrpabx_CPPFLAGS = -I$(top_srcdir)/src 29 | test_twrpabx_LDADD = $(TEST_LDFLAGS) 30 | test_twrpabx_SOURCES = tests/test_twrpabx.cpp $(TWRPABX_SRC) 31 | 32 | .PHONY: doc 33 | 34 | doc: $(PAM_ACCESS_OSX_DOC) 35 | 36 | man/twrpabx.1: man/twrpabx.1.md 37 | pandoc --standalone --to man man/twrpabx.1.md > man/twrpabx.1 38 | 39 | -------------------------------------------------------------------------------- /.gitignore: -------------------------------------------------------------------------------- 1 | # http://www.gnu.org/software/automake 2 | 3 | Makefile.in 4 | /ar-lib 5 | /mdate-sh 6 | /py-compile 7 | /test-driver 8 | /ylwrap 9 | 10 | # http://www.gnu.org/software/autoconf 11 | 12 | /autom4te.cache 13 | /autoscan.log 14 | /autoscan-*.log 15 | /aclocal.m4 16 | /compile 17 | /config.guess 18 | /config.sub 19 | /configure 20 | /configure.scan 21 | /depcomp 22 | /install-sh 23 | /missing 24 | stamp-h1 25 | 26 | # https://www.gnu.org/software/libtool/ 27 | 28 | /ltmain.sh 29 | 30 | # http://www.gnu.org/software/texinfo 31 | 32 | /texinfo.tex 33 | 34 | # http://www.gnu.org/software/m4/ 35 | 36 | m4/libtool.m4 37 | m4/ltoptions.m4 38 | m4/ltsugar.m4 39 | m4/ltversion.m4 40 | m4/lt~obsolete.m4 41 | autom4te.cache 42 | 43 | *.in 44 | *.in~ 45 | .libs 46 | .deps 47 | /config.status 48 | /libtool 49 | Makefile 50 | .dirstamp 51 | 52 | # generated configuration header 53 | twrpabx_config.h 54 | 55 | # tests 56 | test_twrpabx 57 | 58 | # program 59 | twrpabx 60 | 61 | # pandoc generated manpages 62 | *.[0-9] 63 | 64 | *.la 65 | *.lo 66 | *.o 67 | *.log 68 | *.swp 69 | *.trs 70 | -------------------------------------------------------------------------------- /src/twadbstream.h: -------------------------------------------------------------------------------- 1 | /* 2 | TWRP is free software: you can redistribute it and/or modify 3 | it under the terms of the GNU General Public License as published by 4 | the Free Software Foundation, either version 3 of the License, or 5 | (at your option) any later version. 6 | 7 | TWRP is distributed in the hope that it will be useful, 8 | but WITHOUT ANY WARRANTY; without even the implied warranty of 9 | MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the 10 | GNU General Public License for more details. 11 | 12 | You should have received a copy of the GNU General Public License 13 | along with TWRP. If not, see . 14 | */ 15 | 16 | #ifndef __TWADBSTREAM_H 17 | #define __TWADBSTREAM_H 18 | 19 | #define TWRPARG "--twrp" 20 | #define TWRP_BACKUP_ARG "backup" 21 | #define TWRP_RESTORE_ARG "restore" 22 | #define TWRP_STREAM_ARG "stream" 23 | #define TW_ADB_BACKUP "/tmp/twadbbackup" //FIFO for adb backup 24 | #define TW_ADB_RESTORE "/tmp/twadbrestore" //FIFO for adb restore 25 | #define TW_ADB_BU_CONTROL "/tmp/twadbbucontrol" //FIFO for sending control from TWRP to ADB Backup 26 | #define TW_ADB_TWRP_CONTROL "/tmp/twadbtwrpcontrol" //FIFO for sending control from ADB Backup to TWRP 27 | #define TWRP "TWRP" //Magic Value 28 | #define ADB_BU_MAX_ERROR 20 //Max amount of errors for while loops 29 | #define ADB_BACKUP_OP "adbbackup" 30 | #define ADB_RESTORE_OP "adbrestore" 31 | 32 | //ADB Backup Control Commands 33 | #define TWSTREAMHDR "twstreamheader" //TWRP Parititon Count Control 34 | #define TWFN "twfilename" //TWRP Filename Control 35 | #define TWIMG "twimage" //TWRP Image name Control 36 | #define TWEOF "tweof" //End of File for Image/File 37 | #define MD5TRAILER "md5trailer" //Image/File MD5 Trailer 38 | #define TWDATA "twdatablock" // twrp adb backup data block header 39 | #define TWMD5 "twverifymd5" //This command is compared to the md5trailer by ORS to verify transfer 40 | #define TWENDADB "twendadb" //End Protocol 41 | #define TWERROR "twerror" //Send error 42 | #define ADB_BACKUP_VERSION 2 //Backup Version 43 | #define DATA_MAX_CHUNK_SIZE 1048576 //Maximum size between each data header 44 | #define MAX_ADB_READ 512 //align with default tar size for amount to read fom adb stream 45 | 46 | /* 47 | structs for adb backup need to align to 512 bytes for reading 512 48 | bytes at a time 49 | Each struct contains a crc field so that when we are checking for commands 50 | and the crc doesn't match we still assume it's data matching the command 51 | struct but not really a command 52 | */ 53 | 54 | /* stream format: 55 | | TW ADB Backup Header | 56 | | TW File Stream Header | 57 | | File Data | 58 | | File/Image MD5 Trailer | 59 | | TW File Stream Header | 60 | | File Data | 61 | | File/Image MD5 Trailer | 62 | | etc... | 63 | */ 64 | 65 | //determine whether struct is 512 bytes, if not fail compilation 66 | #define ADBSTRUCT_STATIC_ASSERT(structure) typedef char adb_assertion[( !!(structure) )*2-1 ] 67 | 68 | //generic cmd structure to align fields for sending commands to and from adb backup 69 | struct AdbBackupControlType { 70 | char start_of_header[8]; //stores the magic value #define TWRP 71 | char type[16]; //stores the type of command, TWENDADB, TWCNT, TWEOF, TWMD5, TWDATA and TWERROR 72 | uint32_t crc; //stores the zlib 32 bit crc of the AdbBackupControlType struct to allow for making sure we are processing metadata 73 | char space[484]; //stores space to align the struct to 512 bytes 74 | 75 | //return a C++ string while not reading outside the type char array 76 | std::string get_type() { 77 | return std::string(type, strnlen(type, sizeof(type)-1)); 78 | } 79 | }; 80 | 81 | //general info for file metadata stored in adb backup header 82 | struct twfilehdr { 83 | char start_of_header[8]; //stores the magic value #define TWRP 84 | char type[16]; //stores the type of file header, TWFN or TWIMG 85 | uint64_t size; //stores the size of the file contained after this header in the backup file 86 | uint64_t compressed; //stores whether the file is compressed or not. 1 == compressed and 0 == uncompressed 87 | uint32_t crc; //stores the zlib 32 bit crc of the twfilehdr struct to allow for making sure we are processing metadata 88 | char name[468]; //stores the filename of the file 89 | }; 90 | 91 | //md5 for files stored as a trailer to files in the adb backup file to check 92 | //that they are restored correctly 93 | struct AdbBackupFileTrailer { 94 | char start_of_trailer[8]; //stores the magic value #define TWRP 95 | char type[16]; //stores the AdbBackupFileTrailer type MD5TRAILER 96 | uint32_t crc; //stores the zlib 32 bit crc of the AdbBackupFileTrailer struct to allow for making sure we are processing metadata 97 | uint32_t ident; //stores crc to determine if header is encapsulated in stream as data 98 | char md5[40]; //stores the md5 computation of the file 99 | char space[440]; //stores space to align the struct to 512 bytes 100 | }; 101 | 102 | //info for version and number of partitions backed up 103 | struct AdbBackupStreamHeader { 104 | char start_of_header[8]; //stores the magic value #define TWRP 105 | char type[16]; //stores the AdbBackupStreamHeader value TWCNT 106 | uint64_t partition_count; //stores the number of partitions to restore in the stream 107 | uint64_t version; //stores the version of adb backup. increment ADB_BACKUP_VERSION each time the metadata is updated 108 | uint32_t crc; //stores the zlib 32 bit crc of the AdbBackupStreamHeader struct to allow for making sure we are processing metadata 109 | char space[468]; //stores space to align the struct to 512 bytes 110 | }; 111 | 112 | #endif //__TWADBSTREAM_H 113 | -------------------------------------------------------------------------------- /src/twrpabx.cpp: -------------------------------------------------------------------------------- 1 | /* 2 | * Copyright 2018 Ari Fogel 3 | * Released under Apache 2.0 license 4 | */ 5 | 6 | #include 7 | #include 8 | #include 9 | #include 10 | #include 11 | #include 12 | #include 13 | #include 14 | 15 | #include "twadbstream.h" 16 | #include "twrpabx.h" 17 | 18 | using namespace std; 19 | 20 | 21 | 22 | int twrpabx::Main(int argc, char** argv) { 23 | if (argc != 2) { 24 | cerr << "Expected exactly 1 argument: " << endl; 25 | exit(1); 26 | } 27 | 28 | char* filename = argv[1]; 29 | cout << "Input file: '" << filename << "'" << endl; 30 | 31 | FILE* input_file = fopen(filename, "rb"); 32 | if (input_file == NULL) { 33 | perror("Failed to open input file"); 34 | exit(1); 35 | } 36 | 37 | fseek(input_file, 0L, SEEK_END); 38 | size_t size_remaining = ftell(input_file); 39 | fseek(input_file, 0L, SEEK_SET); 40 | 41 | twrpabx::ReadBackupStreamHeader(input_file, &size_remaining); 42 | 43 | while (twrpabx::ReadFile(input_file, &size_remaining)) {}; 44 | 45 | if (fclose(input_file) == EOF) { 46 | perror("Failed to close input file"); 47 | exit(1); 48 | } 49 | 50 | return 0; 51 | } 52 | 53 | void twrpabx::ReadBackupStreamHeader(FILE* input_file, size_t* size_remaining) { 54 | char* buf = (char*)calloc(TWRPABX_BLOCK_SIZE, 1); 55 | size_t bytes_read = fread((void*)buf, 1, TWRPABX_BLOCK_SIZE, input_file); 56 | cout << "Read " << bytes_read << " bytes" << endl; 57 | if (bytes_read < TWRPABX_BLOCK_SIZE) { 58 | cerr << "Failed to read TW ADB Backup Header\n"; 59 | exit(1); 60 | } 61 | *size_remaining -= bytes_read; 62 | 63 | char* strbuf = (char*)calloc(TWRPABX_TYPE_SIZE,1); 64 | if (strbuf == NULL) { 65 | cerr << "Failed to allocate 64-byte strbuf: " << strerror(errno) << endl; 66 | } 67 | 68 | AdbBackupStreamHeader* twAdbBackupHeader = (AdbBackupStreamHeader*)buf; 69 | if (strncmp(twAdbBackupHeader->start_of_header, "TWRP", 4)) { 70 | cerr << "Corrupt start of backup header" << endl; 71 | exit(1); 72 | } 73 | 74 | memcpy(strbuf, twAdbBackupHeader->type, TWRPABX_TYPE_SIZE); 75 | cout << "TW ADB Backup Header type: " << strbuf << endl; 76 | cout << "Number of partitions: " << twAdbBackupHeader->partition_count << endl; 77 | free(buf); 78 | free(strbuf); 79 | } 80 | 81 | void twrpabx::ReadChunk(FILE* input_file, FILE* output_file, char* buf, size_t* size_remaining) { 82 | size_t bytes_read = fread((void*)buf, 1, TWRPABX_BLOCK_SIZE, input_file); 83 | cout << "Read " << bytes_read << " bytes" << endl; 84 | if (bytes_read < TWRPABX_BLOCK_SIZE) { 85 | cerr << "Failed to read data header" << endl; 86 | exit(1); 87 | } 88 | *size_remaining -= bytes_read; 89 | 90 | char strbuf[512] = {0}; 91 | 92 | AdbBackupControlType* control_block = (AdbBackupControlType*)buf; 93 | if (strncmp(control_block->start_of_header, "TWRP", 4)) { 94 | /* No control block. If we are not within one chunk + trailer of EOF, abort. */ 95 | *size_remaining += TWRPABX_BLOCK_SIZE; 96 | if (*size_remaining >= DATA_MAX_CHUNK_SIZE + 1024) { 97 | cerr << "Corrupt start of data header" << endl; 98 | exit(1); 99 | } 100 | cout << "No control block; seeking to 2 blocks before EOF" << endl; 101 | /* Seek to trailer, i.e. 2 blocks before EOF */ 102 | if (fseek(input_file, -1024L, SEEK_END) < 0) { 103 | perror("Failed to seek 2 blocks before EOF"); 104 | exit(1); 105 | } 106 | *size_remaining = 1024; 107 | return; 108 | } 109 | 110 | memcpy(strbuf, control_block->type, TWRPABX_TYPE_SIZE); 111 | cout << "Data header type: " << strbuf << endl; 112 | 113 | size_t max_data = DATA_MAX_CHUNK_SIZE - TWRPABX_BLOCK_SIZE; 114 | char databuf[max_data]; 115 | size_t to_read = *size_remaining < max_data - 1024 ? *size_remaining - 1024 : max_data; 116 | //size_t to_read = max_data; 117 | bytes_read = fread((void*)databuf, 1, to_read, input_file); 118 | cout << "Read " << bytes_read << " bytes" << endl; 119 | if (bytes_read < to_read) { 120 | cerr << "Failed to read. Only read " << bytes_read << " bytes of " << to_read << endl; 121 | exit(1); 122 | } 123 | *size_remaining -= bytes_read; 124 | size_t bytes_written = fwrite((void*)databuf, 1, bytes_read, output_file); 125 | if (bytes_written < bytes_read) { 126 | cerr << "Failed to write. Only wrote " << bytes_written << " bytes of " << bytes_read << endl; 127 | exit(1); 128 | } 129 | cout << "Wrote " << bytes_written << " bytes" << endl; 130 | cout << "Remaining bytes in backup file: " << *size_remaining << endl; 131 | } 132 | 133 | bool twrpabx::ReadFile(FILE* input_file, size_t* size_remaining) { 134 | char* buf = (char*)calloc(TWRPABX_BLOCK_SIZE, 1); 135 | if (buf == NULL) { 136 | cerr << "Could not allocate " << TWRPABX_BLOCK_SIZE << "-byte buffer" << endl; 137 | exit(1); 138 | } 139 | size_t bytes_read = fread((void*)buf, 1, TWRPABX_BLOCK_SIZE, input_file); 140 | cout << "Read " << bytes_read << " bytes" << endl; 141 | if (bytes_read < TWRPABX_BLOCK_SIZE) { 142 | cerr << "Failed to read file header" << endl; 143 | exit(1); 144 | } 145 | *size_remaining -= bytes_read; 146 | 147 | char* strbuf = (char*)calloc(TWRPABX_BLOCK_SIZE, 1); 148 | if (strbuf == NULL) { 149 | cerr << "Could not allocate " << TWRPABX_BLOCK_SIZE << "-byte string buffer" << endl; 150 | exit(1); 151 | } 152 | 153 | twfilehdr* file_header = (twfilehdr*)buf; 154 | if (strncmp(file_header->start_of_header, "TWRP", 4)) { 155 | cerr << "Corrupt start of file header" << endl; 156 | exit(1); 157 | } 158 | 159 | memcpy(strbuf, file_header->type, TWRPABX_TYPE_SIZE); 160 | 161 | if (!strncmp(TWENDADB, strbuf, TWRPABX_TYPE_SIZE)) { 162 | cout << "End ADB type: " << strbuf << endl; 163 | free(buf); 164 | free(strbuf); 165 | return false; 166 | } 167 | 168 | if (strncmp(TWFN, strbuf, TWRPABX_TYPE_SIZE)) { 169 | cerr << "Unexpected type: " << strbuf << endl; 170 | exit(1); 171 | } 172 | 173 | cout << "File Header type: " << strbuf << endl; 174 | 175 | cout << "File size: " << *size_remaining << "\n"; 176 | 177 | cout << "twfilehdr.size: " << file_header->size << endl; 178 | cout << "twfilehdr.compressed: " << (file_header->compressed?true:false) << endl; 179 | 180 | memcpy(strbuf, file_header->name, TWRPABX_NAME_SIZE); 181 | cout << "Raw file name: " << strbuf << endl; 182 | char* last_element = strtok(strbuf, "/"); 183 | char* current_element; 184 | while ((current_element = strtok(NULL, "/")) != NULL) { 185 | last_element = current_element; 186 | }; 187 | cout << "File name: %s" << last_element << endl; 188 | 189 | FILE* output_file = fopen(last_element, "wb"); 190 | 191 | do { 192 | twrpabx::ReadChunk(input_file, output_file, buf, size_remaining); 193 | } while (*size_remaining > 1024); 194 | 195 | if (fclose(output_file) < 0) { 196 | perror("Failed to close output file"); 197 | exit(1); 198 | } 199 | 200 | cout << "Current offset: " << ftell(input_file) << endl; 201 | 202 | /* trailer */ 203 | 204 | bytes_read = fread((void*)buf, 1, TWRPABX_BLOCK_SIZE, input_file); 205 | cout << "Read " << bytes_read << " bytes" << endl; 206 | if (bytes_read < TWRPABX_BLOCK_SIZE) { 207 | cerr << "Failed to read file trailer" << endl; 208 | exit(1); 209 | } 210 | *size_remaining -= bytes_read; 211 | 212 | AdbBackupFileTrailer* trailer = (AdbBackupFileTrailer*)buf; 213 | if (strncmp(file_header->start_of_header, "TWRP", 4)) { 214 | cerr << "Corrupt start of file trailer" << endl; 215 | exit(1); 216 | } 217 | 218 | memcpy(strbuf, file_header->type, TWRPABX_TYPE_SIZE); 219 | cout << "File trailer type: " << strbuf << endl; 220 | 221 | free(buf); 222 | free(strbuf); 223 | return true; 224 | } 225 | 226 | -------------------------------------------------------------------------------- /COPYING: -------------------------------------------------------------------------------- 1 | Apache License 2 | Version 2.0, January 2004 3 | http://www.apache.org/licenses/ 4 | 5 | TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION 6 | 7 | 1. Definitions. 8 | 9 | "License" shall mean the terms and conditions for use, reproduction, 10 | and distribution as defined by Sections 1 through 9 of this document. 11 | 12 | "Licensor" shall mean the copyright owner or entity authorized by 13 | the copyright owner that is granting the License. 14 | 15 | "Legal Entity" shall mean the union of the acting entity and all 16 | other entities that control, are controlled by, or are under common 17 | control with that entity. For the purposes of this definition, 18 | "control" means (i) the power, direct or indirect, to cause the 19 | direction or management of such entity, whether by contract or 20 | otherwise, or (ii) ownership of fifty percent (50%) or more of the 21 | outstanding shares, or (iii) beneficial ownership of such entity. 22 | 23 | "You" (or "Your") shall mean an individual or Legal Entity 24 | exercising permissions granted by this License. 25 | 26 | "Source" form shall mean the preferred form for making modifications, 27 | including but not limited to software source code, documentation 28 | source, and configuration files. 29 | 30 | "Object" form shall mean any form resulting from mechanical 31 | transformation or translation of a Source form, including but 32 | not limited to compiled object code, generated documentation, 33 | and conversions to other media types. 34 | 35 | "Work" shall mean the work of authorship, whether in Source or 36 | Object form, made available under the License, as indicated by a 37 | copyright notice that is included in or attached to the work 38 | (an example is provided in the Appendix below). 39 | 40 | "Derivative Works" shall mean any work, whether in Source or Object 41 | form, that is based on (or derived from) the Work and for which the 42 | editorial revisions, annotations, elaborations, or other modifications 43 | represent, as a whole, an original work of authorship. For the purposes 44 | of this License, Derivative Works shall not include works that remain 45 | separable from, or merely link (or bind by name) to the interfaces of, 46 | the Work and Derivative Works thereof. 47 | 48 | "Contribution" shall mean any work of authorship, including 49 | the original version of the Work and any modifications or additions 50 | to that Work or Derivative Works thereof, that is intentionally 51 | submitted to Licensor for inclusion in the Work by the copyright owner 52 | or by an individual or Legal Entity authorized to submit on behalf of 53 | the copyright owner. For the purposes of this definition, "submitted" 54 | means any form of electronic, verbal, or written communication sent 55 | to the Licensor or its representatives, including but not limited to 56 | communication on electronic mailing lists, source code control systems, 57 | and issue tracking systems that are managed by, or on behalf of, the 58 | Licensor for the purpose of discussing and improving the Work, but 59 | excluding communication that is conspicuously marked or otherwise 60 | designated in writing by the copyright owner as "Not a Contribution." 61 | 62 | "Contributor" shall mean Licensor and any individual or Legal Entity 63 | on behalf of whom a Contribution has been received by Licensor and 64 | subsequently incorporated within the Work. 65 | 66 | 2. Grant of Copyright License. Subject to the terms and conditions of 67 | this License, each Contributor hereby grants to You a perpetual, 68 | worldwide, non-exclusive, no-charge, royalty-free, irrevocable 69 | copyright license to reproduce, prepare Derivative Works of, 70 | publicly display, publicly perform, sublicense, and distribute the 71 | Work and such Derivative Works in Source or Object form. 72 | 73 | 3. Grant of Patent License. Subject to the terms and conditions of 74 | this License, each Contributor hereby grants to You a perpetual, 75 | worldwide, non-exclusive, no-charge, royalty-free, irrevocable 76 | (except as stated in this section) patent license to make, have made, 77 | use, offer to sell, sell, import, and otherwise transfer the Work, 78 | where such license applies only to those patent claims licensable 79 | by such Contributor that are necessarily infringed by their 80 | Contribution(s) alone or by combination of their Contribution(s) 81 | with the Work to which such Contribution(s) was submitted. If You 82 | institute patent litigation against any entity (including a 83 | cross-claim or counterclaim in a lawsuit) alleging that the Work 84 | or a Contribution incorporated within the Work constitutes direct 85 | or contributory patent infringement, then any patent licenses 86 | granted to You under this License for that Work shall terminate 87 | as of the date such litigation is filed. 88 | 89 | 4. Redistribution. You may reproduce and distribute copies of the 90 | Work or Derivative Works thereof in any medium, with or without 91 | modifications, and in Source or Object form, provided that You 92 | meet the following conditions: 93 | 94 | (a) You must give any other recipients of the Work or 95 | Derivative Works a copy of this License; and 96 | 97 | (b) You must cause any modified files to carry prominent notices 98 | stating that You changed the files; and 99 | 100 | (c) You must retain, in the Source form of any Derivative Works 101 | that You distribute, all copyright, patent, trademark, and 102 | attribution notices from the Source form of the Work, 103 | excluding those notices that do not pertain to any part of 104 | the Derivative Works; and 105 | 106 | (d) If the Work includes a "NOTICE" text file as part of its 107 | distribution, then any Derivative Works that You distribute must 108 | include a readable copy of the attribution notices contained 109 | within such NOTICE file, excluding those notices that do not 110 | pertain to any part of the Derivative Works, in at least one 111 | of the following places: within a NOTICE text file distributed 112 | as part of the Derivative Works; within the Source form or 113 | documentation, if provided along with the Derivative Works; or, 114 | within a display generated by the Derivative Works, if and 115 | wherever such third-party notices normally appear. The contents 116 | of the NOTICE file are for informational purposes only and 117 | do not modify the License. You may add Your own attribution 118 | notices within Derivative Works that You distribute, alongside 119 | or as an addendum to the NOTICE text from the Work, provided 120 | that such additional attribution notices cannot be construed 121 | as modifying the License. 122 | 123 | You may add Your own copyright statement to Your modifications and 124 | may provide additional or different license terms and conditions 125 | for use, reproduction, or distribution of Your modifications, or 126 | for any such Derivative Works as a whole, provided Your use, 127 | reproduction, and distribution of the Work otherwise complies with 128 | the conditions stated in this License. 129 | 130 | 5. Submission of Contributions. Unless You explicitly state otherwise, 131 | any Contribution intentionally submitted for inclusion in the Work 132 | by You to the Licensor shall be under the terms and conditions of 133 | this License, without any additional terms or conditions. 134 | Notwithstanding the above, nothing herein shall supersede or modify 135 | the terms of any separate license agreement you may have executed 136 | with Licensor regarding such Contributions. 137 | 138 | 6. Trademarks. This License does not grant permission to use the trade 139 | names, trademarks, service marks, or product names of the Licensor, 140 | except as required for reasonable and customary use in describing the 141 | origin of the Work and reproducing the content of the NOTICE file. 142 | 143 | 7. Disclaimer of Warranty. Unless required by applicable law or 144 | agreed to in writing, Licensor provides the Work (and each 145 | Contributor provides its Contributions) on an "AS IS" BASIS, 146 | WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or 147 | implied, including, without limitation, any warranties or conditions 148 | of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A 149 | PARTICULAR PURPOSE. You are solely responsible for determining the 150 | appropriateness of using or redistributing the Work and assume any 151 | risks associated with Your exercise of permissions under this License. 152 | 153 | 8. Limitation of Liability. In no event and under no legal theory, 154 | whether in tort (including negligence), contract, or otherwise, 155 | unless required by applicable law (such as deliberate and grossly 156 | negligent acts) or agreed to in writing, shall any Contributor be 157 | liable to You for damages, including any direct, indirect, special, 158 | incidental, or consequential damages of any character arising as a 159 | result of this License or out of the use or inability to use the 160 | Work (including but not limited to damages for loss of goodwill, 161 | work stoppage, computer failure or malfunction, or any and all 162 | other commercial damages or losses), even if such Contributor 163 | has been advised of the possibility of such damages. 164 | 165 | 9. Accepting Warranty or Additional Liability. While redistributing 166 | the Work or Derivative Works thereof, You may choose to offer, 167 | and charge a fee for, acceptance of support, warranty, indemnity, 168 | or other liability obligations and/or rights consistent with this 169 | License. However, in accepting such obligations, You may act only 170 | on Your own behalf and on Your sole responsibility, not on behalf 171 | of any other Contributor, and only if You agree to indemnify, 172 | defend, and hold each Contributor harmless for any liability 173 | incurred by, or claims asserted against, such Contributor by reason 174 | of your accepting any such warranty or additional liability. 175 | 176 | END OF TERMS AND CONDITIONS 177 | 178 | APPENDIX: How to apply the Apache License to your work. 179 | 180 | To apply the Apache License to your work, attach the following 181 | boilerplate notice, with the fields enclosed by brackets "[]" 182 | replaced with your own identifying information. (Don't include 183 | the brackets!) The text should be enclosed in the appropriate 184 | comment syntax for the file format. We also recommend that a 185 | file or class name and description of purpose be included on the 186 | same "printed page" as the copyright notice for easier 187 | identification within third-party archives. 188 | 189 | Copyright [yyyy] [name of copyright owner] 190 | 191 | Licensed under the Apache License, Version 2.0 (the "License"); 192 | you may not use this file except in compliance with the License. 193 | You may obtain a copy of the License at 194 | 195 | http://www.apache.org/licenses/LICENSE-2.0 196 | 197 | Unless required by applicable law or agreed to in writing, software 198 | distributed under the License is distributed on an "AS IS" BASIS, 199 | WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 200 | See the License for the specific language governing permissions and 201 | limitations under the License. 202 | -------------------------------------------------------------------------------- /INSTALL: -------------------------------------------------------------------------------- 1 | Installation Instructions 2 | ************************* 3 | 4 | Copyright (C) 1994-1996, 1999-2002, 2004-2016 Free Software 5 | Foundation, Inc. 6 | 7 | Copying and distribution of this file, with or without modification, 8 | are permitted in any medium without royalty provided the copyright 9 | notice and this notice are preserved. This file is offered as-is, 10 | without warranty of any kind. 11 | 12 | Basic Installation 13 | ================== 14 | 15 | Briefly, the shell command './configure && make && make install' 16 | should configure, build, and install this package. The following 17 | more-detailed instructions are generic; see the 'README' file for 18 | instructions specific to this package. Some packages provide this 19 | 'INSTALL' file but do not implement all of the features documented 20 | below. The lack of an optional feature in a given package is not 21 | necessarily a bug. More recommendations for GNU packages can be found 22 | in *note Makefile Conventions: (standards)Makefile Conventions. 23 | 24 | The 'configure' shell script attempts to guess correct values for 25 | various system-dependent variables used during compilation. It uses 26 | those values to create a 'Makefile' in each directory of the package. 27 | It may also create one or more '.h' files containing system-dependent 28 | definitions. Finally, it creates a shell script 'config.status' that 29 | you can run in the future to recreate the current configuration, and a 30 | file 'config.log' containing compiler output (useful mainly for 31 | debugging 'configure'). 32 | 33 | It can also use an optional file (typically called 'config.cache' and 34 | enabled with '--cache-file=config.cache' or simply '-C') that saves the 35 | results of its tests to speed up reconfiguring. Caching is disabled by 36 | default to prevent problems with accidental use of stale cache files. 37 | 38 | If you need to do unusual things to compile the package, please try 39 | to figure out how 'configure' could check whether to do them, and mail 40 | diffs or instructions to the address given in the 'README' so they can 41 | be considered for the next release. If you are using the cache, and at 42 | some point 'config.cache' contains results you don't want to keep, you 43 | may remove or edit it. 44 | 45 | The file 'configure.ac' (or 'configure.in') is used to create 46 | 'configure' by a program called 'autoconf'. You need 'configure.ac' if 47 | you want to change it or regenerate 'configure' using a newer version of 48 | 'autoconf'. 49 | 50 | The simplest way to compile this package is: 51 | 52 | 1. 'cd' to the directory containing the package's source code and type 53 | './configure' to configure the package for your system. 54 | 55 | Running 'configure' might take a while. While running, it prints 56 | some messages telling which features it is checking for. 57 | 58 | 2. Type 'make' to compile the package. 59 | 60 | 3. Optionally, type 'make check' to run any self-tests that come with 61 | the package, generally using the just-built uninstalled binaries. 62 | 63 | 4. Type 'make install' to install the programs and any data files and 64 | documentation. When installing into a prefix owned by root, it is 65 | recommended that the package be configured and built as a regular 66 | user, and only the 'make install' phase executed with root 67 | privileges. 68 | 69 | 5. Optionally, type 'make installcheck' to repeat any self-tests, but 70 | this time using the binaries in their final installed location. 71 | This target does not install anything. Running this target as a 72 | regular user, particularly if the prior 'make install' required 73 | root privileges, verifies that the installation completed 74 | correctly. 75 | 76 | 6. You can remove the program binaries and object files from the 77 | source code directory by typing 'make clean'. To also remove the 78 | files that 'configure' created (so you can compile the package for 79 | a different kind of computer), type 'make distclean'. There is 80 | also a 'make maintainer-clean' target, but that is intended mainly 81 | for the package's developers. If you use it, you may have to get 82 | all sorts of other programs in order to regenerate files that came 83 | with the distribution. 84 | 85 | 7. Often, you can also type 'make uninstall' to remove the installed 86 | files again. In practice, not all packages have tested that 87 | uninstallation works correctly, even though it is required by the 88 | GNU Coding Standards. 89 | 90 | 8. Some packages, particularly those that use Automake, provide 'make 91 | distcheck', which can by used by developers to test that all other 92 | targets like 'make install' and 'make uninstall' work correctly. 93 | This target is generally not run by end users. 94 | 95 | Compilers and Options 96 | ===================== 97 | 98 | Some systems require unusual options for compilation or linking that 99 | the 'configure' script does not know about. Run './configure --help' 100 | for details on some of the pertinent environment variables. 101 | 102 | You can give 'configure' initial values for configuration parameters 103 | by setting variables in the command line or in the environment. Here is 104 | an example: 105 | 106 | ./configure CC=c99 CFLAGS=-g LIBS=-lposix 107 | 108 | *Note Defining Variables::, for more details. 109 | 110 | Compiling For Multiple Architectures 111 | ==================================== 112 | 113 | You can compile the package for more than one kind of computer at the 114 | same time, by placing the object files for each architecture in their 115 | own directory. To do this, you can use GNU 'make'. 'cd' to the 116 | directory where you want the object files and executables to go and run 117 | the 'configure' script. 'configure' automatically checks for the source 118 | code in the directory that 'configure' is in and in '..'. This is known 119 | as a "VPATH" build. 120 | 121 | With a non-GNU 'make', it is safer to compile the package for one 122 | architecture at a time in the source code directory. After you have 123 | installed the package for one architecture, use 'make distclean' before 124 | reconfiguring for another architecture. 125 | 126 | On MacOS X 10.5 and later systems, you can create libraries and 127 | executables that work on multiple system types--known as "fat" or 128 | "universal" binaries--by specifying multiple '-arch' options to the 129 | compiler but only a single '-arch' option to the preprocessor. Like 130 | this: 131 | 132 | ./configure CC="gcc -arch i386 -arch x86_64 -arch ppc -arch ppc64" \ 133 | CXX="g++ -arch i386 -arch x86_64 -arch ppc -arch ppc64" \ 134 | CPP="gcc -E" CXXCPP="g++ -E" 135 | 136 | This is not guaranteed to produce working output in all cases, you 137 | may have to build one architecture at a time and combine the results 138 | using the 'lipo' tool if you have problems. 139 | 140 | Installation Names 141 | ================== 142 | 143 | By default, 'make install' installs the package's commands under 144 | '/usr/local/bin', include files under '/usr/local/include', etc. You 145 | can specify an installation prefix other than '/usr/local' by giving 146 | 'configure' the option '--prefix=PREFIX', where PREFIX must be an 147 | absolute file name. 148 | 149 | You can specify separate installation prefixes for 150 | architecture-specific files and architecture-independent files. If you 151 | pass the option '--exec-prefix=PREFIX' to 'configure', the package uses 152 | PREFIX as the prefix for installing programs and libraries. 153 | Documentation and other data files still use the regular prefix. 154 | 155 | In addition, if you use an unusual directory layout you can give 156 | options like '--bindir=DIR' to specify different values for particular 157 | kinds of files. Run 'configure --help' for a list of the directories 158 | you can set and what kinds of files go in them. In general, the default 159 | for these options is expressed in terms of '${prefix}', so that 160 | specifying just '--prefix' will affect all of the other directory 161 | specifications that were not explicitly provided. 162 | 163 | The most portable way to affect installation locations is to pass the 164 | correct locations to 'configure'; however, many packages provide one or 165 | both of the following shortcuts of passing variable assignments to the 166 | 'make install' command line to change installation locations without 167 | having to reconfigure or recompile. 168 | 169 | The first method involves providing an override variable for each 170 | affected directory. For example, 'make install 171 | prefix=/alternate/directory' will choose an alternate location for all 172 | directory configuration variables that were expressed in terms of 173 | '${prefix}'. Any directories that were specified during 'configure', 174 | but not in terms of '${prefix}', must each be overridden at install time 175 | for the entire installation to be relocated. The approach of makefile 176 | variable overrides for each directory variable is required by the GNU 177 | Coding Standards, and ideally causes no recompilation. However, some 178 | platforms have known limitations with the semantics of shared libraries 179 | that end up requiring recompilation when using this method, particularly 180 | noticeable in packages that use GNU Libtool. 181 | 182 | The second method involves providing the 'DESTDIR' variable. For 183 | example, 'make install DESTDIR=/alternate/directory' will prepend 184 | '/alternate/directory' before all installation names. The approach of 185 | 'DESTDIR' overrides is not required by the GNU Coding Standards, and 186 | does not work on platforms that have drive letters. On the other hand, 187 | it does better at avoiding recompilation issues, and works well even 188 | when some directory options were not specified in terms of '${prefix}' 189 | at 'configure' time. 190 | 191 | Optional Features 192 | ================= 193 | 194 | If the package supports it, you can cause programs to be installed 195 | with an extra prefix or suffix on their names by giving 'configure' the 196 | option '--program-prefix=PREFIX' or '--program-suffix=SUFFIX'. 197 | 198 | Some packages pay attention to '--enable-FEATURE' options to 199 | 'configure', where FEATURE indicates an optional part of the package. 200 | They may also pay attention to '--with-PACKAGE' options, where PACKAGE 201 | is something like 'gnu-as' or 'x' (for the X Window System). The 202 | 'README' should mention any '--enable-' and '--with-' options that the 203 | package recognizes. 204 | 205 | For packages that use the X Window System, 'configure' can usually 206 | find the X include and library files automatically, but if it doesn't, 207 | you can use the 'configure' options '--x-includes=DIR' and 208 | '--x-libraries=DIR' to specify their locations. 209 | 210 | Some packages offer the ability to configure how verbose the 211 | execution of 'make' will be. For these packages, running './configure 212 | --enable-silent-rules' sets the default to minimal output, which can be 213 | overridden with 'make V=1'; while running './configure 214 | --disable-silent-rules' sets the default to verbose, which can be 215 | overridden with 'make V=0'. 216 | 217 | Particular systems 218 | ================== 219 | 220 | On HP-UX, the default C compiler is not ANSI C compatible. If GNU CC 221 | is not installed, it is recommended to use the following options in 222 | order to use an ANSI C compiler: 223 | 224 | ./configure CC="cc -Ae -D_XOPEN_SOURCE=500" 225 | 226 | and if that doesn't work, install pre-built binaries of GCC for HP-UX. 227 | 228 | HP-UX 'make' updates targets which have the same time stamps as their 229 | prerequisites, which makes it generally unusable when shipped generated 230 | files such as 'configure' are involved. Use GNU 'make' instead. 231 | 232 | On OSF/1 a.k.a. Tru64, some versions of the default C compiler cannot 233 | parse its '' header file. The option '-nodtk' can be used as a 234 | workaround. If GNU CC is not installed, it is therefore recommended to 235 | try 236 | 237 | ./configure CC="cc" 238 | 239 | and if that doesn't work, try 240 | 241 | ./configure CC="cc -nodtk" 242 | 243 | On Solaris, don't put '/usr/ucb' early in your 'PATH'. This 244 | directory contains several dysfunctional programs; working variants of 245 | these programs are available in '/usr/bin'. So, if you need '/usr/ucb' 246 | in your 'PATH', put it _after_ '/usr/bin'. 247 | 248 | On Haiku, software installed for all users goes in '/boot/common', 249 | not '/usr/local'. It is recommended to use the following options: 250 | 251 | ./configure --prefix=/boot/common 252 | 253 | Specifying the System Type 254 | ========================== 255 | 256 | There may be some features 'configure' cannot figure out 257 | automatically, but needs to determine by the type of machine the package 258 | will run on. Usually, assuming the package is built to be run on the 259 | _same_ architectures, 'configure' can figure that out, but if it prints 260 | a message saying it cannot guess the machine type, give it the 261 | '--build=TYPE' option. TYPE can either be a short name for the system 262 | type, such as 'sun4', or a canonical name which has the form: 263 | 264 | CPU-COMPANY-SYSTEM 265 | 266 | where SYSTEM can have one of these forms: 267 | 268 | OS 269 | KERNEL-OS 270 | 271 | See the file 'config.sub' for the possible values of each field. If 272 | 'config.sub' isn't included in this package, then this package doesn't 273 | need to know the machine type. 274 | 275 | If you are _building_ compiler tools for cross-compiling, you should 276 | use the option '--target=TYPE' to select the type of system they will 277 | produce code for. 278 | 279 | If you want to _use_ a cross compiler, that generates code for a 280 | platform different from the build platform, you should specify the 281 | "host" platform (i.e., that on which the generated programs will 282 | eventually be run) with '--host=TYPE'. 283 | 284 | Sharing Defaults 285 | ================ 286 | 287 | If you want to set default values for 'configure' scripts to share, 288 | you can create a site shell script called 'config.site' that gives 289 | default values for variables like 'CC', 'cache_file', and 'prefix'. 290 | 'configure' looks for 'PREFIX/share/config.site' if it exists, then 291 | 'PREFIX/etc/config.site' if it exists. Or, you can set the 292 | 'CONFIG_SITE' environment variable to the location of the site script. 293 | A warning: not all 'configure' scripts look for a site script. 294 | 295 | Defining Variables 296 | ================== 297 | 298 | Variables not defined in a site shell script can be set in the 299 | environment passed to 'configure'. However, some packages may run 300 | configure again during the build, and the customized values of these 301 | variables may be lost. In order to avoid this problem, you should set 302 | them in the 'configure' command line, using 'VAR=value'. For example: 303 | 304 | ./configure CC=/usr/local2/bin/gcc 305 | 306 | causes the specified 'gcc' to be used as the C compiler (unless it is 307 | overridden in the site shell script). 308 | 309 | Unfortunately, this technique does not work for 'CONFIG_SHELL' due to an 310 | Autoconf limitation. Until the limitation is lifted, you can use this 311 | workaround: 312 | 313 | CONFIG_SHELL=/bin/bash ./configure CONFIG_SHELL=/bin/bash 314 | 315 | 'configure' Invocation 316 | ====================== 317 | 318 | 'configure' recognizes the following options to control how it 319 | operates. 320 | 321 | '--help' 322 | '-h' 323 | Print a summary of all of the options to 'configure', and exit. 324 | 325 | '--help=short' 326 | '--help=recursive' 327 | Print a summary of the options unique to this package's 328 | 'configure', and exit. The 'short' variant lists options used only 329 | in the top level, while the 'recursive' variant lists options also 330 | present in any nested packages. 331 | 332 | '--version' 333 | '-V' 334 | Print the version of Autoconf used to generate the 'configure' 335 | script, and exit. 336 | 337 | '--cache-file=FILE' 338 | Enable the cache: use and save the results of the tests in FILE, 339 | traditionally 'config.cache'. FILE defaults to '/dev/null' to 340 | disable caching. 341 | 342 | '--config-cache' 343 | '-C' 344 | Alias for '--cache-file=config.cache'. 345 | 346 | '--quiet' 347 | '--silent' 348 | '-q' 349 | Do not print messages saying which checks are being made. To 350 | suppress all normal output, redirect it to '/dev/null' (any error 351 | messages will still be shown). 352 | 353 | '--srcdir=DIR' 354 | Look for the package's source code in directory DIR. Usually 355 | 'configure' can determine that directory automatically. 356 | 357 | '--prefix=DIR' 358 | Use DIR as the installation prefix. *note Installation Names:: for 359 | more details, including other options available for fine-tuning the 360 | installation locations. 361 | 362 | '--no-create' 363 | '-n' 364 | Run the configure checks, but stop before creating any output 365 | files. 366 | 367 | 'configure' also accepts some other, not widely useful, options. Run 368 | 'configure --help' for more details. 369 | --------------------------------------------------------------------------------