Seqanswers Leaderboard Ad

Collapse

Announcement

Collapse
No announcement yet.
X
 
  • Filter
  • Time
  • Show
Clear All
new posts

  • cufflinks source install error

    I am having problems with a source install of cufflinks: Seems to be Boost related, but, configure does not show error

    Using Boost 1.48.0 and Cufflinks 1.3.0.

    Here are the relevant lines from configure
    Code:
    checking for boostlib >= 1.38.0... yes
    checking for bamlib... yes
    checking build system type... x86_64-unknown-linux-gnu
    checking whether the Boost::Thread library is available... yes
    ...
    -- cufflinks 1.3.0 Configuration Results --
      C++ compiler:        g++ -Wall -Wno-strict-aliasing -g -gdwarf-2 -Wuninitialized -m64 -O3  -DNDEBUG  -pthread -I/home/matthew/local/include/boost-1_48 -I/usr/local/include 
      GCC version:         gcc (Ubuntu/Linaro 4.6.1-9ubuntu3) 4.6.1
      Host System type:    x86_64-unknown-linux-gnu
      Install prefix:      /home/matthew/software
      Install eprefix:     ${prefix}
    when making, however, I get errors

    Code:
    matthew@macmanes:~/cufflinks-1.3.0$ make
    make  all-recursive
    make[1]: Entering directory `/home/matthew/cufflinks-1.3.0'
    Making all in src
    make[2]: Entering directory `/home/matthew/cufflinks-1.3.0/src'
    if g++ -DHAVE_CONFIG_H -I. -I. -I..  -I../src  -I/usr/include  -Wall -Wno-strict-aliasing -g -gdwarf-2 -Wuninitialized -m64 -O3  -DNDEBUG  -pthread -I/home/matthew/local/include/boost-1_48 -I/usr/local/include -MT clustering.o -MD -MP -MF ".deps/clustering.Tpo" -c -o clustering.o clustering.cpp; \
    	then mv -f ".deps/clustering.Tpo" ".deps/clustering.Po"; else rm -f ".deps/clustering.Tpo"; exit 1; fi
    In file included from abundances.h:22:0,
                     from clustering.h:38,
                     from clustering.cpp:10:
    bundles.h: In constructor ‘BundleFactory::BundleFactory(boost::shared_ptr<HitFactory>, BundleMode)’:
    bundles.h:363:9: warning: ‘BundleFactory::_curr_bundle’ will be initialized after [-Wreorder]
    bundles.h:209:39: warning:   ‘boost::random::uniform_01<boost::random::mersenne_twister_engine<unsigned int, 32ul, 624ul, 397ul, 31ul, 2567483615u, 11ul, 4294967295u, 7ul, 2636928640u, 15ul, 4022730752u, 18ul, 1812433253u> > BundleFactory::_zeroone’ [-Wreorder]
    bundles.h:213:2: warning:   when initialized here [-Wreorder]
    In file included from clustering.h:38:0,
                     from clustering.cpp:10:
    abundances.h: In constructor ‘AbundanceGroup::AbundanceGroup(const std::vector<boost::shared_ptr<Abundance> >&)’:
    abundances.h:448:27: warning: ‘AbundanceGroup::_iterated_exp_count_covariance’ will be initialized after [-Wreorder]
    abundances.h:443:27: warning:   ‘boost::numeric::ublas::matrix<double> AbundanceGroup::_count_covariance’ [-Wreorder]
    abundances.h:302:2: warning:   when initialized here [-Wreorder]
    if g++ -DHAVE_CONFIG_H -I. -I. -I..  -I../src  -I/usr/include  -Wall -Wno-strict-aliasing -g -gdwarf-2 -Wuninitialized -m64 -O3  -DNDEBUG  -pthread -I/home/matthew/local/include/boost-1_48 -I/usr/local/include -MT differential.o -MD -MP -MF ".deps/differential.Tpo" -c -o differential.o differential.cpp; \
    	then mv -f ".deps/differential.Tpo" ".deps/differential.Po"; else rm -f ".deps/differential.Tpo"; exit 1; fi
    In file included from abundances.h:22:0,
                     from differential.cpp:17:
    bundles.h: In constructor ‘BundleFactory::BundleFactory(boost::shared_ptr<HitFactory>, BundleMode)’:
    bundles.h:363:9: warning: ‘BundleFactory::_curr_bundle’ will be initialized after [-Wreorder]
    bundles.h:209:39: warning:   ‘boost::random::uniform_01<boost::random::mersenne_twister_engine<unsigned int, 32ul, 624ul, 397ul, 31ul, 2567483615u, 11ul, 4294967295u, 7ul, 2636928640u, 15ul, 4022730752u, 18ul, 1812433253u> > BundleFactory::_zeroone’ [-Wreorder]
    bundles.h:213:2: warning:   when initialized here [-Wreorder]
    In file included from differential.cpp:17:0:
    abundances.h: In constructor ‘AbundanceGroup::AbundanceGroup(const std::vector<boost::shared_ptr<Abundance> >&)’:
    abundances.h:448:27: warning: ‘AbundanceGroup::_iterated_exp_count_covariance’ will be initialized after [-Wreorder]
    abundances.h:443:27: warning:   ‘boost::numeric::ublas::matrix<double> AbundanceGroup::_count_covariance’ [-Wreorder]
    abundances.h:302:2: warning:   when initialized here [-Wreorder]
    In file included from hits.h:21:0,
                     from abundances.h:20,
                     from differential.cpp:17:
    common.h: At global scope:
    common.h:25:25: error: ‘boost::BOOST_FOREACH’ has not been declared
    In file included from differential.h:29:0,
                     from differential.cpp:18:
    replicates.h: In member function ‘bool ReplicatedBundleFactory::next_bundle(HitBundle&)’:
    replicates.h:141:50: warning: unused variable ‘s2’ [-Wunused-variable]
    differential.cpp: In member function ‘void TestLauncher::perform_testing(std::vector<boost::shared_ptr<SampleAbundances> >&)’:
    differential.cpp:112:31: warning: unused variable ‘s2’ [-Wunused-variable]
    differential.cpp: In function ‘void sample_abundance_worker(const string&, SampleAbundances&, HitBundle*, bool, bool)’:
    differential.cpp:1073:40: warning: comparison between signed and unsigned integer expressions [-Wsign-compare]
    make[2]: *** [differential.o] Error 1
    make[2]: Leaving directory `/home/matthew/cufflinks-1.3.0/src'
    make[1]: *** [all-recursive] Error 1
    make[1]: Leaving directory `/home/matthew/cufflinks-1.3.0'
    Any ideas about this?

  • #2
    foreach fix

    The error is caused by the re-define of foreach in common.h:

    #define foreach BOOST_FOREACH

    You can run a bash script to change all the foreach to for_each as:

    for x in *.cpp *.h; do sed 's/foreach/for_each/' $x > x; mv x $x; done

    and manually change back the #include <boost/foreach.hpp> in common.h.

    Comment


    • #3
      Ah, thanks. Should have updated the thread-- also can get around this issue by using a different version of Boost, as the error seems to be specific to Boost 1.48.0.

      Comment


      • #4
        error: invalid conversion from ‘const char*’ to ‘char*’

        Dear All,

        I want to use cufflinks to analyze RNA-seq Data. Therefore I first installed Boost_1_48_0.tar.gz and built it with this code:

        tar -zxf boost_1_48_0.tar.gz
        cd boost_1_48_0
        ./bootstrap.sh
        ./b2
        ./bjam --prefix-/home/lisanne/Downloads/boost toolset=gcc link=static runtime-link=static stage install

        It seems like the correct way for building. After the installation of boots, i installed cufflinks and buit it with this code:

        tar -zxf cufflinks-0.7.0.tar.gz
        cd cufflinks-0.7.0
        ./configure --with-boost=/home/lisanne/Downloads/boost
        make

        The last "make" command gives the following error:

        make all-recursive
        make[1]: Entering directory `/home/lisanne/Downloads/cufflinks-0.7.0'
        Making all in src
        make[2]: Entering directory `/home/lisanne/Downloads/cufflinks-0.7.0/src'
        g++ -DHAVE_CONFIG_H -I. -I.. -I../src -Wall -Wno-strict-aliasing -g -gdwarf-2 -m64 -O3 -DNDEBUG -pthread -I/home/lisanne/Downloads/boost/include -MT common.o -MD -MP -MF .deps/common.Tpo -c -o common.o common.cpp
        mv -f .deps/common.Tpo .deps/common.Po
        g++ -DHAVE_CONFIG_H -I. -I.. -I../src -Wall -Wno-strict-aliasing -g -gdwarf-2 -m64 -O3 -DNDEBUG -pthread -I/home/lisanne/Downloads/boost/include -MT assemble.o -MD -MP -MF .deps/assemble.Tpo -c -o assemble.o assemble.cpp
        assemble.cpp:37:41: fatal error: boost/vector_property_map.hpp: No such file or directory
        compilation terminated.
        make[2]: *** [assemble.o] Error 1
        make[2]: Leaving directory `/home/lisanne/Downloads/cufflinks-0.7.0/src'
        make[1]: *** [all-recursive] Error 1
        make[1]: Leaving directory `/home/lisanne/Downloads/cufflinks-0.7.0'
        make: *** [all] Error 2

        The file vector_property_map.hpp is not is the map boost, but in the map property_map. I changed the file assemble.cpp on line 37 from the boost/vector_property_map.hpp to boost/property_map.hpp. That solve this error, but by running the command again, there is another error in the file hits.cpp that i don't understand.

        make all-recursive
        make[1]: Entering directory `/home/lisanne/Downloads/cufflinks-0.7.0'
        Making all in src
        make[2]: Entering directory `/home/lisanne/Downloads/cufflinks-0.7.0/src'
        g++ -DHAVE_CONFIG_H -I. -I.. -I../src -Wall -Wno-strict-aliasing -g -gdwarf-2 -m64 -O3 -DNDEBUG -pthread -I/home/lisanne/Downloads/boost/include -MT hits.o -MD -MP -MF .deps/hits.Tpo -c -o hits.o hits.cpp
        hits.cpp: In member function ‘virtual bool SAMHitFactory::get_hit_from_buf(const char*, ReadHit&, bool, char*, char*)’:
        hits.cpp:262:32: error: invalid conversion from ‘const char*’ to ‘char*’
        hits.cpp:270:33: error: invalid conversion from ‘const char*’ to ‘char*’
        make[2]: *** [hits.o] Error 1
        make[2]: Leaving directory `/home/lisanne/Downloads/cufflinks-0.7.0/src'
        make[1]: *** [all-recursive] Error 1
        make[1]: Leaving directory `/home/lisanne/Downloads/cufflinks-0.7.0'
        make: *** [all] Error 2

        and this is the code in the hits.cpp file where it is all about:

        // Copy the tag out of the name field before we might wipe it out
        char* pipe = strrchr(name, '|');
        if (pipe)
        {
        if (name_tags)
        strcpy(name_tags, pipe);
        *pipe = 0;
        }
        // Stripping the slash and number following it gives the insert name
        char* slash = strrchr(name, '/');
        if (strip_slash && slash)
        *slash = 0;

        Can anyone help me with this kind of error? Many thanks!

        Comment


        • #5
          Can I ask why you are using such an old version of Cufflinks? Using a more recent version might solve your issue alone-- I will tell you however, then Boost 1.48.0 may be problematic

          See https://svn.boost.org/trac/boost/ticket/6131

          Comment


          • #6
            You are right peromhc, it is an very old version. I don't see that when i downloaded cufflinks. By downloading cufflinks 1.3 I create the same error as you before. How did you solve that?

            Thanks!

            Comment


            • #7
              try another version of boost-- for instance Boost 1.45.0

              Comment


              • #8
                Thanks peromhc, I downloaded boost-1.44.0 and that works for me!

                Comment


                • #9
                  Originally posted by lib View Post
                  The error is caused by the re-define of foreach in common.h:

                  #define foreach BOOST_FOREACH

                  You can run a bash script to change all the foreach to for_each as:

                  for x in *.cpp *.h; do sed 's/foreach/for_each/' $x > x; mv x $x; done

                  and manually change back the #include <boost/foreach.hpp> in common.h.

                  I did this but there happens to be one more error:

                  Code:
                  make  all-recursive
                  make[1]: Entering directory `/media/sda8/bharat/genomes/cufflinks-2.0.2'
                  Making all in src
                  make[2]: Entering directory `/media/sda8/bharat/genomes/cufflinks-2.0.2/src'
                  g++  -Wall -Wno-strict-aliasing -g -gdwarf-2 -Wunused -Wuninitialized -m64 -O3  -DNDEBUG  -pthread -I/usr/local/include -I/usr/local/include    -o cufflinks  -L/usr/local/lib -L/usr/local/lib  cufflinks.o libcufflinks.a libgc.a -lboost_thread -lbam  -lz
                  cufflinks.o: In function `thread_exception':
                  /usr/local/include/boost/thread/exceptions.hpp:49: undefined reference to `boost::system::system_category()'
                  cufflinks.o: In function `__static_initialization_and_destruction_0':
                  /usr/local/include/boost/system/error_code.hpp:214: undefined reference to `boost::system::generic_category()'
                  /usr/local/include/boost/system/error_code.hpp:215: undefined reference to `boost::system::generic_category()'
                  /usr/local/include/boost/system/error_code.hpp:216: undefined reference to `boost::system::system_category()'
                  libcufflinks.a(bundles.o): In function `thread_exception':
                  /usr/local/include/boost/thread/exceptions.hpp:49: undefined reference to `boost::system::system_category()'
                  /usr/local/include/boost/thread/exceptions.hpp:49: undefined reference to `boost::system::system_category()'
                  libcufflinks.a(bundles.o): In function `__static_initialization_and_destruction_0':
                  /usr/local/include/boost/system/error_code.hpp:214: undefined reference to `boost::system::generic_category()'
                  /usr/local/include/boost/system/error_code.hpp:215: undefined reference to `boost::system::generic_category()'
                  /usr/local/include/boost/system/error_code.hpp:216: undefined reference to `boost::system::system_category()'
                  /usr/local/lib/libboost_thread.a(thread.o): In function `boost::condition_error::condition_error(int, char const*)':
                  thread.cpp:(.text._ZN5boost15condition_errorC2EiPKc[_ZN5boost15condition_errorC5EiPKc]+0x21): undefined reference to `boost::system::system_category()'
                  /usr/local/lib/libboost_thread.a(thread.o): In function `boost::thread_resource_error::thread_resource_error(int, char const*)':
                  thread.cpp:(.text._ZN5boost21thread_resource_errorC2EiPKc[_ZN5boost21thread_resource_errorC5EiPKc]+0x21): undefined reference to `boost::system::system_category()'
                  libcufflinks.a(clustering.o): In function `__static_initialization_and_destruction_0':
                  /usr/local/include/boost/system/error_code.hpp:214: undefined reference to `boost::system::generic_category()'
                  /usr/local/include/boost/system/error_code.hpp:215: undefined reference to `boost::system::generic_category()'
                  /usr/local/include/boost/system/error_code.hpp:216: undefined reference to `boost::system::system_category()'
                  libcufflinks.a(common.o): In function `__static_initialization_and_destruction_0':
                  /usr/local/include/boost/system/error_code.hpp:214: undefined reference to `boost::system::generic_category()'
                  /usr/local/include/boost/system/error_code.hpp:215: undefined reference to `boost::system::generic_category()'
                  /usr/local/include/boost/system/error_code.hpp:216: undefined reference to `boost::system::system_category()'
                  libcufflinks.a(assemble.o): In function `__static_initialization_and_destruction_0':
                  /usr/local/include/boost/system/error_code.hpp:214: undefined reference to `boost::system::generic_category()'
                  /usr/local/include/boost/system/error_code.hpp:215: undefined reference to `boost::system::generic_category()'
                  /usr/local/include/boost/system/error_code.hpp:216: undefined reference to `boost::system::system_category()'
                  libcufflinks.a(abundances.o): In function `__static_initialization_and_destruction_0':
                  /usr/local/include/boost/system/error_code.hpp:214: undefined reference to `boost::system::generic_category()'
                  /usr/local/include/boost/system/error_code.hpp:215: undefined reference to `boost::system::generic_category()'
                  /usr/local/include/boost/system/error_code.hpp:216: undefined reference to `boost::system::system_category()'
                  libcufflinks.a(scaffolds.o): In function `__static_initialization_and_destruction_0':
                  /usr/local/include/boost/system/error_code.hpp:214: undefined reference to `boost::system::generic_category()'
                  /usr/local/include/boost/system/error_code.hpp:215: undefined reference to `boost::system::generic_category()'
                  /usr/local/include/boost/system/error_code.hpp:216: undefined reference to `boost::system::system_category()'
                  libcufflinks.a(hits.o): In function `__static_initialization_and_destruction_0':
                  /usr/local/include/boost/system/error_code.hpp:214: undefined reference to `boost::system::generic_category()'
                  /usr/local/include/boost/system/error_code.hpp:215: undefined reference to `boost::system::generic_category()'
                  /usr/local/include/boost/system/error_code.hpp:216: undefined reference to `boost::system::system_category()'
                  libcufflinks.a(genes.o): In function `__static_initialization_and_destruction_0':
                  /usr/local/include/boost/system/error_code.hpp:214: undefined reference to `boost::system::generic_category()'
                  /usr/local/include/boost/system/error_code.hpp:215: undefined reference to `boost::system::generic_category()'
                  /usr/local/include/boost/system/error_code.hpp:216: undefined reference to `boost::system::system_category()'
                  libcufflinks.a(filters.o): In function `__static_initialization_and_destruction_0':
                  /usr/local/include/boost/system/error_code.hpp:214: undefined reference to `boost::system::generic_category()'
                  /usr/local/include/boost/system/error_code.hpp:215: undefined reference to `boost::system::generic_category()'
                  /usr/local/include/boost/system/error_code.hpp:216: undefined reference to `boost::system::system_category()'
                  libcufflinks.a(scaffold_graph.o): In function `__static_initialization_and_destruction_0':
                  /usr/local/include/boost/system/error_code.hpp:214: undefined reference to `boost::system::generic_category()'
                  /usr/local/include/boost/system/error_code.hpp:215: undefined reference to `boost::system::generic_category()'
                  /usr/local/include/boost/system/error_code.hpp:216: undefined reference to `boost::system::system_category()'
                  libcufflinks.a(matching_merge.o): In function `__static_initialization_and_destruction_0':
                  /usr/local/include/boost/system/error_code.hpp:214: undefined reference to `boost::system::generic_category()'
                  /usr/local/include/boost/system/error_code.hpp:215: undefined reference to `boost::system::generic_category()'
                  /usr/local/include/boost/system/error_code.hpp:216: undefined reference to `boost::system::system_category()'
                  libcufflinks.a(graph_optimize.o): In function `__static_initialization_and_destruction_0':
                  /usr/local/include/boost/system/error_code.hpp:214: undefined reference to `boost::system::generic_category()'
                  /usr/local/include/boost/system/error_code.hpp:215: undefined reference to `boost::system::generic_category()'
                  /usr/local/include/boost/system/error_code.hpp:216: undefined reference to `boost::system::system_category()'
                  libcufflinks.a(biascorrection.o): In function `__static_initialization_and_destruction_0':
                  /usr/local/include/boost/system/error_code.hpp:214: undefined reference to `boost::system::generic_category()'
                  /usr/local/include/boost/system/error_code.hpp:215: undefined reference to `boost::system::generic_category()'
                  /usr/local/include/boost/system/error_code.hpp:216: undefined reference to `boost::system::system_category()'
                  libcufflinks.a(sampling.o): In function `__static_initialization_and_destruction_0':
                  /usr/local/include/boost/system/error_code.hpp:214: undefined reference to `boost::system::generic_category()'
                  /usr/local/include/boost/system/error_code.hpp:215: undefined reference to `boost::system::generic_category()'
                  /usr/local/include/boost/system/error_code.hpp:216: undefined reference to `boost::system::system_category()'
                  libcufflinks.a(replicates.o): In function `__static_initialization_and_destruction_0':
                  /usr/local/include/boost/system/error_code.hpp:214: undefined reference to `boost::system::generic_category()'
                  /usr/local/include/boost/system/error_code.hpp:215: undefined reference to `boost::system::generic_category()'
                  /usr/local/include/boost/system/error_code.hpp:216: undefined reference to `boost::system::system_category()'
                  libcufflinks.a(multireads.o): In function `thread_exception':
                  /usr/local/include/boost/thread/exceptions.hpp:49: undefined reference to `boost::system::system_category()'
                  libcufflinks.a(multireads.o): In function `__static_initialization_and_destruction_0':
                  /usr/local/include/boost/system/error_code.hpp:214: undefined reference to `boost::system::generic_category()'
                  /usr/local/include/boost/system/error_code.hpp:215: undefined reference to `boost::system::generic_category()'
                  /usr/local/include/boost/system/error_code.hpp:216: undefined reference to `boost::system::system_category()'
                  collect2: ld returned 1 exit status
                  make[2]: *** [cufflinks] Error 1
                  make[2]: Leaving directory `/media/sda8/bharat/genomes/cufflinks-2.0.2/src'
                  make[1]: *** [all-recursive] Error 1
                  make[1]: Leaving directory `/media/sda8/bharat/genomes/cufflinks-2.0.2'
                  make: *** [all] Error 2

                  i read elsewhere that boost system library needs to be added to ldflags.

                  i tried editing Makefile.am in cufflinks/src directory and also Makefile in Cufflinks directory:

                  I added "libboost_system.a" to cufflinks_LDADD > didnt work (in src/makefile.am)
                  I changed it to "$(BOOST_SYS_LIB) > didnt work either (in src/makefile.am after setting BOOST_SYS_LIB = -lboost_system in Makefile )
                  Changed it to "-lboost_system" > still doesnt work (in src/makefile.am)

                  I assume that this is a problem with linking the libraries but i am not sure how to edit the compiler command. Please help
                  Last edited by bharat_iyengar; 12-17-2012, 02:35 AM.

                  Comment


                  • #10
                    I got the very same error as user "peromhc". My solution was to "abuse" the --with-boost-thread config option to additionally add another boost library containing the missing references:

                    --with-boost-thread="-lboost_thread-gcc44-mt-1_53 -lboost_system-gcc44-mt-1_53"

                    Please note that I installed boost with gcc 4.4.6, --layout=versioned --threading=multi that's the reason for the "-gcc44-mt-1_53" suffix, which might be different on your machine.
                    I also had to apply the "foreach" renaming trick, described by user "lib"

                    Comment


                    • #11
                      cufflinks-2.0.2 install error

                      Hi,
                      My cufflinks version is 2.0.2 abd boost is 1.52.0 version.

                      installed error:
                      make[2]: *** [differential.o] Error 1
                      make[2]: Leaving directory `cufflinks-2.0.2/src'
                      make[1]: *** [all-recursive] Error 1
                      make[1]: Leaving directory `cufflinks-2.0.2'
                      make: *** [all] Error 2

                      boost-1.52.0 -> 1.47.0, there was the same problem.

                      Can you help me ?

                      Thanks!

                      Comment


                      • #12
                        Easiest thing to do would be to get the executables directly. Boost 1.52 has some problem linking with cufflinks.

                        Comment

                        Latest Articles

                        Collapse

                        • seqadmin
                          Current Approaches to Protein Sequencing
                          by seqadmin


                          Proteins are often described as the workhorses of the cell, and identifying their sequences is key to understanding their role in biological processes and disease. Currently, the most common technique used to determine protein sequences is mass spectrometry. While still a valuable tool, mass spectrometry faces several limitations and requires a highly experienced scientist familiar with the equipment to operate it. Additionally, other proteomic methods, like affinity assays, are constrained...
                          04-04-2024, 04:25 PM
                        • seqadmin
                          Strategies for Sequencing Challenging Samples
                          by seqadmin


                          Despite advancements in sequencing platforms and related sample preparation technologies, certain sample types continue to present significant challenges that can compromise sequencing results. Pedro Echave, Senior Manager of the Global Business Segment at Revvity, explained that the success of a sequencing experiment ultimately depends on the amount and integrity of the nucleic acid template (RNA or DNA) obtained from a sample. “The better the quality of the nucleic acid isolated...
                          03-22-2024, 06:39 AM

                        ad_right_rmr

                        Collapse

                        News

                        Collapse

                        Topics Statistics Last Post
                        Started by seqadmin, 04-11-2024, 12:08 PM
                        0 responses
                        18 views
                        0 likes
                        Last Post seqadmin  
                        Started by seqadmin, 04-10-2024, 10:19 PM
                        0 responses
                        22 views
                        0 likes
                        Last Post seqadmin  
                        Started by seqadmin, 04-10-2024, 09:21 AM
                        0 responses
                        17 views
                        0 likes
                        Last Post seqadmin  
                        Started by seqadmin, 04-04-2024, 09:00 AM
                        0 responses
                        48 views
                        0 likes
                        Last Post seqadmin  
                        Working...
                        X