AskOverflow.Dev

AskOverflow.Dev Logo AskOverflow.Dev Logo

AskOverflow.Dev Navigation

  • Início
  • system&network
  • Ubuntu
  • Unix
  • DBA
  • Computer
  • Coding
  • LangChain

Mobile menu

Close
  • Início
  • system&network
    • Recentes
    • Highest score
    • tags
  • Ubuntu
    • Recentes
    • Highest score
    • tags
  • Unix
    • Recentes
    • tags
  • DBA
    • Recentes
    • tags
  • Computer
    • Recentes
    • tags
  • Coding
    • Recentes
    • tags
Início / coding / Perguntas / 79452002
Accepted
sdbbs
sdbbs
Asked: 2025-02-19 23:59:02 +0800 CST2025-02-19 23:59:02 +0800 CST 2025-02-19 23:59:02 +0800 CST

Forçar o CMake a gerar arquivos de compilação (Makefile) em um ponto arbitrário em CMakeLists.txt?

  • 772

Tenho este trecho no CMakeLists.txtmeu projeto raspberrypi/pico-sdk , onde chamo condicionalmente a pico_sdk_init()função (ou seja, macro):

# ...

if(myCONDITION STREQUAL "Something")

  message("*** BEFORE pico_sdk_init() ***")
  pico_sdk_init()
  
  message("*** BEFORE return() ***")
  return() # exit for debug
  
  # other CMake conditional code commands continue here ...
  
endif() # myCONDITION STREQUAL "Something"

# ...

Então, eu faço isso mkdir build && cd buildno diretório do projeto onde ele CMakeLists.txtestá e então executo cmake- neste caso, obtenho uma saída como esta:

$ cmake ../ -DCMAKE_BUILD_TYPE=Debug -G "MSYS Makefiles"
...
*** BEFORE pico_sdk_init() ***
Build type is Debug
...
Using PICO_EXAMPLES_PATH from environment ...
*** BEFORE return() ***
-- Configuring done
-- Generating done
-- Build files have been written to: C:/path/to/myproject/build

Depois disso, se eu verificar na ./buildsubpasta, tenho um Makefilelá (e em vários outros locais):

$ find . -name Makefile
./Makefile
./pico-sdk/docs/Makefile
./pico-sdk/Makefile
./pico-sdk/src/common/boot_picobin_headers/Makefile
...
./pico-sdk/src/rp2_common/tinyusb/Makefile
./pico-sdk/tools/Makefile

... e para a Makefilesubpasta ./build, tenho os seguintes alvos:

$ make #press [TAB] here
all                                              default_target
bs2_default/fast                                 depend
bs2_default_bin/fast                             edit_cache/fast
bs2_default_library/fast                         help
clean/fast                                       pioasmBuild/fast
cmake_check_build_system                         preinstall/fast
cmake_force                                      rebuild_cache/fast
cyw43_driver_picow_cyw43_bus_pio_spi_pio_h/fast

Então, eu posso executar, digamos, make pioasmBuildneste ponto, e ele será construído corretamente:

$ make pioasmBuild
Scanning dependencies of target pioasmBuild
[ 12%] Creating directories for 'pioasmBuild'
[ 25%] No download step for 'pioasmBuild'
...
Scanning dependencies of target pioasm
[100%] Built target pioasm
[ 87%] Performing install step for 'pioasmBuild'
[100%] Built target pioasm
Install the project...
-- Install configuration: "Release"
[100%] Completed 'pioasmBuild'
[100%] Built target pioasmBuild

$ find . -name pioasm.exe
./pioasm/pioasm.exe
./pioasm-install/pioasm/pioasm.exe

Ótimo.

Agora, digamos que eu não queira sair para depuração com return()- mas, em vez disso, naquele ponto, eu queira executar o equivalente a make pioasmBuild: então, daquele ponto em diante, pioasm.exeestá disponível para os "outros comandos de código condicional do CMake"; para isso, eu reescrevo meu snippet como:

