jlj-qmk/docs/getting_started_introduction.md
Evan Travers b666921e25 Reword the config.h section
This section didn't include the possibility of a user `config.h`, and it
wasn't clear exactly how the settings override works.
2018-07-15 13:21:20 -04:00

2.4 KiB

Introduction

This page attempts to explain the basic information you need to know to work with the QMK project. It assumes that you are familiar with navigating a Unix shell, but does not assume you are familiar with C or with compiling using make.

Basic QMK Structure

QMK is a fork of Jun Wako's tmk_keyboard project. The original TMK code, with modifications, can be found in the tmk folder. The QMK additions to the project may be found in the quantum folder. Keyboard projects may be found in the handwired and keyboard folders.

Keyboard Project Structure

Within the folder keyboards and its subfolder handwired is a directory for each keyboard project, for example qmk_firmware/keyboards/clueboard. Within it you'll find the following structure:

  • keymaps/: Different keymaps that can be built
  • rules.mk: The file that sets the default "make" options. Do not edit this file directly, instead use a keymap specific rules.mk.
  • config.h: The file that sets the default compile time options. Do not edit this file directly, instead use a keymap specific config.h.

Keymap Structure

In every keymap folder, the following files may be found. Only keymap.c is required, and if the rest of the files are not found the default options will be chosen.

  • config.h: the options to configure your keymap
  • keymap.c: all of your keymap code, required
  • rules.mk: the features of QMK that are enabled
  • readme.md: a description of your keymap, how others might use it, and explanations of features. Please upload images to a service like imgur.

The config.h File

There are 3 possible config.h locations:

  • keyboard (/keyboards/<keyboard>/config.h)
  • userspace (/users/<user>/config.h)
  • keymap (/keyboards/<keyboard>/keymaps/<keymap>/config.h)

The build system automatically picks up the config files in the above order. If you wish to override any setting set by a previous config.h you will need to first include some boilerplate code around the settings you wish to change.

#ifndef CONFIG_USER_H
#define CONFIG_USER_H

// overrides go here!

#endif

Then to override a setting from the previous config.h file you must #undef and then #define the setting again.

The boilerplate code and setting look like this together:

#ifndef CONFIG_USER_H
#define CONFIG_USER_H

// overrides go here!
#undef MY_SETTING
#define MY_SETTING 4

#endif