What does /usr/lib/rpm/check-buildroot do? - c++

I am building a RPM package for a c++ application. The compilation and installation succeed. Then the the following command fails /usr/lib/rpm/check-buildroot with the following error:
Found '/user/dfsdf/rpmbuild/BUILDROOT/vendor-xerces-c-3.1.3-3.1.3-1.x86_64' in installed files; aborting
I haven't found any documentation about this command. What does check-buildroot does?

Here is a pointer to a copy of the script. Because it is considered an "internal" part of rpmbuild (in /usr/lib/rpm, rather than /usr/bin), there is no manual page for it.
However, it is known to people who troubleshoot problems building rpms.
The script checks for a common problem: when building an rpm, your package compiles and installs into a BUILDROOT directory. If it is done properly, no trace of that directory name will remain in the final package. Occurrences of the actual installation directory, e.g., /usr/bin, /usr/lib, etc., are okay.
Further reading:
rpmdevtools-5.3-1.el4 RPM for noarch describes the rpmdevtools and gives its changelog.
pk's Tech Page discusses a change that a developer made based on the check-buildroot message.
check-buildroot failure is another example where it was used
How do I safely remove a path string from a compiled library without corrupting the library? illustrates the real problem: getting good advice.

Related

differences between sdist and hackage build test

I have problems with packages uploaded to hackage to pass the build test. The pacakges compile fine with cabal (and with stack) and I can upload the sdist files to hackage.
I found some confusing error messages, likely related to "single character directories".
Once cleaned this, upload completes but the packages fail the check during the build. Most of the issues seem related to the inclusion of C sources and C headers (see cabal build error `gcc` failed: connot find `#include`).
What are the differences in the requirements for a package to build on hackage? Could sdist check these requirements - to avoid a plethora of futile package versions on hackage, which can never disappear. Or, is there a way to check a package whether it builds on hackage without publishing (i.e. make it permanent)?
Can somebody point me to a comprehensive explanations of the requirements of hackage uploads?

How to install sml/nj from source?

