Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Target directory in output folder #112

Open
ghost opened this issue Nov 10, 2020 · 11 comments
Open

Target directory in output folder #112

ghost opened this issue Nov 10, 2020 · 11 comments

Comments

@ghost
Copy link

ghost commented Nov 10, 2020

Is it possible to rather than the header files, libraries, and linker to be placed rather than into the target directory in sysroot to the root output directory.

So from this...

output
    |
    + - bin
    + - lib
    + - ...
    + - x86_64-linux-musl
        + - bin
        + - lib
        + - ...

To this...

output
    |
    + - bin
    + - lib
    + - ...

I've tried setting GCC's --with-build-sysroot=/ however the sysroot dir is still present. Is there a way to forego this?

Thank you in advance.

@richfelker
Copy link
Owner

You would use --with-sysroot not --with-build-sysroot for this, but I don't have any idea if it will work - mcm is not setup to be installed like that, and it's rather going against logical organization, since the top-level output dir is binaries/libraries/etc. for the host (the system you run the cross toolchain on) and the $target-named directory under that is binaries/libraries/etc. for the target (the system you're cross-compiling for).

@ghost
Copy link
Author

ghost commented Nov 11, 2020

I attempted to compile with --with-sysroot however to no avail; the target directory was still present in the output directory. Is there any other option which can possibly build the toolchain in the way that I've described?

Also, why is there no compiler in the target directory, e.g. output/x86_64-linux-musl/bin/cc? Is there an option to place the compiler binary into the target bin directory?

@richfelker
Copy link
Owner

I attempted to compile with --with-sysroot however to no avail; the target directory was still present in the output directory. Is there any other option which can possibly build the toolchain in the way that I've described?

You'd need to hack this into the makefile since, as written, it sets the sysroot itself. But I want to reiterate that this is not a good idea. It's gratuitously breaking the intended split between host and target files and unless I'm missing something you don't have any technical reason to do this, just an aesthetic one that seems to be based on misunderstanding the purpose of the existing layout.

Also, why is there no compiler in the target directory, e.g. output/x86_64-linux-musl/bin/cc?

Because building a cross compiler and cross-compiling a native compiler for the target are two completely different tasks, and doing them both when you don't need the latter would double the time and space required to build.

@ghost
Copy link
Author

ghost commented Nov 11, 2020

Because building a cross compiler and cross-compiling a native compiler for the target are two completely different tasks, and doing them both when you don't need the latter would double the time and space required to build.

That's fair. Is there not a NATIVE option I can set in config.mak? I don't mind doing a second pass to build a native compiler.

@richfelker
Copy link
Owner

Yes, mcm can also cross-compile native compilers for your target, and in this case they don't have the cross directory structure you're unhappy with. You need to already have the cross compiler in your PATH, then run mcm with NATIVE=y, and it should just work.

@ghost
Copy link
Author

ghost commented Nov 11, 2020

I set the compuler to my path and set NATIVE=1 in COMMON_CONFIG however my output directory still has the x86_64-linux-musl directory. Is this the intended result for building a native compiler? When looking into the bin dir in the x86_64... dir I can't seem to find the compiler.

Here's the config.mak I'm using:

TARGET = x86_64-linux-musl

OUTPUT = /home/ben/musl-root

COMMON_CONFIG += CC="/home/ben/musl-cross-make/output/bin/x86_64-linux-musl-gcc -static --static"
COMMON_CONFIG += CPP="/home/ben/musl-cross-make/output/bin/x86_64-linux-musl-g++ -E -static --static"
COMMON_CONFIG += CXX="/home/ben/musl-cross-make/output/bin/x86_64-linux-musl-gcc -static --static"
COMMON_CONFIG += LD=/home/ben/musl-cross-make/output/bin/x86_64-linux-musl-ld
COMMON_CONFIG += AR=/home/ben/musl-cross-make/output/bin/x86_64-linux-musl-ar
COMMON_CONFIG += NM=/home/ben/musl-cross-make/output/bin/x86_64-linux-musl-nm
COMMON_CONFIG += OBJCOPY=/home/ben/musl-cross-make/output/bin/x86_64-linux-musl-objcopy
COMMON_CONFIG += OBJDUMP=/home/ben/musl-cross-make/output/bin/x86_64-linux-musl-objdump
COMMON_CONFIG += RANLIB=/home/ben/musl-cross-make/output/bin/x86_64-linux-musl-ranlib
COMMON_CONFIG += READELF=/home/ben/musl-cross-make/output/bin/x86_64-linux-musl-readelf
COMMON_CONFIG += SIZE=/home/ben/musl-cross-make/output/bin/x86_64-linux-musl-size
COMMON_CONFIG += STRINGS=/home/ben/musl-cross-make/output/bin/x86_64-linux-musl-strings
COMMON_CONFIG += STRIP=/home/ben/musl-cross-make/output/bin/x86_64-linux-musl-strip
COMMON_CONFIG += NATIVE=1
COMMON_CONFIG += --disable-wrapper --disable-multilib --disable-libssp --disable-libquadmath --disable-libgomp --disable-l
ibvtv --disable-plugin --disable-shared --with-sysroot=/ --with-build-sysroot=/
COMMON_CONFIG += CFLAGS="-g0 -Os" CXXFLAGS="-g0 -Os" LDFLAGS="-s"

@richfelker
Copy link
Owner

NATIVE=y is not part of COMMON_CONFIG. The latter is a variable containing gcc/binutils configure options. It's its own make variable. Just add a line NATIVE=y in config.mak or put it on the make command line.

@ghost
Copy link
Author

ghost commented Nov 11, 2020

Upon adding NATIVE=y to config.mak I receive the following error:

make[1]: Entering directory '/home/ben/musl-cross-make/build/x86_64-linux-musl/x86_64-linux-musl'
mkdir -p obj_musl
ln -sf ../../../musl-1.2.1 src_musl
cd obj_musl && ../src_musl/configure  --prefix= --host=x86_64-linux-musl
checking for C compiler...
../src_musl/configure: cannot find a C compiler
make[1]: *** [Makefile:226: obj_musl/.lc_configured] Error 1
make[1]: Leaving directory '/home/ben/musl-cross-make/build/x86_64-linux-musl/x86_64-linux-musl'
make: *** [Makefile:182: all] Error 2

I've checked to make sure that the compiler exists in the output directory, pointed to in the config.mak I've pasted in my previous message.

EDIT: after setting path properly I was able to compile

@ghost
Copy link
Author

ghost commented Nov 12, 2020

After some playing around with the environment I was able to compile a native Musl GCC compiler. Thanks, @richfelker!

@clark800
Copy link

It would be really helpful to have a section in the readme on how to build a native compiler. Also it would be nice if it was scripted so it could be built in a single run of make.

@SomethingGeneric
Copy link

would anyone be willing to share an implementation like our now-departed friend who started this thread>

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
None yet
Projects
None yet
Development

No branches or pull requests

3 participants