Prosperoh
(Prosperoh)
April 5, 2022, 1:53pm
1
Hi all!
I have an external submodule that I want to include in my project. In its own CMakeLists.txt it uses the value of an environment variable to define some macros and include some modules. The user is expected to define this environment variable before using add_subdirectory.
I have two different targets (executables) in my project for which the submodule should be included, but for each target with a different environment variable value. Similar to being able to “use add_subdirectory twice, once per target”. But it seems that I can only “use add_subdirectory once”.
Thank you, all the best!
you may use this form:
add_subdirectory(subdir ${CMAKE_BINARY_DIR}/variant1)
add_subdirectory(subdir ${CMAKE_BINARY_DIR}/variant2)
Do you need to set a set(CMAKE_VAR ...)
or really on $ENV{VAR}
before?
Prosperoh
(Prosperoh)
April 5, 2022, 3:22pm
3
Just a set(CMAKE_VAR ...)
, my bad.
Than I would try it indirect:
create 2 subdirectories with a simple CMakeLists.txt
as proxy to the extern subdirs as above.
In this CMakeLists.txt
set the needed variable before add_subdirectory()
Prosperoh
(Prosperoh)
April 6, 2022, 9:06am
5
Though I’m not sure if I understood correctly, I tried something along these words and CMake complains about the duplicate library name of the module I’m trying to use.
It might be easier if I just give the module I’m using and its CMakeLists.txt:
cmake_minimum_required(VERSION 3.12.0)
project(SingleApplication LANGUAGES CXX)
set(CMAKE_AUTOMOC ON)
add_library(${PROJECT_NAME} STATIC
singleapplication.cpp
singleapplication_p.cpp
)
add_library(${PROJECT_NAME}::${PROJECT_NAME} ALIAS ${PROJECT_NAME})
if(NOT QT_DEFAULT_MAJOR_VERSION)
set(QT_DEFAULT_MAJOR_VERSION 5 CACHE STRING "Qt version to use (5 or 6), defaults to 5")
endif()
# Find dependencies
set(QT_COMPONENTS Core Network)
set(QT_LIBRARIES Qt${QT_DEFAULT_MAJOR_VERSION}::Core Qt${QT_DEFAULT_MAJOR_VERSION}::Network)
This file has been truncated. show original
EDIT: The CMake variable I have to define is QAPPLICATION_CLASS
.
it works on OSX
with brew
:
bash-3.2$ cmake -B build -S . -G Ninja
# ...
bash-3.2$ cmake --build build --target all
[0/7] Re-running CMake...
-- CPM: adding package SingleApplication@3.3.4 (v3.3.4 at /Users/clausklein/.cache/CPM/singleapplication/23aa3f1b96d47fedade6f45b8b73e103ad2a2fb8)
-- Configuring done
-- Generating done
-- Build files have been written to: /Users/clausklein/build
[7/7] Linking CXX executable basic
bash-3.2$
cmake_minimum_required(VERSION 3.21...3.23)
project(basic LANGUAGES CXX)
# ---- Add dependencies via CPM ----
# see https://github.com/TheLartians/CPM.cmake for more info
include(cmake/CPM.cmake)
set(Qt5_DIR /usr/local/Cellar/qt@5/5.15.3/lib/cmake/qt5)
find_package(Qt5 COMPONENTS Core REQUIRED)
# SingleApplication base class
CPMAddPackage(
NAME QCoreApplication
GIT_TAG v3.3.4
GITHUB_REPOSITORY itay-grudev/SingleApplication
OPTIONS "QAPPLICATION_CLASS QCoreApplication"
#or OPTIONS "QAPPLICATION_CLASS QApplication"
)
add_executable(basic ${SingleApplication_SOURCE_DIR}/examples/basic/main.cpp)
target_link_libraries(basic SingleApplication::SingleApplication)
This shows how to compile a QT5 application only with a single CMakeLists.txt.
(no sources"!)
P.S.: it is a cmake project
packages, not a git submodule
This may be the second variant:
cmake_minimum_required(VERSION 3.21...3.23)
project(calculator LANGUAGES CXX)
# ---- Add dependencies via CPM ----
# see https://github.com/TheLartians/CPM.cmake for more info
include(cmake/CPM.cmake)
set(Qt5_DIR /usr/local/Cellar/qt@5/5.15.3/lib/cmake/qt5)
find_package(Qt5 COMPONENTS Core REQUIRED)
set(CMAKE_AUTOMOC ON)
# SingleApplication base class
CPMAddPackage(
NAME QApplication
#or NAME QCoreApplication
GIT_TAG v3.3.4
GITHUB_REPOSITORY itay-grudev/SingleApplication
#or OPTIONS "QAPPLICATION_CLASS QCoreApplication"
OPTIONS "QAPPLICATION_CLASS QApplication"
)
#or add_executable(basic ${SingleApplication_SOURCE_DIR}/examples/basic/main.cpp)
add_executable(${PROJECT_NAME}
${SingleApplication_SOURCE_DIR}/examples/calculator/button.h
${SingleApplication_SOURCE_DIR}/examples/calculator/calculator.h
${SingleApplication_SOURCE_DIR}/examples/calculator/button.cpp
${SingleApplication_SOURCE_DIR}/examples/calculator/calculator.cpp
${SingleApplication_SOURCE_DIR}/examples/calculator/main.cpp
)
target_include_directories(${PROJECT_NAME} PUBLIC ${SingleApplication_SOURCE_DIR}/examples/calculator)
target_link_libraries(${PROJECT_NAME} SingleApplication::SingleApplication)