tomassedovic / tcod-rs

Rust bindings for libtcod 1.6.3 (the Doryen library/roguelike toolkit)
Do What The F*ck You Want To Public License
229 stars 45 forks source link

Can't override build script to use existing libtcod #299

Open ThibaultLemaire opened 4 years ago

ThibaultLemaire commented 4 years ago

I've tried to use the libtcod provided by my distro,

[target.x86_64-unknown-linux-gnu.tcod]
rustc-flags = "-L $LIBTCOD -l tcod"

but unfortunately cargo gives me the following warning

warning: unused manifest key: target.x86_64-unknown-linux-gnu.tcod

and compilation fails when pkg-config is not found.

tomassedovic commented 4 years ago

Judging by the warning, it looks like you put it in Cargo.toml. The overrides should go to .cargo/config instead.

I'm not able to actually test any of this now, but FWIW when I was playing with local overrides in a different project, I used these options instead of rustc-flags:

[target.x86_64-unknown-linux-gnu.SDL2]
rustc-link-search = ["lib/x86_64-linux-gnu"]
rustc-link-lib = ["SDL2"]

(and I had a lib/x86_64-linux-gnu/ directory in the root of my repo with all the so files)

So try something like this:

[target.x86_64-unknown-linux-gnu.tcod]
rustc-link-search = ["/usr/lib/tcod"]
rustc-link-lib = ["tcod"]

Putting in the absolute path to the directory where the libtcod.so* files are. I'm not sure what the path resolution rules are so I'd start with absolute ones and once that works switch over to whatever you actually want.

ThibaultLemaire commented 4 years ago

Thank you, I'm still learning about cargo and didn't know about its configuration (for the record, the Rust Book chapter on configuration).

I can also confirm successful compilation with rustc-link-search and rustc-link-lib instead of rustc-flags. I could update the .cargo/config if you'd like.

Also I'm actually trying to compile on NixOS, which means the path to the library changes with every update so I'd like to rely on an environment variable but I don't know how to do that with cargo.

ThibaultLemaire commented 4 years ago

I see rust-sdl2 uses pkg-config to figure out where SDL2 is, maybe we could do the same for libtcod?

tomassedovic commented 4 years ago

That's great to hear!

Have you tried with rust-flags in the right .cargo/config? I'm definitely open to updating it (honestly, I forgot we shipped a sample) but your original issue was probably due to using the wrong file. I just suggested the other options as something that did work for me in the past.

tcod_sys already uses pkg-config so adding an option to do it for libtcod sounds like a great idea to me!

https://github.com/tomassedovic/tcod-rs/blob/master/tcod_sys/build.rs

I'll be happy to check the PR if you put it up (though it may take some time, sorry about that). I won't have the time to write it myself unfortunately :-(.

tomassedovic commented 4 years ago

(we should still support building libtcod as a fallback, but yeah if pkg-config finds it, let's just use that instead)

ThibaultLemaire commented 4 years ago

Have you tried with rust-flags in the right .cargo/config?

Not exactly, but I bet it would work as well.

I just suggested the other options as something that did work for me in the past

I know, but I think using link-search and link-lib is cleaner (since it's also what's recommended in the rust doc).

tcod_sys already uses pkg-config so adding an option to do it for libtcod sounds like a great idea to me!

Great, I'll open a new issue and start working on a PR.

we should still support building libtcod as a fallback

Ofc, that was a given.

So, if I manage to make the build detect libtcod through pgk-config, should we remove the manual override section of the README and the config example or would they still have some use ? (which then means I should update them)

ThibaultLemaire commented 4 years ago

(Btw, just confirmed working with rustc-flags)

ThibaultLemaire commented 4 years ago

Actually, the libtcod package on NixOS is missing the pgkconfig declaration so pkg-config won't help me for what I'm trying to accomplish there...

I was thinking on maybe reading an env var in the build script to allow easy override? (dynamically writing the path to .cargo/config is not something I want to do)