]> git.ipfire.org Git - thirdparty/xz.git/commitdiff
xz: Make xz buildable even when encoders or decoders are disabled.
authorLasse Collin <lasse.collin@tukaani.org>
Tue, 3 Nov 2015 18:29:33 +0000 (20:29 +0200)
committerLasse Collin <lasse.collin@tukaani.org>
Tue, 3 Nov 2015 18:29:33 +0000 (20:29 +0200)
The patch is quite long but it's mostly about adding new #ifdefs
to omit code when encoders or decoders have been disabled.

This adds two new #defines to config.h: HAVE_ENCODERS and
HAVE_DECODERS.

configure.ac
src/xz/Makefile.am
src/xz/args.c
src/xz/coder.c
src/xz/main.c
src/xz/private.h

index fb554442f94f47cc20820bc842068e38e41b1087..cb6eac98588c8bd5cdfcf367cdecf4fc00865a37 100644 (file)
@@ -114,6 +114,8 @@ else
                                ;;
                esac
        done
+       AC_DEFINE([HAVE_ENCODERS], [1],
+               [Define to 1 if any of HAVE_ENCODER_foo have been defined.])
        AC_MSG_RESULT([$enable_encoders])
 fi
 
@@ -141,6 +143,8 @@ else
                                ;;
                esac
        done
+       AC_DEFINE([HAVE_DECODERS], [1],
+               [Define to 1 if any of HAVE_DECODER_foo have been defined.])
        AC_MSG_RESULT([$enable_decoders])
 fi
 
index 500be4114d72964862f3a5ef2dfa9634f716b5b7..2c6e6f54f55bed670129bc0316712b47dbd1a8a5 100644 (file)
@@ -16,8 +16,6 @@ xz_SOURCES = \
        file_io.h \
        hardware.c \
        hardware.h \
-       list.c \
-       list.h \
        main.c \
        main.h \
        message.c \
@@ -39,6 +37,12 @@ xz_SOURCES = \
        ../common/tuklib_mbstr_width.c \
        ../common/tuklib_mbstr_fw.c
 
+if COND_MAIN_DECODER
+xz_SOURCES = \
+       list.c \
+       list.h
+endif
+
 if COND_W32
 xz_SOURCES += xz_w32res.rc
 endif
index 041c80073e6de088effce621ae53dbaf7984af6f..341f29e1b0e933ac3f99f62390451de79234d966 100644 (file)
@@ -635,6 +635,22 @@ args_parse(args_info *args, int argc, char **argv)
        // Then from the command line
        parse_real(args, argc, argv);
 
+       // If encoder or decoder support was omitted at build time,
+       // show an error now so that the rest of the code can rely on
+       // that whatever is in opt_mode is also supported.
+#ifndef HAVE_ENCODERS
+       if (opt_mode == MODE_COMPRESS)
+               message_fatal(_("Compression support was disabled "
+                               "at build time"));
+#endif
+#ifndef HAVE_DECODERS
+       // Even MODE_LIST cannot work without decoder support so MODE_COMPRESS
+       // is the only valid choice.
+       if (opt_mode != MODE_COMPRESS)
+               message_fatal(_("Decompression support was disabled "
+                               "at build time"));
+#endif
+
        // Never remove the source file when the destination is not on disk.
        // In test mode the data is written nowhere, but setting opt_stdout
        // will make the rest of the code behave well.
index a94bdb83266faef517b1da19aa87327535da1384..3c6a01cbbdbe17e046a274bd639320d8d6783d53 100644 (file)
@@ -51,7 +51,7 @@ static lzma_check check;
 /// This becomes false if the --check=CHECK option is used.
 static bool check_default = true;
 
-#ifdef MYTHREAD_ENABLED
+#if defined(HAVE_ENCODERS) && defined(MYTHREAD_ENABLED)
 static lzma_mt mt_options = {
        .flags = 0,
        .timeout = 300,
@@ -221,9 +221,10 @@ coder_set_compression_settings(void)
        // Get the memory usage. Note that if --format=raw was used,
        // we can be decompressing.
        const uint64_t memory_limit = hardware_memlimit_get(opt_mode);
-       uint64_t memory_usage;
+       uint64_t memory_usage = UINT64_MAX;
        if (opt_mode == MODE_COMPRESS) {
-#ifdef MYTHREAD_ENABLED
+#ifdef HAVE_ENCODERS
+#      ifdef MYTHREAD_ENABLED
                if (opt_format == FORMAT_XZ && hardware_threads_get() > 1) {
                        mt_options.threads = hardware_threads_get();
                        mt_options.block_size = opt_block_size;
@@ -235,12 +236,15 @@ coder_set_compression_settings(void)
                                                " threads."),
                                                mt_options.threads);
                } else
-#endif
+#      endif
                {
                        memory_usage = lzma_raw_encoder_memusage(filters);
                }
+#endif
        } else {
+#ifdef HAVE_DECODERS
                memory_usage = lzma_raw_decoder_memusage(filters);
+#endif
        }
 
        if (memory_usage == UINT64_MAX)
