2.2.0 fails to build with --disable-x11
Tried to build the new 2.2.0 on gentoo with x11 disabled, but it fails. Build succeeds with x11 enabled. Older 2.1.4 does not have the same issue.
ddcutil 2.2.0
version suffix:
=============
libtool version 7:0:2
prefix: /usr
exec_prefix: ${prefix}
libexecdir: ${exec_prefix}/libexec
bindir: ${exec_prefix}/bin
libdir: /usr/lib64
datarootdir: /usr/share
datadir: /usr/share
docdir: /usr/share/doc/ddcutil-2.2.0
mandir: /usr/share/man
includedir: ${prefix}/include
pkgconfigdir:
required_packages: glib-2.0 >= 2.40 jansson >= 2.0
enable_lib: yes
enable_install_lib_only no
enable_build_timestamp yes
enable_envcmds yes
enable_udev yes
enable_usb: no
enable_drm: yes
enable_x11: no
enable_asan: no
enable_static_functions_visible: no
Developer-only options:
enable_targetbsd: no
enable_doxygen: no
enable_failsim: no
include_testcases: no
compiler: x86_64-pc-linux-gnu-gcc
CFLAGS: -march=x86-64-v3 -O2 -pipe
CPPFLAGS:
LDFLAGS: -Wl,-O1 -Wl,--as-needed -Wl,-z,pack-relative-relocs
And later
libtool: link: x86_64-pc-linux-gnu-ar cr .libs/libcommon.a .libs/libcommon.lax/libdw.a/dw_common.o .libs/libcommon.lax/libdw.a/dw_dref.o .libs/libcommon.lax/libdw.a/dw_main.o .libs/libcommon.lax/libdw.a/dw_poll.o .libs/libcommon.lax/libdw.a/dw_recheck.o .libs/libcommon.lax/libdw.a/dw_services.o .libs/libcommon.lax/libdw.a/dw_status_events.o .libs/libcommon.lax/libdw.a/dw_udev.o .libs/libcommon.lax/libdw.a/dw_xevent.o .libs/libcommon.lax/libddc.a/ddc_common_init.o .libs/libcommon.lax/libddc.a/ddc_display_ref_reports.o .libs/libcommon.lax/libddc.a/ddc_display_selection.o .libs/libcommon.lax/libddc.a/ddc_displays.o .libs/libcommon.lax/libddc.a/ddc_dumpload.o .libs/libcommon.lax/libddc.a/ddc_initial_checks.o .libs/libcommon.lax/libddc.a/ddc_multi_part_io.o .libs/libcommon.lax/libddc.a/ddc_output.o .libs/libcommon.lax/libddc.a/ddc_packet_io.o .libs/libcommon.lax/libddc.a/ddc_phantom_displays.o .libs/libcommon.lax/libddc.a/ddc_read_capabilities.o .libs/libcommon.lax/libddc.a/ddc_save_current_settings.o .libs/libcommon.lax/libddc.a/ddc_serialize.o .libs/libcommon.lax/libddc.a/ddc_services.o .libs/libcommon.lax/libddc.a/ddc_strategy.o .libs/libcommon.lax/libddc.a/ddc_try_data.o .libs/libcommon.lax/libddc.a/ddc_vcp.o .libs/libcommon.lax/libddc.a/ddc_vcp_version.o .libs/libcommon.lax/libdynvcp.a/dyn_feature_codes.o .libs/libcommon.lax/libdynvcp.a/dyn_feature_files.o .libs/libcommon.lax/libdynvcp.a/dyn_feature_set.o .libs/libcommon.lax/libdynvcp.a/dyn_parsed_capabilities.o .libs/libcommon.lax/libdynvcp.a/vcp_feature_set.o .libs/libcommon.lax/libi2c.a/i2c_bus_core.o .libs/libcommon.lax/libi2c.a/i2c_bus_selector.o .libs/libcommon.lax/libi2c.a/i2c_edid.o .libs/libcommon.lax/libi2c.a/i2c_execute.o .libs/libcommon.lax/libi2c.a/i2c_services.o .libs/libcommon.lax/libi2c.a/i2c_strategy_dispatcher.o .libs/libcommon.lax/libsysfs.a/sysfs_base.o .libs/libcommon.lax/libsysfs.a/sysfs_conflicting_drivers.o .libs/libcommon.lax/libsysfs.a/sysfs_dpms.o .libs/libcommon.lax/libsysfs.a/sysfs_i2c_info.o .libs/libcommon.lax/libsysfs.a/sysfs_i2c_sys_info.o .libs/libcommon.lax/libsysfs.a/sysfs_services.o .libs/libcommon.lax/libsysfs.a/sysfs_sys_drm_connector.o .libs/libcommon.lax/libsysfs.a/sysfs_top.o .libs/libcommon.lax/libvcp.a/parse_capabilities.o .libs/libcommon.lax/libvcp.a/parsed_capabilities_feature.o .libs/libcommon.lax/libvcp.a/persistent_capabilities.o .libs/libcommon.lax/libvcp.a/vcp_feature_codes.o .libs/libcommon.lax/libvcp.a/vcp_feature_values.o .libs/libcommon.lax/libcmdline.a/cmd_parser_aux.o .libs/libcommon.lax/libcmdline.a/cmd_parser_goption.o .libs/libcommon.lax/libcmdline.a/parsed_cmd.o .libs/libcommon.lax/libbase.a/base_services.o .libs/libcommon.lax/libbase.a/build_info.o .libs/libcommon.lax/libbase.a/build_timestamp.o .libs/libcommon.lax/libbase.a/core.o .libs/libcommon.lax/libbase.a/core_per_thread_settings.o .libs/libcommon.lax/libbase.a/ddc_command_codes.o .libs/libcommon.lax/libbase.a/ddc_errno.o .libs/libcommon.lax/libbase.a/ddc_packets.o .libs/libcommon.lax/libbase.a/display_lock.o .libs/libcommon.lax/libbase.a/display_retry_data.o .libs/libcommon.lax/libbase.a/displays.o .libs/libcommon.lax/libbase.a/drm_connector_state.o .libs/libcommon.lax/libbase.a/dsa2.o .libs/libcommon.lax/libbase.a/dynamic_features.o .libs/libcommon.lax/libbase.a/execution_stats.o .libs/libcommon.lax/libbase.a/feature_lists.o .libs/libcommon.lax/libbase.a/feature_metadata.o .libs/libcommon.lax/libbase.a/feature_set_ref.o .libs/libcommon.lax/libbase.a/flock.o .libs/libcommon.lax/libbase.a/i2c_bus_base.o .libs/libcommon.lax/libbase.a/linux_errno.o .libs/libcommon.lax/libbase.a/monitor_model_key.o .libs/libcommon.lax/libbase.a/monitor_quirks.o .libs/libcommon.lax/libbase.a/per_display_data.o .libs/libcommon.lax/libbase.a/per_thread_data.o .libs/libcommon.lax/libbase.a/rtti.o .libs/libcommon.lax/libbase.a/sleep.o .libs/libcommon.lax/libbase.a/stats.o .libs/libcommon.lax/libbase.a/status_code_mgt.o .libs/libcommon.lax/libbase.a/trace_control.o .libs/libcommon.lax/libbase.a/tuned_sleep.o .libs/libcommon.lax/libbase.a/vcp_version.o .libs/libcommon.lax/libutil.a/backtrace.o .libs/libcommon.lax/libutil.a/data_structures.o .libs/libcommon.lax/libutil.a/ddcutil_config_file.o .libs/libcommon.lax/libutil.a/debug_util.o .libs/libcommon.lax/libutil.a/device_id_util.o .libs/libcommon.lax/libutil.a/drm_common.o .libs/libcommon.lax/libutil.a/edid.o .libs/libcommon.lax/libutil.a/error_info.o .libs/libcommon.lax/libutil.a/file_util.o .libs/libcommon.lax/libutil.a/file_util_base.o .libs/libcommon.lax/libutil.a/glib_string_util.o .libs/libcommon.lax/libutil.a/glib_util.o .libs/libcommon.lax/libutil.a/i2c_util.o .libs/libcommon.lax/libutil.a/libdrm_util.o .libs/libcommon.lax/libutil.a/linux_util.o .libs/libcommon.lax/libutil.a/msg_util.o .libs/libcommon.lax/libutil.a/multi_level_map.o .libs/libcommon.lax/libutil.a/pnp_ids.o .libs/libcommon.lax/libutil.a/regex_util.o .libs/libcommon.lax/libutil.a/report_util.o .libs/libcommon.lax/libutil.a/simple_ini_file.o .libs/libcommon.lax/libutil.a/string_util.o .libs/libcommon.lax/libutil.a/subprocess_util.o .libs/libcommon.lax/libutil.a/sysfs_filter_functions.o .libs/libcommon.lax/libutil.a/sysfs_i2c_util.o .libs/libcommon.lax/libutil.a/sysfs_util.o .libs/libcommon.lax/libutil.a/timestamp.o .libs/libcommon.lax/libutil.a/traced_function_stack.o .libs/libcommon.lax/libutil.a/udev_i2c_util.o .libs/libcommon.lax/libutil.a/udev_usb_util.o .libs/libcommon.lax/libutil.a/udev_util.o .libs/libcommon.lax/libutil.a/utilrpt.o .libs/libcommon.lax/libutil.a/xdg_util.o
libtool: link: x86_64-pc-linux-gnu-ranlib .libs/libcommon.a
libtool: link: rm -fr .libs/libcommon.lax
libtool: link: ( cd ".libs" && rm -f "libcommon.la" && ln -s "../libcommon.la" "libcommon.la" )
/bin/sh ../libtool --tag=CC --mode=link x86_64-pc-linux-gnu-gcc -Wall -std=c11 -Werror=unused-result -Wformat-security -fno-common -Wimplicit-function-declaration -Wno-compound-token-split-by-macro -Wimplicit-fallthrough -D_GLIBCXX_ASSERTIONS -Werror=implicit -Werror=incompatible-pointer-types -Werror=int-conversion -fPIC -D_GNU_SOURCE -march=x86-64-v3 -O2 -pipe -pie -export-dynamic -Wl,-O1 -Wl,--as-needed -Wl,-z,pack-relative-relocs -o ddcutil libapp.la libcommon.la
libtool: link: x86_64-pc-linux-gnu-gcc -Wall -std=c11 -Werror=unused-result -Wformat-security -fno-common -Wimplicit-function-declaration -Wno-compound-token-split-by-macro -Wimplicit-fallthrough -D_GLIBCXX_ASSERTIONS -Werror=implicit -Werror=incompatible-pointer-types -Werror=int-conversion -fPIC -D_GNU_SOURCE -march=x86-64-v3 -O2 -pipe -pie -Wl,-O1 -Wl,--as-needed -Wl,-z -Wl,pack-relative-relocs -o ddcutil -Wl,--export-dynamic ./.libs/libapp.a ./.libs/libcommon.a -ljansson -lglib-2.0 -ludev -ldrm
/usr/lib/gcc/x86_64-pc-linux-gnu/14/../../../../x86_64-pc-linux-gnu/bin/ld: ./.libs/libcommon.a(dw_xevent.o): in function `dw_detect_xevent_screen_change':
dw_xevent.c:(.text+0xb1): undefined reference to `XCheckTypedEvent'
/usr/lib/gcc/x86_64-pc-linux-gnu/14/../../../../x86_64-pc-linux-gnu/bin/ld: dw_xevent.c:(.text+0xce): undefined reference to `XCheckTypedEvent'
/usr/lib/gcc/x86_64-pc-linux-gnu/14/../../../../x86_64-pc-linux-gnu/bin/ld: ./.libs/libcommon.a(dw_xevent.o): in function `dw_send_x11_termination_message':
dw_xevent.c:(.text+0x4e0): undefined reference to `XSendEvent'
/usr/lib/gcc/x86_64-pc-linux-gnu/14/../../../../x86_64-pc-linux-gnu/bin/ld: dw_xevent.c:(.text+0x52b): undefined reference to `XFlush'
/usr/lib/gcc/x86_64-pc-linux-gnu/14/../../../../x86_64-pc-linux-gnu/bin/ld: dw_xevent.c:(.text+0x5d1): undefined reference to `XFlush'
/usr/lib/gcc/x86_64-pc-linux-gnu/14/../../../../x86_64-pc-linux-gnu/bin/ld: ./.libs/libcommon.a(dw_xevent.o): in function `dw_next_X11_event_of_interest':
dw_xevent.c:(.text+0x78f): undefined reference to `XIfEvent'
/usr/lib/gcc/x86_64-pc-linux-gnu/14/../../../../x86_64-pc-linux-gnu/bin/ld: dw_xevent.c:(.text+0x90e): undefined reference to `XCheckTypedEvent'
/usr/lib/gcc/x86_64-pc-linux-gnu/14/../../../../x86_64-pc-linux-gnu/bin/ld: ./.libs/libcommon.a(dw_xevent.o): in function `dw_free_xevent_data':
dw_xevent.c:(.text+0xa21): undefined reference to `XCloseDisplay'
/usr/lib/gcc/x86_64-pc-linux-gnu/14/../../../../x86_64-pc-linux-gnu/bin/ld: ./.libs/libcommon.a(dw_xevent.o): in function `dw_init_xevent_screen_change_notification':
dw_xevent.c:(.text+0xaad): undefined reference to `XOpenDisplay'
/usr/lib/gcc/x86_64-pc-linux-gnu/14/../../../../x86_64-pc-linux-gnu/bin/ld: dw_xevent.c:(.text+0xae2): undefined reference to `XRRQueryExtension'
/usr/lib/gcc/x86_64-pc-linux-gnu/14/../../../../x86_64-pc-linux-gnu/bin/ld: dw_xevent.c:(.text+0xbcb): undefined reference to `XRRQueryVersion'
/usr/lib/gcc/x86_64-pc-linux-gnu/14/../../../../x86_64-pc-linux-gnu/bin/ld: dw_xevent.c:(.text+0xc08): undefined reference to `XRRSelectInput'
/usr/lib/gcc/x86_64-pc-linux-gnu/14/../../../../x86_64-pc-linux-gnu/bin/ld: dw_xevent.c:(.text+0xc22): undefined reference to `XInternAtom'
/usr/lib/gcc/x86_64-pc-linux-gnu/14/../../../../x86_64-pc-linux-gnu/bin/ld: dw_xevent.c:(.text+0xc3a): undefined reference to `XRRSelectInput'
collect2: error: ld returned 1 exit status
make[3]: *** [Makefile:780: ddcutil] Error 1
Possibly another error occurs when x11 is disabled and also the x11 header files are not installed:
libtool: compile: x86_64-pc-linux-gnu-gcc -DHAVE_CONFIG_H -I. -I../.. -I/usr/include/libdrm -I/usr/include/glib-2.0 -I/usr/lib64/glib-2.0/include -I../../src -I../../src/public -Wall -std=c11 -Werror=unused-result -Wformat-security -fno-common -Wimplicit-function-declaration -Wno-compound-token-split-by-macro -Wimplicit-fallthrough -D_GLIBCXX_ASSERTIONS -Werror=implicit -Werror=incompatible-pointer-types -Werror=int-conversion -fPIC -D_GNU_SOURCE -O2 -pipe -march=goldmont-plus -c ddc_common_init.c -fPIC -DPIC -o .libs/ddc_common_init.o
In file included from ../../src/dw/dw_common.h:17,
from ddc_common_init.c:68:
../../src/dw/dw_xevent.h:10:10: fatal error: X11/Xlib.h: No such file or directory
10 | #include <X11/Xlib.h>
| ^~~~~~~~~~~~
compilation terminated.
Bisect led to https://github.com/rockowitz/ddcutil/commit/6bf1062d
Disabling DRM doesn't seem to work either.
Building with --disable-x11 should work now. In that case, watch-mode XEVENT is eliminated; the only implemented watch-mode is POLL.
Thank you for the quick reply and fix!
Yes, I can confirm the fix as well. Thanks for the quick response!
Sorry, I have to reopen this. Looks like this error was missed in the fix
In file included from ../../src/dw/dw_common.h:17,
from ddc_common_init.c:68:
../../src/dw/dw_xevent.h:10:10: fatal error: X11/Xlib.h: No such file or directory
Thanks for catching this. Each config option has a reasonable origin story, but the interactions can be convoluted. I've uploaded changes that should address the latest errors.
It needs an if check here too: https://github.com/rockowitz/ddcutil/blob/bb976a01e9cb0a13dd5b51daeb3eceeaf3507f2f/src/ddc/ddc_services.c#L67
make[3]: Entering directory '/var/tmp/portage/app-misc/ddcutil-2.2.0/work/ddcutil-2.2.0/src/ddc'
/bin/sh ../../libtool --tag=CC --mode=compile x86_64-pc-linux-gnu-gcc -DHAVE_CONFIG_H -I. -I../.. -I/usr/include/libdrm -I/usr/include/glib-2.0 -I/usr/lib64/glib-2.0/include -I../../src -I../../src/public -Wall -std=c11 -Werror=unused-result -Wformat-security -fno-common -Wimplicit-function-declaration -Wno-compound-token-split-by-macro -Wimplicit-fallthrough -D_GLIBCXX_ASSERTIONS -Werror=implicit -Werror=incompatible-pointer-types -Werror=int-conversion -fPIC -D_GNU_SOURCE -O2 -pipe -march=goldmont-plus -c -o ddc_services.lo ddc_services.c
libtool: compile: x86_64-pc-linux-gnu-gcc -DHAVE_CONFIG_H -I. -I../.. -I/usr/include/libdrm -I/usr/include/glib-2.0 -I/usr/lib64/glib-2.0/include -I../../src -I../../src/public -Wall -std=c11 -Werror=unused-result -Wformat-security -fno-common -Wimplicit-function-declaration -Wno-compound-token-split-by-macro -Wimplicit-fallthrough -D_GLIBCXX_ASSERTIONS -Werror=implicit -Werror=incompatible-pointer-types -Werror=int-conversion -fPIC -D_GNU_SOURCE -O2 -pipe -march=goldmont-plus -c ddc_services.c -fPIC -DPIC -o .libs/ddc_services.o
In file included from ddc_services.c:66:
../../src/dw/dw_xevent.h:10:10: fatal error: X11/Xlib.h: No such file or directory
10 | #include <X11/Xlib.h>
| ^~~~~~~~~~~~
compilation terminated.
make[3]: *** [Makefile:511: ddc_services.lo] Error 1
make[3]: Leaving directory '/var/tmp/portage/app-misc/ddcutil-2.2.0/work/ddcutil-2.2.0/src/ddc'
Fixed. It actually was a bigger problem that caused dynamic tracing to not be enabled for most display-watch functions.
Interesting system you have. Does it not have X11, or did you choose to not install the X11 header files?
Fixed. It actually was a bigger problem that caused dynamic tracing to not be enabled for most display-watch functions.
Interesting system you have. Does it not have X11, or did you choose to not install the X11 header files?
The original bug reporter in Gentoo has a minimal system without X.
@rockowitz would it be fine to replace the if checks for DISPLAY_WATCH to instead check for USE_DRM atleast for 2.2.0, so I can backport the commit without also backporting all of the other stuff that was split from drm?
Option --disable-drm to configure automatically forces --disable-watch-displays.
Option --disable-drm to configure automatically forces --disable-watch-displays.
But we aren't disabling drm here, only X. I think you thought you were looking at the other bug. My question is - is it fine for a downstream patch for version 2.2.0 to change the ifs in src/ddc/ddc_services.c that check for WATCH_DISPLAYS here and here to instead check for USE_DRM considering the two (drm and display watch) were split after 2.2.0 was released?
I'm afraid it's all too interconnected, which is why the changes were so extensive. I suggest you wait for release 2.2.1, which I expect will be out at the end of the month.