Closed 5schatten closed 4 years ago
I pushed a trial as feature/pkgconfig branch. New CMake file in this trial will generate a pc file for each target. Also, you can specify a representative target with PKG_CONFIG_REPRESENTATIVE_TARGET option to use with glew
name.
I'm not familiar with pkg-config. So, I don't guarantee it works correctly. Before merging it to master, Could you test it?
EDIT: it builds with -D ONLY_LIBS=ON
https://pastebin.com/8ateLtj6 but the path for the pkgconfig files is wrong:
Installing: /home/supervisedthinking/git/libreelec-rr/LibreELEC.tv/build.LibreELEC-Generic.x86_64-9.80-devel/.sysroot/glew-cmake.target/pkgconfig/glew_shared.pc
I guess you missed /usr/lib
as in:
Installing: /home/supervisedthinking/git/libreelec-rr/LibreELEC.tv/build.LibreELEC-Generic.x86_64-9.80-devel/.sysroot/glew-cmake.target/usr/lib/libglew.so.2.2.0
I guess this is the reason https://github.com/Perlmint/glew-cmake/blob/feature/pkgconfig/GeneratePkgConfig.cmake#L6 and you need to add something like https://git.codingcafe.org/Mirrors/google/glog/blob/5c576f78c49b28d89b23fbb1fc80f54c879ec02e/CMakeLists.txt#L511
I added this patch & it stores the .pc file in the correct directory:
--- a/GeneratePkgConfig.cmake
+++ b/GeneratePkgConfig.cmake
@@ -3,7 +3,7 @@
if(WIN32)
set(PKGCONFIG_INSTALL_DIR)
else()
- set(PKGCONFIG_INSTALL_DIR ${_glog_CMake_LIBDIR}/pkgconfig)
+ set(PKGCONFIG_INSTALL_DIR lib/pkgconfig)
endif()
if(pc_NAME)
set(name ${pc_NAME})
But your config generates a glew_shared.pc
which should probably be glew.pc
same as it's still libglew.so
which other programs & the linker will look for. And about the content:
prefix=/usr
exec_prefix=${prefix}
libdir=${prefix}/
includedir=${prefix}/include
Name: glew_shared
Description: The OpenGL Extension Wrangler library - shared, single context
Version: 2.2.0
Cflags: -I${includedir} -DGLEW_BUILD
Libs: -L${libdir} -llibglew_shared -lGL -lX11 -ldl -lXext
libdir=${prefix}/
should probably point to libdir=${prefix}/lib
because otherwhise it would look in /usr
for libs which is quite wrong. The Name:
should probably be Name: glew
too? https://github.com/Perlmint/glew-cmake/blob/master/glew.pc.in#L6
Maybe this could be helpful for you? This is the way how FluidSynth handles it:
https://github.com/FluidSynth/fluidsynth/blob/master/CMakeLists.txt#L734-L750
Thanks for detail comment! :+1:
I have a question.
Has Name
in pkg-config a special behaviour? If it is just an identifier - have no change in pkg-config behaviour, I think keeping them - 4 targets be built - different can be useful.
Also, I fixed you commented.
Here is a generated glew.pc with PKG_CONFIG_REPRESENTATIVE_TARGET=libglew_static
prefix=/usr/local
exec_prefix=${prefix}
libdir=${prefix}/lib
includedir=${prefix}/include
Name: glew
Description: The OpenGL Extension Wrangler library
Version: 2.2.0
Cflags: -I${includedir} -DGLEW_STATIC
Libs: -L${libdir} -llibglew.a -lGL -lX11 -ldl -lXext
According too https://people.freedesktop.org/~dbn/pkg-config-guide.html
Name: A human-readable name for the library or package. This does not affect usage of the pkg-config tool, which uses the name of the .pc file.
so I guess it's fine if you use a custom name too :+1:
I'll test it later then and see if I run into any issues.
EDIT: After compiling it installs:
Installing: /home/supervisedthinking/git/libreelec-rr/LibreELEC.tv/build.LibreELEC-Generic.x86_64-9.80-devel/.sysroot/glew-cmake.target/usr/lib/pkgconfig/glew_shared.pc
-- Installing: /home/supervisedthinking/git/libreelec-rr/LibreELEC.tv/build.LibreELEC-Generic.x86_64-9.80-devel/.sysroot/glew-cmake.target/usr/lib/pkgconfig/glew.pc
but I guess glew_shared.pc
is superflous because there is no libglew_shared.so
.
The generated glew.pc
contains this line:
Libs: -L${libdir} -llibglew.so -lGL -lX11 -ldl -lXext
it should not be -llibglew.so
but Libs: -L${libdir} -lglew -lGL -lX11 -ldl -lXext
after this change https://github.com/freedesktop/mesa-demos build fine.
Buildlog: https://pastebin.com/JS8QyLTM
When I don't use -D ONLY_LIBS=ON
then I end up with:
FAILED: bin/visualinfo
: && /home/supervisedthinking/git/libreelec-rr/LibreELEC.tv/build.LibreELEC-Generic.x86_64-9.80-devel/toolchain/bin/x86_64-libreelec-linux-gnu-gcc -march=x86-64 -m64 -mmmx -msse -msse2 -mfpmath=sse -fomit-frame-pointer -Wall -pipe -O2 -O3 -DNDEBUG -march=x86-64 -m64 -Wl,--as-needed -fuse-ld=gold -rdynamic CMakeFiles/visualinfo.dir/src/visualinfo.c.o -o bin/visualinfo -Wl,-rpath,/home/supervisedthinking/git/libreelec-rr/LibreELEC.tv/build.LibreELEC-Generic.x86_64-9.80-devel/glew-cmake-ba9e32c7fa5e7a7e38f51aad42ba3fe7de8364f8/.x86_64-libreelec-linux-gnu/lib: lib/libglew.so.2.2.0 -lGL -lX11 -ldl -lXext && :
CMakeFiles/visualinfo.dir/src/visualinfo.c.o:visualinfo.c:function main: error: undefined reference to 'gluGetString'
CMakeFiles/visualinfo.dir/src/visualinfo.c.o:visualinfo.c:function main: error: undefined reference to 'gluGetString'
collect2: error: ld returned 1 exit status
ninja: build stopped: subcommand failed.
So I guess it fails because of this:
#ifndef GLEW_NO_GLU
/* GLU extensions */
fprintf(file, "GLU version string: %s\n", gluGetString(GLU_VERSION));
fprintf(file, "GLU extensions (GLU_): \n");
PrintExtensions((const char*)gluGetString(GLU_EXTENSIONS));
#endif
https://github.com/Perlmint/glew-cmake/blob/feature/pkgconfig/src/visualinfo.c#L183-L188
I guess this doesn't work fine? https://github.com/Perlmint/glew-cmake/blob/feature/pkgconfig/CMakeLists.txt#L18 because you handled the definitions different in the past https://github.com/Perlmint/glew-cmake/blob/glew-cmake-release/CMakeLists.txt#L28-L30
I tried to add CFLAGS+=" -DGLEW_NO_GLU"
but this did not work too. So I guess when visualinfo is compiled it doesn't respect these flags.
Buildlog: https://pastebin.com/uDLRCMyZ
I found -llibglew.so
is a portable way to link with a specific name. But it seems not working. Without using a specific name for linking, I can't handle name collision - liblgew.a with libglew.so. So, I give up to provide pc files for all targets. Make it generate the only glew.pc.
About GLU, I didn't notice it should be a PUBLIC definition. I moved it to PRIVATE definitions. Now it will propagate to other targets link to glew when USE_GLU is set, Or cmake checks the GLU exists when USE_GLU is not set.
glew.pc - single context, static, no_glu
prefix=/usr/local
exec_prefix=${prefix}
libdir=${prefix}/lib
includedir=${prefix}/include
Name: glew
Description: The OpenGL Extension Wrangler library
Version: 2.2.0
Cflags: -I${includedir} -DGLEW_STATIC -DGLEW_NO_GLU
Libs: -L${libdir} -lglew -lGL -lX11 -ldl -lXext
I made some tests and lgtm. I'll start a clean build and see if I run into any issues.
Afaik it's either -L${libdir} libglew.so
or -L${libdir} -lglew
if you want to link specific libs so if you would have dropped -l it could probably work. But IMHO this is a job for the linker which should deal with this. If you want to add custom libs you could always add LDFLAGS
in your project.
Works fine here :+1: so closed by these additions https://github.com/Perlmint/glew-cmake/tree/feature/pkgconfig
it would be cool if you would draft a v2.2 RC2 release with fixed pkgconfig :1st_place_medal:
feature/pkgconfig branch is not found.
I installed pkg-config by choco
. The pkg-config
command cannot recognize the pc.in
file.
@cnDelbert feature/pkgconfig
branch was merged into master
branch. Also, pkg-config does not use .pc.in
file. it is a template to generate .pc
file. Also, .pc.in
file is not used in glew-cmake. It is used in original glew.
If you want to use glew-cmake with pkg-config, please build it and install it with CMake command (use CMakeLists.txt
in the root of this repository).
Some stuff like https://github.com/freedesktop/mesa-demos still relies on pkg-config to detect installed libs & headers so it would be useful if your CMake build could process & install the glew.pc.in file too.