Not recognizing passed argument to CMAKE via command prompt at the `make` stage

I am trying to force the user to pass a parameter before compiling. But I have a problem. After I run :

cd .. ;rm -r build; mkdir build; cd build; cmake -DUSER_DEFINED_BOARD_VERSION:STRING="SATNOGS_COMMS_VERSION_0_2_1" ..

Everything compiles as expected:

...
-- Detecting CXX compile features - done
-- USER_DEFINED_BOARD_VERSION: SATNOGS_COMMS_VERSION_0_2_1
-- BOARD_VERSION: 021
-- USER_DEFINED_BOARD_VERSION: SATNOGS_COMMS_VERSION_0_2_1
-- USER_DEFINED_BOARD_VERSION: SATNOGS_COMMS_VERSION_0_2_1
-- USER_DEFINED_BOARD_VERSION: SATNOGS_COMMS_VERSION_0_2_1
-- Configuring done
-- Generating done
-- Build files have been written to: /home/victoria/zephyr-sdk-0.16.1/zephyrproject/libsatnogs-comms/build

However, after I run make the following is shown:

-- Found Nanopb: /home/victoria/zephyr-sdk-0.16.1/zephyrproject/modules/lib/nanopb  
-- USER_DEFINED_BOARD_VERSION: OFF
CMake Error at /home/victoria/zephyr-sdk-0.16.1/zephyrproject/libsatnogs-comms/src/CMakeLists.txt:31 (message):
  Error: Please provide the board version using
  -DUSER_DEFINED_BOARD_VERSION=<value>


-- Configuring incomplete, errors occurred!

The rest of the code behaves fine if I use “SEND ERROR” as I use compile definitions in my code, but I cannot eliminate the error in the build process(while running make). Any ideas?

In CMakeCache.txt one can find:

//User-defined board version
USER_DEFINED_BOARD_VERSION:STRING=SATNOGS_COMMS_VERSION_0_2_1

And this is the CMakeLists.txt



# CMakeLists.txt

# Define a required option named USER_DEFINED_BOARD_VERSION
option(USER_DEFINED_BOARD_VERSION "User-defined board version" "")
message(STATUS "USER_DEFINED_BOARD_VERSION: ${USER_DEFINED_BOARD_VERSION}")


# Check if the USER_DEFINED_BOARD_VERSION option is provided
if (NOT USER_DEFINED_BOARD_VERSION)
    message(FATAL_ERROR "Error: Please provide the board version using -DUSER_DEFINED_BOARD_VERSION=<value>")
endif()

# Process the provided board version
if (${USER_DEFINED_BOARD_VERSION} STREQUAL "SATNOGS_COMMS_VERSION_0_2_1")
    set(BOARD_VERSION 021)
    message(STATUS "BOARD_VERSION: ${BOARD_VERSION}")
elseif (${USER_DEFINED_BOARD_VERSION} STREQUAL "SATNOGS_COMMS_VERSION_0_3_0")
    set(BOARD_VERSION 030)
    message(STATUS "BOARD_VERSION: ${BOARD_VERSION}")
else()
    message(FATAL_ERROR "Error: Please provide a valid board version. The valid inputs are: \"SATNOGS_COMMS_VERSION_0_2_1\" and \"SATNOGS_COMMS_VERSION_0_3_0\"")
endif()

..

option are meant to be boolean value ON/OFF usually, see: https://cmake.org/cmake/help/latest/command/option.html

Did you try without “option”, just check that the expected variable is defined: https://cmake.org/cmake/help/latest/command/if.html#defined

in fact you don’t want that you probably want

# Check if the USER_DEFINED_BOARD_VERSION option is provided
if ("${USER_DEFINED_BOARD_VERSION}" STREQUAL "")
    message(FATAL_ERROR "Error: Please provide the board version using -DUSER_DEFINED_BOARD_VERSION=<value>")
endif()

I removed the option line and changed the CMakeLists.txt according to your suggestion. The expected variable is indeed defined in the compilation step. Because the output to my code:

message(STATUS "USER_DEFINED_BOARD_VERSION: ${USER_DEFINED_BOARD_VERSION}")
message(STATUS "BOARD_VERSION: ${BOARD_VERSION}")

is

-- USER_DEFINED_BOARD_VERSION: SATNOGS_COMMS_VERSION_0_2_1
-- BOARD_VERSION: 021

That’s all I want as I use compile time options in my code as described here for example.
But when I build the code with make the output is:

-- USER_DEFINED_BOARD_VERSION: 
CMake Error at /home/victoria/zephyr-sdk-0.16.1/zephyrproject/libsatnogs-comms/src/CMakeLists.txt:29 (message):
  Error: Please provide the board version using
  -DUSER_DEFINED_BOARD_VERSION=<value>

It seems that the variable is cleared during build, and I want either to make it persistent OR to supress the error during build but dispaly it during the compile stage.
I tried this:

# Process the provided board version
if (${USER_DEFINED_BOARD_VERSION} STREQUAL "SATNOGS_COMMS_VERSION_0_2_1")
    set(BOARD_VERSION 021)
    message(STATUS "BOARD_VERSION: ${BOARD_VERSION}")
    set(USER_DEFINED_BOARD_VERSION "SATNOGS_COMMS_VERSION_0_2_1" CACHE STRING "user-specified option")
elseif (${USER_DEFINED_BOARD_VERSION} STREQUAL "SATNOGS_COMMS_VERSION_0_3_0")
    set(BOARD_VERSION 030)
    message(STATUS "BOARD_VERSION: ${BOARD_VERSION}")
    set(USER_DEFINED_BOARD_VERSION "SATNOGS_COMMS_VERSION_0_3_0" CACHE STRING "user-specified option")
else()
    message(FATAL_ERROR "Error: Please provide a valid board version. The valid inputs are: \"SATNOGS_COMMS_VERSION_0_2_1\" and \"SATNOGS_COMMS_VERSION_0_3_0\"")
endif()

But it didn’t work.

I can use SEND_ERROR and it works as intended, but I cannot have errors displayed in my code when I don’t want them.

Is it a CACHE variable now? Should be something like:

set(USER_DEFINED_BOARD_VERSION "" CACHE STRING "Board version")

before the # Process the provided board version block.

I was able to fix the behavior with these modifications:

# Check if the USER_DEFINED_BOARD_VERSION option is provided
if (NOT USER_DEFINED_BOARD_VERSION)
    message(FATAL_ERROR "Error: Please provide the board version using -DUSER_DEFINED_BOARD_VERSION=<value>")
endif()

# Process the provided board version
if (${USER_DEFINED_BOARD_VERSION} STREQUAL "SATNOGS_COMMS_VERSION_0_2_1")
    set(BOARD_VERSION 021)
elseif (${USER_DEFINED_BOARD_VERSION} STREQUAL "SATNOGS_COMMS_VERSION_0_3_0")
    set(BOARD_VERSION 030)
else()
    message(FATAL_ERROR "Error: Please provide a valid board version. The valid inputs are: \"SATNOGS_COMMS_VERSION_0_2_1\" and \"SATNOGS_COMMS_VERSION_0_3_0\"")
endif()
set(USER_DEFINED_BOARD_VERSION "SATNOGS_COMMS_VERSION_0_3_0" CACHE STRING "Board version") # This is only used for build which values are not used, for the compilation a user-provided variable MUST be given 

######################################