The standard
git bisect
command helps quickly identify a specific commit that introduced a bug in a Git repository.
In projects where branches with lots of commits were previously merged, there may be known-bad commits with build failure unrelated to the current bisect search.
It’s possible to
skip
such commits during the bisect process, or
avoid
specific commits altogether.
For projects using Git submodules it’s useful to set option
submodules.recursetrue
git config --global submodule.recurse true
that works for most Git commands and avoids the need during “git bisect” to also have to “git submodule update –init –recursive” at each step of the bisect process.
git bisect start
# if you already know this current commit is good or bad, tell Git about itgit bisect <good|bad> <commit>
# test the current commit by running your test code / program / scriptgit bisect run <test command>
# ... repeat the above two steps until Git finds the first bad commit# finish the bisect process and return to the original branchgit bisect reset
If running into errors about “dirty” submodules and/or lots of deleted files when Git bisecting or just switching Git branches, try disabling Git submodule.recurse for the command:
The Python package
img2pdf
losslessly converts PNG images to PDF.
Install it with:
pip install img2pdf
The command line program “img2pdf” can do many tasks, but even more power comes from making a brief Python script.
Here are simple command line examples.
A common issue with document scanning is that pages may have been inserted in the wrong orientation, making the PDF difficult to read with upside-down text.
This is trivially fixed with the
QPDF command line tool.
qpdf --rotate=180 in.pdf out.pdf
in.pdf
input PDF file needing rotation
out.pdf
output PDF file with rotated pages
--rotate=180
rotate each page 180 degrees
QPDF can do vastly more operations on PDF files as seen in the
QPDF documentation.
Poppler is oriented toward rendering and extracting content from PDF files rather than modifying them like QPDF, which does not render PDF files.
Opening the same PDF file multiple times is particularly useful when reviewing journal article drafts to view figures simultaneously with text describing the figure.
Okular
is a free lightweight PDF viewer for Linux, macOS and Windows that trivially opens the same PDF multiple times by just selecting through the File → Open menu as many times as desired.
CTest
–interactive-debug-mode
is particularly useful on Windows to enable/disable debug dumps and error popup modal windows, especially for missing DLL errors.
By default this feature is enabled.
This default behavior to have interactive debug mode “on” can make problems with modal popups hanging on automated systems like CI or agentic workflows where user interaction is not desired or possible.
To avoid this, one can explicitly disable interactive debug mode by option
ctest --interactive-debug-mode=0
An even better approach is to make CMakePresets.json explicitly set the interactive debug mode for CTest invocation with preset or workflow with "interactiveDebugging": false thats inherited for all CTest preset execution like:
In agentic instruction files like
CMAKE.instructions.md
or similar, consider adding a line like:
CTest on Windows should be run with option --interactive-debug-mode=0 to prevent modal popups from interrupting automated workflows.
NOTE: CTest environment variable
CTEST_INTERACTIVE_DEBUG_MODE
is read-only and has no effect on setting the interactive debug mode. The mode must be controlled via the --interactive-debug-mode command-line option when invoking CTest.
Visual Studio executables built in Debug mode by default pop up
modal
debug windows if an unhandled exception occurs.
This can be can be undesirable for reasons including:
users having to close nuisance windows manually.
CI runs hang if an exception occurs and the modal window appears.
AI agents or automated tools may hang with unexpected modal windows.
remotely operated systems: modal windows can be difficult to close if the modal window is accidentally off-screen.
Debug popups for exception handling can be disabled by C++ runtime library functions provided by Visual Studio described below.
NOTE: missing DLL modal popups are
fixed by the calling program
such as CTest instead of this C++ method below.
Adding a few lines of code to the C++ program works around this issue by redirecting the error text to stderr console and not popping up the modal window.
CMake added rules via add_custom_rule as a much more convenient way to define outputs vs inputs - easier to understand and use than the classic combination of “add_custom_command” and “add_custom_target”
CTest can run incrementally avoiding rerunning tests with unchanged source
Common Package Specification (CPS) officially supported. This provides a solution for the long-standing program of build system-agnostic JSON package configuration files, which can be generated by CMake’s install(EXPORT) and consumable by other build systems.
cmake --version=json-v1 tells details of the libraries vendored into CMake, which is useful for debugging and reporting issues with CMake’s bundled dependencies. This is complementary to cmake -E capabilities which reports specific capabilities of the CMake.
CMake command line and file(ARCHIVE_CREATE) commands can specify compression level and algorithm in more detail
Ability to force shorter paths on project builds, important for large or complex project on Windows where the 260 character path limit is a problem for some tools. This is done via CMAKE_INTERMEDIATE_DIR_STRATEGY which is a CMake environment variable as well as a CMake command-line option.
FASTBuild
generator has impressive
benchmarks.
FASTBuild supports more modern platforms including Windows, versus
ccache
or distcc.
ExternalProject
added options to modify environment variables at each step by CONFIGURE_ENVIRONMENT_MODIFICATION, BUILD_ENVIRONMENT_MODIFICATION, INSTALL_ENVIRONMENT_MODIFICATION, TEST_ENVIRONMENT_MODIFICATION
CMake directives can be target-specific - generally starting with target*() like target_compile_options() versus non-target-specific like add_compile_options() or include_directories().
It’s usually recommended to use target-specific directives whenever possible, as they provide better scope control over individual targets, avoiding applying directives in unexpected scopes.
CMake provides a warning flag
-Wnon-target-directive
to detect such directives.
Sometimes they may be truly unavoidable or in a third-party library out of one’s scope.
On modern Linux installations, a program that saves plots to disk usually does not need a graphical desktop or display server.
Matplotlib can render files with its non-interactive Agg backend.
In another terminal running as the same user, launch the application with that socket:
WAYLAND_DISPLAY=wayland-headless application
Weston uses XDG_RUNTIME_DIR for its Wayland socket. Log-in sessions normally set this variable; if it is unset, use a properly owned, private runtime directory before starting Weston. Stop Weston with Ctrl+C when finished.
Matlab documentation website shows only the latest release by default.
This can be confusing when trying to access documentation for obsolete features to help migrate or understand older code.
Mathworks provides an archive of
prior Matlab release documentation
for older Matlab releases.