Skip to content

Commit 96733f1

Browse files
committed
Make cmkr bootstrapper more robust
1 parent 7b7b260 commit 96733f1

File tree

5 files changed

+44
-22
lines changed

5 files changed

+44
-22
lines changed

CMakeLists.txt

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -31,7 +31,7 @@ project(cmkr
3131
LANGUAGES
3232
CXX
3333
VERSION
34-
0.1.3
34+
0.1.4
3535
DESCRIPTION
3636
"CMakeLists generator from TOML"
3737
)

cmake/CMakeLists.txt

Lines changed: 31 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -1,27 +1,44 @@
11
# This file was generated automatically by cmkr.
22

3-
# Regenerate CMakeLists.txt file when necessary
4-
include(cmkr.cmake OPTIONAL RESULT_VARIABLE CMKR_INCLUDE_RESULT)
3+
cmake_minimum_required(VERSION 3.15)
54

6-
if(CMKR_INCLUDE_RESULT)
7-
cmkr()
8-
endif()
5+
# Regenerate CMakeLists.txt automatically in the root project
6+
set(CMKR_ROOT_PROJECT OFF)
7+
if(CMAKE_CURRENT_SOURCE_DIR STREQUAL CMAKE_SOURCE_DIR)
8+
set(CMKR_ROOT_PROJECT ON)
99

10-
cmake_minimum_required(VERSION 3.15)
10+
# Bootstrap cmkr
11+
include(cmkr.cmake OPTIONAL RESULT_VARIABLE CMKR_INCLUDE_RESULT)
12+
if(CMKR_INCLUDE_RESULT)
13+
cmkr()
14+
endif()
1115

12-
set_property(GLOBAL PROPERTY USE_FOLDERS ON)
16+
# Enable folder support
17+
set_property(GLOBAL PROPERTY USE_FOLDERS ON)
18+
endif()
1319

14-
set(example_PROJECT_VERSION 0.1.0)
15-
project(example VERSION ${example_PROJECT_VERSION})
20+
# Create a configure-time dependency on cmake.toml to improve IDE support
21+
if(CMKR_ROOT_PROJECT)
22+
configure_file(cmake.toml cmake.toml COPYONLY)
23+
endif()
1624

17-
set(EXAMPLE_SOURCES
18-
src/example.cpp
19-
cmake.toml
25+
project(example
26+
VERSION
27+
0.1.0
2028
)
2129

22-
add_executable(example ${EXAMPLE_SOURCES})
30+
# Target example
31+
set(example_SOURCES
32+
"src/example.cpp"
33+
cmake.toml
34+
)
2335

24-
source_group(TREE ${PROJECT_SOURCE_DIR} FILES ${EXAMPLE_SOURCES})
36+
add_executable(example ${example_SOURCES})
2537

38+
get_directory_property(CMKR_VS_STARTUP_PROJECT DIRECTORY ${PROJECT_SOURCE_DIR} DEFINITION VS_STARTUP_PROJECT)
39+
if(NOT CMKR_VS_STARTUP_PROJECT)
40+
set_property(DIRECTORY ${PROJECT_SOURCE_DIR} PROPERTY VS_STARTUP_PROJECT example)
41+
endif()
2642

43+
source_group(TREE ${CMAKE_CURRENT_SOURCE_DIR} FILES ${example_SOURCES})
2744

cmake/cmake.toml

Lines changed: 2 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1,13 +1,12 @@
11
# This is a minimal example project used for testing the cmkr bootstrapping process
22

33
[cmake]
4-
minimum = "3.15"
4+
version = "3.15"
55

66
[project]
77
name = "example"
88
version = "0.1.0"
99

10-
[[target]]
11-
name = "example"
10+
[target.example]
1211
type = "executable"
1312
sources = ["src/example.cpp"]

cmake/cmkr.cmake

Lines changed: 9 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -2,7 +2,7 @@ include_guard()
22

33
# Change these defaults to point to your infrastructure if desired
44
set(CMKR_REPO "https://github.com/MoAlyousef/cmkr" CACHE STRING "cmkr git repository")
5-
set(CMKR_TAG "archive_84f6b39f" CACHE STRING "cmkr git tag (this needs to be available forever)")
5+
set(CMKR_TAG "archive_7b7b2603" CACHE STRING "cmkr git tag (this needs to be available forever)")
66
set(CMKR_EXECUTABLE "" CACHE FILEPATH "cmkr executable")
77
set(CMKR_SKIP_GENERATION OFF CACHE BOOL "skip automatic cmkr generation")
88

@@ -45,7 +45,14 @@ else()
4545
endif()
4646

4747
# Use cached cmkr if found
48-
set(CMKR_CACHED_EXECUTABLE "${CMAKE_CURRENT_BINARY_DIR}/_cmkr/bin/${CMKR_EXECUTABLE_NAME}")
48+
set(CMKR_DIRECTORY "${CMAKE_CURRENT_BINARY_DIR}/_cmkr_${CMKR_TAG}")
49+
set(CMKR_CACHED_EXECUTABLE "${CMKR_DIRECTORY}/bin/${CMKR_EXECUTABLE_NAME}")
50+
51+
if(NOT CMKR_CACHED_EXECUTABLE STREQUAL CMKR_EXECUTABLE AND CMKR_EXECUTABLE MATCHES "^${CMAKE_CURRENT_BINARY_DIR}/_cmkr")
52+
message(AUTHOR_WARNING "[cmkr] Upgrading '${CMKR_EXECUTABLE}' to '${CMKR_CACHED_EXECUTABLE}'")
53+
unset(CMKR_EXECUTABLE CACHE)
54+
endif()
55+
4956
if(CMKR_EXECUTABLE AND EXISTS "${CMKR_EXECUTABLE}")
5057
message(VERBOSE "[cmkr] Found cmkr: '${CMKR_EXECUTABLE}'")
5158
elseif(CMKR_EXECUTABLE AND NOT CMKR_EXECUTABLE STREQUAL CMKR_CACHED_EXECUTABLE)
@@ -55,7 +62,6 @@ else()
5562
message(VERBOSE "[cmkr] Bootstrapping '${CMKR_EXECUTABLE}'")
5663

5764
message(STATUS "[cmkr] Fetching cmkr...")
58-
set(CMKR_DIRECTORY "${CMAKE_CURRENT_BINARY_DIR}/_cmkr")
5965
if(EXISTS "${CMKR_DIRECTORY}")
6066
cmkr_exec("${CMAKE_COMMAND}" -E rm -rf "${CMKR_DIRECTORY}")
6167
endif()

src/cmkrlib/gen.cpp

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -336,7 +336,7 @@ int generate_cmake(const char *path, bool root) {
336336
};
337337

338338
// TODO: add link with proper documentation
339-
comment("This file was generated automatically by cmkr.").endl();
339+
comment("This file is automatically generated from cmake.toml - DO NOT EDIT").endl();
340340

341341
cmake::CMake cmake(path, false);
342342

0 commit comments

Comments
 (0)