I can success install sml/nj as the doc said:http://smlnj.org/dist/working/110.99/install.html
but how to install from source,the way the doc said let me download the config.tgz,than the script install.sh can download and compile other files from the network
but if I want to edit the source code,and test the result,this way seems can't work
eg:I edit the file compile.sml,and want to see the result,so I neet to recompiler the compiler,but install.sh will download the compiler.tgz from internet,not the file I change
so Hot to install sml/nj from source?Thanks!
smlnj.org does not have an SSL certificate, the release-note README links are broken, the GitHub repo doesn't have a top-level README. Scrolling around a bit on their website, there's a link to an installation manual:
Installing SML/NJ on UNIX
It mentions the install.sh that presumably you have tried to run. Running this seems to overcome many of the complications associated with figuring out how the source code is tied together. Unfortunately, it fails on my machine; I don't know if this is because I run MacOS and cc defaults to clang, or what.
install.sh will download the compiler.tgz from internet,not the file I change
I don't experience that re-running config/install.sh will re-download the source code, but I also don't experience this command succeeding. If you notice, there is a file called config/srcarchiveurl that contains the variable SRCARCHIVEURL. When you grep around for that, it occurs in config/download.sh and config/unpack -- the latter, unpack, is a utility used throughout install.sh to ensure that a given sub-directory is present. It is supposed to check that a file was already downloaded on lines 205--209.
Every time I've wanted to install SML/NJ from scratch, I have basically given up and gone with Poly/ML, Moscow ML, MLKit, or MLton, simply because they don't require so much to install. SML/NJ is not a modern piece of software in the way that it is distributed. Poly/ML and Moscow ML are somewhat minimalist (they don't have MLB support), but easier to modify; MLton doesn't have a REPL, but is otherwise manageable to install.

Tell the binary where to look for BUILT library

I have a binary that requires glibc-2.18 installed, but the newest I can get using yum is 2.17. What I would want to accomplish is to test my binary with only a built glibc-2.18 (not installed, from what I've read it's a bad idea to do it manually). I read multiple articles regarding the LD_LIBRARY_PATH and how to set it, but most of them were either incomplete for me to follow through or I get an error, such as sed: relocation error.
As for glibc and how I built it: downloaded the version, extracted, made /build folder inside the extracted folder, and from it, ran ../configure --prefix=/usr. Finally, in the same folder, make.
Could someone provide step-by-step instructions on how to run my binary with the built library ?
What I would want to accomplish is to test my binary with only a built glibc-2.18 (not installed, from what I've read it's a bad idea to do it manually).
This is what GLIBC itself does when you run make check:
/build/elf/ld.so --library-path /build:/build/elf:/build/math:/build/nptl:... /path/to/binary
Explanation: run ld.so from /build and ask it to load other parts of GLIBC from the /build and its subdirectories.
This works for most programs, but there is a certain class of programs that wouldn't work when invoked this way. One example in the latter category is a program that execve()s itself.
You need to link the binary with -Wl,-rpath, as explained in the glibc testing instructions. So if glibc 2.18 is installed under /opt/gnu/glibc-2.18, the linker invocation could look like this:
gcc -Wl,--dynamic-linker=/opt/gnu/glibc-2.18/lib64/ld-2.18.so \
-Wl,-rpath=/opt/gnu/glibc-2.18/lib64 -L/opt/gnu/glibc-2.18/lib64

Installing GMP on Windows with cygwin

I am new to C++ and I have to handle large integers, so I have to install GMP through Cygwin.
Any documentation I can find on installing this already assumes that you know what you are talking about, and I really don't.
Anyway, I got the right .tar or whatever, extracted it properly, and now any website I see says to run ./configure --prefix=${gmp_install}...
What in the world is gmp_install? And what directory do I run configure from? Huh? I can run it from my little Cygwin terminal, but it just says no such file.
Next, I am supposed to type make. From where?
Help...
Welcome to StackOverflow (SO).
The source directory of GMP should probably contain the file called configure. This is the script which you have to execute to "configure" the build system in your environment. It means that during configuration Autotools (the build system which is used to build GMP) will gather information about your environment and generate the appropriate makefile. Gathering information includes things like: understanding that you are on Windows, understanding that you are using Cygwin, understanding that your compiler is GCC and its version is x.y.z, and etc. All these steps are important for successful build.
You can specify a lot of different options to this configure script to tweak the configuration process. In your case, you specify the prefix option which determines the installation directory, i.e. the directory where you want the built and ready-to-use GMP distribution to reside. For example:
./configure --prefix=/D/Libraries/GMP
will configure the build system to install the GMP binaries to D:\Libraries\GMP directory.
Assuming that the GMP source directory (the one you extracted from *.tar) is located at say D:\Users\Me\Downloads\GMP, in order to build and install GMP you should do the following:
cd /D/Users/Me/Downloads/GMP
./configure --prefix=/D/Libraries/GMP
make
make install
NOTE: The make command will actually execute the makefile (which was generated by configure script) I've mentioned earlier. This file describes the process of building and installing GMP on your system.
NOTE: ${gmp_install} is nothing, but an environment variable. For instance, you could do:
export gmp_install=/D/Libraries/GMP
./configure --prefix=${gmp_install}
this can be useful, for example, when you have to use the same path in multiple places, and don't want to type it everytime. There are other cases, when this is useful, but for that you'll have to learn more about environment variables, what they are for, and Bash scripting in general. However, all this goes far beyond the answer on your question.
You'll have to spend quite some time to understand all these things and how they fit together, and you'd probably have to ask more questions here on SO as understanding all that stuff for a beginner alone might be very challenging.

Install gcc on linux with no root privilege

I have access to computer in a public library and I want to try out some C++ and maybe other code. Problem is that there is no g++ installed and I can't install it using packages because I have no root access. Is there a "smart" way to make a full environment for programming in a home folder?
I have gcc installed (I can compile C code). Also, I have a home folder that is consistent. I don't know where to find precompiled g++, I found only source but I don't know what to do with it. I tried to ask them to install this but it didn't work :)
If you want to install it as a local user
GNU GSRC provides an easy way to do so
Link: http://www.gnu.org/software/gsrc/
After configuration, simply specify the following commands:
cd gsrc
make -C pkg/gnu/gcc
make -C pkg/gnu/gcc install
The second step could also be changed to speed up for an N-core system:
make -C pkg/gnu/gcc MAKE_ARGS_PARALLEL="-jN"
You can run the configure script with the --prefix parameter: ../gcc-4.5.0/configure --prefix=/home/foo/bar. Since it is very likely that the c++ standard library is different then the one on your system, you have to set export LD_LIBRARY_PATH=/home/foo/bar/lib before you can start a program compiled by this compiler.
Once, a long time ago (1992 or so), I went through something similar to this when I bought a SCO system with no development environment. Bootstrapping it up to having a full development environment was a gigantic pain, and not at all easy. Having library header files or gcc on a system would make your job a whole lot easier.
It depends a lot on just how obnoxious the library has been about what kinds of things are installed. If there is no gcc there, your job becomes a bit harder. If there are no header files for glibc there, your job is a LOT harder.
Also, do you get an account on the system so you have a home folder that's consistent from login to login?
If you have no gcc there, you need to find a pre-compiled binary of gcc/g++ and install it somewhere. If you have no header files there, you need to find copies of those and put them on the system.
There is no 'standard' way of installing gcc in your home folder though. All of the solutions are going to have some manner of hand-rolling involved.
Have you asked the librarians if they can change what's installed because you want to learn a bit of programming and only have access to their computers to do it with? That might well be the easiest solution.
From your comment it seems that you do have gcc and if you can compile C code, you have the library header files. So now it's a matter of actually compiling your own version of g++. You could probably find a way to entice the package manager on the system into installing a binary package somewhere other than in a system folder. I think this solution is less fun than compiling your own, and I think there may also be possible subtle problems as that installed package may be expecting to find things in particular places and not finding them there.
First thing to do is to make sure you've downloaded the right source for the gcc package. The place to find that is the GNU United States mirror page. You want to find the gcc-4.5.0.tar.bz2 or gcc-4.5.0.tar.gz file on the mirror site you choose. It will likely be in a gcc directory, and a gcc-4.5.0 sub-folder.
After you have that downloaded, you should untar it. In general you shouldn't build gcc in the folder you untar it into. So create another sibling folder that you actually want to build it in labeled gcc-build. Then the command you want is ../gcc-4.5.0/configure --prefix=$HOME/.local --enable-languages='c c++'.
gcc does require some other packages be installed in order to be able to compile itself. You can use the same --prefix line for these packages to install them in the same place. The gcc website has a list of pre-requisite packages.
$HOME/.local is sort of the standard accepted place for per-user installs of things.
If you have fakeroot, you can use that to set ~/some-path as root to install the packages from. Alternatively, you can setup a chroot environment to do the same.
Given this, you can then use dpkg -i package.deb to install the gcc package(s) on your system. You will need to download and install each package individually (e.g. from the debian website) -- at least binutils, glibc, linux-headers and gcc.
If you are on another system, you will need to get the right packages for that system and install them using the corresponding package manager.