cmake_policy(SET CMP0054 NEW) function(assert_expected_list_len list_var expected_size) list(LENGTH ${list_var} _size) if(NOT _size EQUAL ${expected_size}) message(FATAL_ERROR "list size expected to be `${expected_size}`, got `${_size}` instead") endif() endfunction() # Pop from undefined list list(POP_BACK test) if(DEFINED test) message(FATAL_ERROR "`test` expected to be undefined") endif() # Pop from empty list set(test) list(POP_BACK test) if(DEFINED test) message(FATAL_ERROR "`test` expected to be undefined") endif() # Default pop from 1-item list list(APPEND test one) list(POP_BACK test) assert_expected_list_len(test 0) # Pop from 1-item list to var list(APPEND test one) list(POP_BACK test one) assert_expected_list_len(test 0) if(NOT DEFINED one) message(FATAL_ERROR "`one` expected to be defined") endif() if(NOT one STREQUAL "one") message(FATAL_ERROR "`one` has unexpected value `${one}`") endif() unset(one) unset(two) # Pop from 1-item list to vars list(APPEND test one) list(POP_BACK test one two) assert_expected_list_len(test 0) if(NOT DEFINED one) message(FATAL_ERROR "`one` expected to be defined") endif() if(NOT one STREQUAL "one") message(FATAL_ERROR "`one` has unexpected value `${one}`") endif() if(DEFINED two) message(FATAL_ERROR "`two` expected to be undefined") endif() unset(one) unset(two) # Default pop from 2-item list list(APPEND test one two) list(POP_BACK test) assert_expected_list_len(test 1) if(NOT test STREQUAL "one") message(FATAL_ERROR "`test` has unexpected value `${test}`") endif() # Pop from 2-item list list(APPEND test two) list(POP_BACK test two) assert_expected_list_len(test 1) if(NOT DEFINED two) message(FATAL_ERROR "`two` expected to be defined") endif() if(NOT two STREQUAL "two") message(FATAL_ERROR "`two` has unexpected value `${two}`") endif() if(NOT test STREQUAL "one") message(FATAL_ERROR "`test` has unexpected value `${test}`") endif()