2017-05-19 3 views
1

하나 이상의 .asn1 개의 파일을 일련의 .h.c 개의 파일을 주어진 폴더에 생성하려면 asn1c을 사용하고 있습니다.CMake globbing 생성 된 파일

이 C 파일의 이름은 원래 asn1 파일과 일치하지 않습니다.

작업 실행 파일을 얻으려면 이러한 파일을 함께 연결해야합니다. , 자동 (아마 add_custom_target으로 수행) 프로젝트의 나머지

  • 는 해당 파일에 내 실행 파일의 종속성을 지정 오염 방지하기 위해 빌드 디렉토리에있는 파일을 생성

    • : 내가 할 수있을 싶어요 따라서 파일이 누락되거나 .asn1 파일 중 하나가 업데이트되면 asn1c 실행 파일이 자동으로 실행됩니다.
    • 생성 된 모든 파일을 내 실행 파일의 컴파일에 자동으로 추가하십시오.

    생성 된 파일이 사전에 알려져 있지 않기 때문에 그것은 asn1c 명령의 출력 디렉토리의 내용이 무엇 이건 단지 글로브에 괜찮아 - 한 디렉토리가 비어 있지 않은 나는 행복 해요.

  • 답변

    3

    CMake는 전체 목록add_executable()으로 전달할 것으로 예상합니다. 즉, 빌드 단계 ()에서 생성 된 파일을 glob 할 수 없습니다. 너무 늦었습니다.

    당신은 사전에 자신의 이름을 모른 채 핸들을 생성 소스 파일에 대한 여러 가지 방법이 있습니다

    1. execute_process구성 단계에서 파일을 생성합니다. 그 후 당신은 add_executable()로 수집 소스 이름을 file(GLOB)을 사용하고 전달할 수

      (귀하의 경우 .asn1) 생성을위한 입력 파일은 앞으로 변경 수 없습니다 경우
      execute_process(COMMAND asn1c <list of .asn1 files>) 
      file(GLOB generated_sources "${CMAKE_CURRENT_BINARY_DIR}/*.c") 
      add_executable(my_exe <list of normal sources> ${generated_sources}) 
      

      , 이것은 가장 간단한 방법입니다 그냥 작동합니다.

      입력 파일을 변경하려는 경우 CMake가 이러한 변경을 감지하고 소스를 재생성해야한다고 생각하면 더 많은 조치를 취해야합니다. 예를 들어 입력 파일을 먼저 빌드 디렉토리에 복사 할 수 있습니다 (configure_file(COPY_ONLY)). 이 경우 입력 파일을 추적 할 것이며, 그들이 변경된 경우 CMake가 다시 실행됩니다 : 파일이 그들로부터 생성 될 것입니다 결정에 대한

      set(build_input_files) # Will be list of files copied into build tree 
      foreach(input_file <list of .asn1 files>) 
          # Extract name of the file for generate path of the file in the build tree 
          get_filename_component(input_file_name ${input_file} NAME) 
          # Path to the file created by copy 
          set(build_input_file ${CMAKE_CURRENT_BINARY_DIR}/${input_file_name}) 
          # Copy file 
          configure_file(${input_file} ${build_input_file} COPY_ONLY) 
          # Add name of created file into the list 
          list(APPEND build_input_files ${build_input_file}) 
      endforeach() 
      
      execute_process(COMMAND asn1c ${build_input_files}) 
      file(GLOB generated_sources "${CMAKE_CURRENT_BINARY_DIR}/*.c") 
      add_executable(my_exe <list of normal sources> ${generated_sources}) 
      
    2. 구문 분석 입력 파일을.

      set(input_files <list of .asn1 files>) 
      execute_process(COMMAND <determine_output_files> ${input_files} 
          OUTPUT_VARIABLE generated_sources) 
      add_executable(my_exe <list of normal sources> ${generated_sources}) 
      add_custom_command(OUTPUT ${generated_sources} 
          COMMAND asn1c ${input_files} 
          DEPENDS ${input_files}) 
      

      이 경우 CMake 당신이 다시 실행 할 필요가 생성 된 소스 파일의 목록의 변경의 경우에는 입력 파일의 변경 (그러나 감지합니다 : 그것은 .asn1 작동하지만 일부 형식이가 작동하는지 확실하지 않음 cmake수동으로).

    +0

    실제 문제는 'asn1c' 실행 파일을 실제로 빌드하기 위해'CMake'를 사용하기 때문에 빌드 단계 전에 실행할 수 없습니다. – Svalorzen

    +0

    'execute_process()'로 * 설정 단계 *에서 서브 프로젝트로 asn1c를 빌드 할 수 있습니다. 이것은 좋은 결정처럼 보입니다. 빌드 단계 *에서 모든 것을 빌드 할 것을 지연 할 필요가 없습니다. – Tsyvarev