Parallel iteration over lists in makefile or CMake file

前端 未结 3 624
故里飘歌
故里飘歌 2021-02-12 19:35

Is there a way to loop over multiple lists in parallel in a makefile or CMake file?

I would like to do something like the following in CMake, except AFAICT this syntax i

相关标签:
3条回答
  • 2021-02-12 20:12

    In make you can use the GNUmake table toolkit to achieve this by handling the two lists as 1-column tables:

    include gmtt/gmtt.mk
    
    # declare the lists as tables with one column
    list_a := 1 a0 a1 a2 a3 a4 a5
    list_b := 1 b0 b1 b2
    
    # note: list_b is shorter and will be filled up with a default value
    joined_list := $(call join-tbl,$(list_a),$(list_b), /*nil*/)
    
    $(info $(joined_list))
    
    # Apply a function (simply output "<tuple(,)>") on each table row, i.e. tuple
    $(info $(call map-tbl,$(joined_list),<tuple($$1,$$2)>))
    

    Output:

    2 a0 b0 a1 b1 a2 b2 a3 /*nil*/ a4 /*nil*/ a5 /*nil*/
    <tuple(a0,b0)><tuple(a1,b1)><tuple(a2,b2)><tuple(a3,/*nil*/)><tuple(a4,/*nil*/)><tuple(a5,/*nil*/)>
    
    0 讨论(0)
  • 2021-02-12 20:14

    Here you go:

    set(list1 1 2 3 4 5)
    set(list2 6 7 8 9 0)
    
    list(LENGTH list1 len1)
    math(EXPR len2 "${len1} - 1")
    
    foreach(val RANGE ${len2})
      list(GET list1 ${val} val1)
      list(GET list2 ${val} val2)
      message(STATUS "${val1}  ${val2}")
    endforeach()
    
    0 讨论(0)
  • 2021-02-12 20:14

    As of CMake 3.17, the foreach() loop supports a ZIP_LISTS option to iterate through two (or more) lists simultaneously:

    set(a_values a0 a1 a2)
    set(b_values b0 b1 b2)
    foreach(a b IN ZIP_LISTS a_values b_values)
        message("${a} ${b}")
    endforeach()
    

    This prints:

    a0 b0
    a1 b1
    a2 b2
    
    0 讨论(0)
提交回复
热议问题