2

サブディレクトリを持つプロジェクトがあり、各ディレクトリからのソースのリストを分けておきたいです。

私は持っている:

SET( SUBDIR_SOURCES
  ${CMAKE_CURRENT_SOURCE_DIR}/a.cpp
  ${CMAKE_CURRENT_SOURCE_DIR}/b.cpp
  ${CMAKE_CURRENT_SOURCE_DIR}/c.cpp
  PARENT_SCOPE
)

私がしたい:

SET( SUBDIR_SOURCES
  a.cpp
  b.cpp
  c.cpp
  PARENT_SCOPE
)
some_magic_fuction( SUBDIR_SOURCES ${CMAKE_CURRENT_SOURCE_DIR} )
4

3 に答える 3

2

私は通常、サブディレクトリごとに小さいものを書きCMakeLists.txtます。これにより、そのディレクトリ内のすべてのファイルがライブラリにコンパイルされます。

親ディレクトリのCMakeLists.txtに、各サブディレクトリを で追加しますadd_subdirectory( blah )

指定された変数が必要な場合は、次のようにする必要があります (実際にはテストしていないことに注意してください)。

MACRO( prepend_path _srcs _path )
    unset( _tmp )
    foreach( src ${_srcs} )
        list( append _tmp ${_path}/${src} )
    endforeach( src ${_srcs} )
    set( _srcs ${_tmp} )
ENDMACRO( prepend_path _srcs )

次のように呼び出します。

prepend_path( SUBDIR_SOURCES ${CMAKE_CURRENT_SOURCE_DIR} )
于 2012-10-27T20:49:05.930 に答える
2

some_magic_functionソースのリストを渡すにPARENT_SCOPEは、サブディレクトリの CMakeList のスコープでは使用できないため、最初にそれらを設定しないようにする必要があります。

${CMAKE_CURRENT_SOURCE_DIR}関数自体が定義されている場所に関係なく、関数内で使用できるため、関数に渡す必要もありません。

したがって、次のようなことができます。

SET( SUBDIR_SOURCES a.cpp b.cpp c.cpp )
some_magic_function( SUBDIR_SOURCES )
SET( SUBDIR_SOURCES ${SUBDIR_SOURCES} PARENT_SCOPE )

関数は次のようになります。

FUNCTION( some_magic_function SOURCE_FILES )
  FOREACH( SOURCE_FILE ${${SOURCE_FILES}} )
    SET( MODIFIED ${MODIFIED} ${CMAKE_CURRENT_SOURCE_DIR}/${SOURCE_FILE} )
  ENDFOREACH()
  SET( ${SOURCE_FILES} ${MODIFIED} PARENT_SCOPE )
ENDFUNCTION()

関数内で${SOURCE_FILES}は isであるため、実際のファイル リストを取得するにはSUBDIR_SOURCESを使用する必要があります。${${SOURCE_FILES}}

関数には独自のスコープがあるためSUBDIR_SOURCES、関数の外側のスコープでの値を置き換えたいので、PARENT_SCOPE呼び出すときに使用する必要がありますSET( ${SOURCE_FILES}...

これらのコマンドの詳細については、次を実行してください。

cmake --help-command set
cmake --help-command function
于 2012-10-28T11:03:26.097 に答える