@@ -248,7 +252,11 @@ coder_set_compression_settings(void)
 
        // Print memory usage info before possible dictionary
        // size auto-adjusting.
+       //
+       // NOTE: If only encoder support was built, we cannot show the
+       // what the decoder memory usage will be.
        message_mem_needed(V_DEBUG, memory_usage);
+#ifdef HAVE_DECODERS
        if (opt_mode == MODE_COMPRESS) {
                const uint64_t decmem = lzma_raw_decoder_memusage(filters);
                if (decmem != UINT64_MAX)
@@ -256,6 +264,7 @@ coder_set_compression_settings(void)
                                        "%s MiB of memory."), uint64_to_str(
                                                round_up_to_mib(decmem), 0));
        }
+#endif
 
        if (memory_usage <= memory_limit)
                return;
@@ -268,7 +277,8 @@ coder_set_compression_settings(void)
 
        assert(opt_mode == MODE_COMPRESS);
 
-#ifdef MYTHREAD_ENABLED
+#ifdef HAVE_ENCODERS
+#      ifdef MYTHREAD_ENABLED
        if (opt_format == FORMAT_XZ && mt_options.threads > 1) {
                // Try to reduce the number of threads before
                // adjusting the compression settings down.
@@ -295,7 +305,7 @@ coder_set_compression_settings(void)
                        uint64_to_str(round_up_to_mib(
                                memory_limit), 2));
        }
-#endif
+#      endif
 
        if (memory_usage <= memory_limit)
                return;
@@ -349,11 +359,13 @@ coder_set_compression_settings(void)
                        uint64_to_str(orig_dict_size >> 20, 0),
                        uint64_to_str(opt->dict_size >> 20, 1),
                        uint64_to_str(round_up_to_mib(memory_limit), 2));
+#endif
 
        return;
 }
 
 
+#ifdef HAVE_DECODERS
 /// Return true if the data in in_buf seems to be in the .xz format.
 static bool
 is_format_xz(void)
@@ -411,6 +423,7 @@ is_format_lzma(void)
 
        return true;
 }
+#endif
 
 
 /// Detect the input file type (for now, this done only when decompressing),
@@ -424,6 +437,7 @@ coder_init(file_pair *pair)
        lzma_ret ret = LZMA_PROG_ERROR;
 
        if (opt_mode == MODE_COMPRESS) {
+#ifdef HAVE_ENCODERS
                switch (opt_format) {
                case FORMAT_AUTO:
                        // args.c ensures this.
@@ -431,12 +445,12 @@ coder_init(file_pair *pair)
                        break;
 
                case FORMAT_XZ:
-#ifdef MYTHREAD_ENABLED
+#      ifdef MYTHREAD_ENABLED
                        if (hardware_threads_get() > 1)
                                ret = lzma_stream_encoder_mt(
                                                &strm, &mt_options);
                        else
-#endif
+#      endif
                                ret = lzma_stream_encoder(
                                                &strm, filters, check);
                        break;
@@ -449,7 +463,9 @@ coder_init(file_pair *pair)
                        ret = lzma_raw_encoder(&strm, filters);
                        break;
                }
+#endif
        } else {
+#ifdef HAVE_DECODERS
                uint32_t flags = 0;
 
                // It seems silly to warn about unsupported check if the
@@ -531,6 +547,7 @@ coder_init(file_pair *pair)
                        strm.avail_out = 0;
                        ret = lzma_code(&strm, LZMA_RUN);
                }
+#endif
        }
 
        if (ret != LZMA_OK) {
index 5e0789ada22c6201c64cb575a44f29f0605c4d7f..af550c4585d91fbe507368ec01738c38bc7829ab 100644 (file)
@@ -225,8 +225,11 @@ main(int argc, char **argv)
 
        // coder_run() handles compression, decompression, and testing.
        // list_file() is for --list.
-       void (*run)(const char *filename) = opt_mode == MODE_LIST
-                        ? &list_file : &coder_run;
+       void (*run)(const char *filename) = &coder_run;
+#ifdef HAVE_DECODERS
+       if (opt_mode == MODE_LIST)
+               run = &list_file;
+#endif
 
        // Process the files given on the command line. Note that if no names
        // were given, args_parse() gave us a fake "-" filename.
@@ -285,6 +288,7 @@ main(int argc, char **argv)
                        (void)fclose(args.files_file);
        }
 
+#ifdef HAVE_DECODERS
        // All files have now been handled. If in --list mode, display
        // the totals before exiting. We don't have signal handlers
        // enabled in --list mode, so we don't need to check user_abort.
@@ -292,6 +296,7 @@ main(int argc, char **argv)
                assert(!user_abort);
                list_totals();
        }
+#endif
 
 #ifndef NDEBUG
        coder_free();
index b84cbbb1fdd9f751b9be6487993f27627c6ae144..e61563ac72af04bd331ab7a0603feefa71b4819d 100644 (file)
@@ -60,4 +60,7 @@
 #include "signals.h"
 #include "suffix.h"
 #include "util.h"
-#include "list.h"
+
+#ifdef HAVE_DECODERS
+#      include "list.h"
+#endif