# ...

if(myCONDITION STREQUAL "Something")

  message("*** BEFORE pico_sdk_init() ***")
  pico_sdk_init()
  
  
  execute_process(
    # this command, the equivalent of `make pioasmBuild`, fails with "Error: could not load cache"
    COMMAND ${CMAKE_COMMAND} --build . --target pioasmBuild
    WORKING_DIRECTORY ${CMAKE_BINARY_DIR}
  )
  
  message("*** NOT anymore BEFORE return() ***")
  #return() # exit for debug
  
  # other CMake conditional code commands continue here ...
  
endif() # myCONDITION STREQUAL "Something"

# ...

Como o comentário já sugere, o equivalente a make pioasmBuildneste ponto falha - depois de limpar rm -rf *no ./buildsubdiretório, isto é o que obtenho na cmakesaída:

$ cmake ../ -DCMAKE_BUILD_TYPE=Debug -G "MSYS Makefiles"
...
*** BEFORE pico_sdk_init() ***
Build type is Debug
...
Using PICO_EXAMPLES_PATH from environment ...
Error: could not load cache
*** NOT anymore BEFORE return() ***
... other CMake conditional code commands continue here ...

Então, até onde posso ver, isso Error: could not load cacheacontece porque, naquele ponto, a Makefilesubpasta ainda não ./buildfoi criada !

Na verdade, pelo que entendi do processo neste momento: a criação disso Makefileem ./build, no caso anterior, foi desencadeada pela return()própria saída antecipada!

Então, minha pergunta é: existe uma maneira canônica de forçar o CMake a ter a configuração, geração e gravação de arquivos de compilação a serem concluídos neste (ou arbitrário) ponto do CMakeLists.txtarquivo (usando quaisquer dados disponíveis naquele ponto; e pelo menos neste caso, como mostrado anteriormente, há dados suficientes naquele ponto para gerar um Makefile) funcional - sem forçar o cmakeprocesso a sair naquele ponto em CMakeLists.txt, mas em vez disso prosseguir com os comandos restantes (incluindo possivelmente a compilação de um destino naquele gerado anteriormente/antecipadamente Makefile, diretamente do CMake)?

(É claro que, em tal caso de "geração inicial", quando o CMakeLists.txtatinge seu fim "natural", todos os Makefiles e arquivos de compilação relacionados seriam simplesmente substituídos, possivelmente com, por exemplo, mais alvos, resultando em mais dados devido à execução do restante do arquivo)

cmake
  • 1 1 respostas
  • 13 Views

1 respostas

  • Voted
  1. Best Answer
    Stephen Newell
    2025-02-20T00:06:20+08:002025-02-20T00:06:20+08:00

    Não há como fazer isso, pois pode haver outras informações sobre os alvos que vêm depois nos CMakeLists.txtarquivos. O que você quer fazer em vez disso é adicionar uma dependência em pioasmBuildqualquer lugar que precise dela, pois isso configura suas dependências de build reais corretamente.

    add_dependencies(my_target pioasmBuild)
    

    No entanto, eu recomendaria compilar pioasmBuildseparadamente e usar find_executableem vez disso. Se você estiver compilando de forma cruzada, você compilaria alvos usando o compilador cruzado e, portanto, não poderá usá-los em sua máquina nativa.

    • 1

relate perguntas

  • Configurando opções de compilação com CMake a partir de valores provenientes de um arquivo gerado dinamicamente

  • Problema ao escapar de ponto e vírgula e aspas no cmake

  • O CMakePresets.json configurePreset pode impor sua condição e uma condição herdada?

  • O processador do sistema está disponível em CMakePreset.json?

  • É necessário ou útil no CMake escrever algo uma vez para geradores de configuração única sem expressões de gerador e novamente para multiconfiguração?

Sidebar

