ddcutil icon indicating copy to clipboard operation
ddcutil copied to clipboard

2.2.0 fails to build with --disable-x11

Open mbakhoff opened this issue 1 year ago • 15 comments

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

mbakhoff avatar Feb 27 '25 11:02 mbakhoff

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.                                   

mbakhoff avatar Feb 27 '25 11:02 mbakhoff

Bisect led to https://github.com/rockowitz/ddcutil/commit/6bf1062d

kostadinsh avatar Feb 27 '25 12:02 kostadinsh

Disabling DRM doesn't seem to work either.

thesamesam avatar Feb 27 '25 12:02 thesamesam

Building with --disable-x11 should work now. In that case, watch-mode XEVENT is eliminated; the only implemented watch-mode is POLL.

rockowitz avatar Feb 27 '25 14:02 rockowitz

Thank you for the quick reply and fix!

kostadinsh avatar Feb 27 '25 16:02 kostadinsh

Yes, I can confirm the fix as well. Thanks for the quick response!

mbakhoff avatar Feb 27 '25 18:02 mbakhoff

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

mbakhoff avatar Feb 28 '25 17:02 mbakhoff

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.

rockowitz avatar Mar 01 '25 07:03 rockowitz

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'

kostadinsh avatar Mar 02 '25 12:03 kostadinsh

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?

rockowitz avatar Mar 02 '25 14:03 rockowitz

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.

kostadinsh avatar Mar 02 '25 14:03 kostadinsh

@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?

kostadinsh avatar Mar 02 '25 15:03 kostadinsh

Option --disable-drm to configure automatically forces --disable-watch-displays.

rockowitz avatar Mar 02 '25 18:03 rockowitz

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?

kostadinsh avatar Mar 02 '25 19:03 kostadinsh

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.

rockowitz avatar Mar 06 '25 18:03 rockowitz