Stats

  • Perguntas 205573
  • respostas 270741
  • best respostas 135370
  • utilizador 68524
  • Highest score
  • respostas
  • Marko Smith

    Reformatar números, inserindo separadores em posições fixas

    • 6 respostas
  • Marko Smith

    Por que os conceitos do C++20 causam erros de restrição cíclica, enquanto o SFINAE antigo não?

    • 2 respostas
  • Marko Smith

    Problema com extensão desinstalada automaticamente do VScode (tema Material)

    • 2 respostas
  • Marko Smith

    Vue 3: Erro na criação "Identificador esperado, mas encontrado 'import'" [duplicado]

    • 1 respostas
  • Marko Smith

    Qual é o propósito de `enum class` com um tipo subjacente especificado, mas sem enumeradores?

    • 1 respostas
  • Marko Smith

    Como faço para corrigir um erro MODULE_NOT_FOUND para um módulo que não importei manualmente?

    • 6 respostas
  • Marko Smith

    `(expression, lvalue) = rvalue` é uma atribuição válida em C ou C++? Por que alguns compiladores aceitam/rejeitam isso?

    • 3 respostas
  • Marko Smith

    Um programa vazio que não faz nada em C++ precisa de um heap de 204 KB, mas não em C

    • 1 respostas
  • Marko Smith

    PowerBI atualmente quebrado com BigQuery: problema de driver Simba com atualização do Windows

    • 2 respostas
  • Marko Smith

    AdMob: MobileAds.initialize() - "java.lang.Integer não pode ser convertido em java.lang.String" para alguns dispositivos

    • 1 respostas
  • Martin Hope
    Fantastic Mr Fox Somente o tipo copiável não é aceito na implementação std::vector do MSVC 2025-04-23 06:40:49 +0800 CST
  • Martin Hope
    Howard Hinnant Encontre o próximo dia da semana usando o cronógrafo 2025-04-21 08:30:25 +0800 CST
  • Martin Hope
    Fedor O inicializador de membro do construtor pode incluir a inicialização de outro membro? 2025-04-15 01:01:44 +0800 CST
  • Martin Hope
    Petr Filipský Por que os conceitos do C++20 causam erros de restrição cíclica, enquanto o SFINAE antigo não? 2025-03-23 21:39:40 +0800 CST
  • Martin Hope
    Catskul O C++20 mudou para permitir a conversão de `type(&)[N]` de matriz de limites conhecidos para `type(&)[]` de matriz de limites desconhecidos? 2025-03-04 06:57:53 +0800 CST
  • Martin Hope
    Stefan Pochmann Como/por que {2,3,10} e {x,3,10} com x=2 são ordenados de forma diferente? 2025-01-13 23:24:07 +0800 CST
  • Martin Hope
    Chad Feller O ponto e vírgula agora é opcional em condicionais bash com [[ .. ]] na versão 5.2? 2024-10-21 05:50:33 +0800 CST
  • Martin Hope
    Wrench Por que um traço duplo (--) faz com que esta cláusula MariaDB seja avaliada como verdadeira? 2024-05-05 13:37:20 +0800 CST
  • Martin Hope
    Waket Zheng Por que `dict(id=1, **{'id': 2})` às vezes gera `KeyError: 'id'` em vez de um TypeError? 2024-05-04 14:19:19 +0800 CST
  • Martin Hope
    user924 AdMob: MobileAds.initialize() - "java.lang.Integer não pode ser convertido em java.lang.String" para alguns dispositivos 2024-03-20 03:12:31 +0800 CST

Hot tag

python javascript c++ c# java typescript sql reactjs html

Explore

  • Início
  • Perguntas
    • Recentes
    • Highest score
  • tag
  • help

Footer

AskOverflow.Dev

About Us

  • About Us
  • Contact Us

Legal Stuff

  • Privacy Policy

Language

  • Pt
  • Server
  • Unix

© 2023 AskOverflow.DEV All Rights Reserve