From 74026fde9a2766cc7189df1a093ebf5b8e044062 Mon Sep 17 00:00:00 2001 From: Dadoum Date: Sun, 5 Sep 2021 12:31:38 +0200 Subject: [PATCH 01/16] Use FetchContent for better integration in CMake --- cmake-d/UseDub.cmake | 20 +++++++------------- cmake-d/UseDub/DubToCMake.d | 10 +++++++--- 2 files changed, 14 insertions(+), 16 deletions(-) diff --git a/cmake-d/UseDub.cmake b/cmake-d/UseDub.cmake index fa9b226..10055e3 100644 --- a/cmake-d/UseDub.cmake +++ b/cmake-d/UseDub.cmake @@ -46,7 +46,7 @@ if(NOT EXISTS ${DUB_DIRECTORY}/CMakeTmp/DubToCMake) unset(DUB_PACKAGE_TO_CMAKE_D_SRC CACHE) endif() -include(ExternalProject) +include(FetchContent) function(DubProject_Add name) if(NOT EXISTS ${DUB_DIRECTORY}/${name}.json) @@ -69,16 +69,10 @@ function(DubProject_Add name) include(${DUB_DIRECTORY}/${name}.cmake) - ExternalProject_Add(${name} - DOWNLOAD_DIR ${DUB_DIRECTORY}/archive/${name} - SOURCE_DIR ${DUB_DIRECTORY}/source/${name} - URL ${DUB_PACKAGE_URL} - PATCH_COMMAND ${DUB_DIRECTORY}/CMakeTmp/DubToCMake -p package.json - INSTALL_DIR ${DUB_DIRECTORY}/export - CMAKE_CACHE_ARGS - -DCMAKE_MODULE_PATH:PATH=${CMAKE_MODULE_PATH} - -DCMAKE_INSTALL_PREFIX:PATH= - -DDUB_DIRECTORY:PATH=${DUB_DIRECTORY}) - - include_directories(${DUB_DIRECTORY}/source/${name}/source ${DUB_DIRECTORY}/source/${name}/src) + FetchContent_Declare( + ${name} + URL ${DUB_PACKAGE_URL} + PATCH_COMMAND ${DUB_DIRECTORY}/CMakeTmp/DubToCMake + ) + FetchContent_MakeAvailable(${name}) endfunction() diff --git a/cmake-d/UseDub/DubToCMake.d b/cmake-d/UseDub/DubToCMake.d index 9c9a204..d9734c3 100644 --- a/cmake-d/UseDub/DubToCMake.d +++ b/cmake-d/UseDub/DubToCMake.d @@ -34,13 +34,13 @@ find_file(APP_MAIN_FILE NAMES app.d main.d %1$s/main.d %1$s/app.d PATHS source src NO_DEFAULT_PATH) -file(GLOB_RECURSE SRC_FILES source/*.d src/*.d) +file(GLOB_RECURSE SRC_FILES %-(%s/*.d %)) if(APP_MAIN_FILE) list(REMOVE_ITEM SRC_FILES ${APP_MAIN_FILE}) endif() include_directories(source src) ->".format(root["name"].str); +>".format(root["name"].str, root["importPaths"].array); switch ("targetType" in root.object ? root["targetType"].str : "autodetect") { @@ -82,6 +82,10 @@ add_library(%s SHARED ${SRC_FILES}) break; } + cmake ~= q"< +target_include_directories(%s PUBLIC %-(%s %)) +>".format(target, root["importPaths"].array); + cmake ~= q"< install(TARGETS %s RUNTIME DESTINATION bin @@ -97,7 +101,7 @@ install(TARGETS %s string version_ = "~" ~ dubRoot["packages"].array.find!((obj) => obj["name"] == dependency)[0]["version"].str; cmake ~= "DubProject_Add(%s %s)\n".format(dependency, version_); } - cmake ~= "\nadd_dependencies(%s %-(%s %))\n".format(target, root["dependencies"].array); + cmake ~= "\ntarget_link_libraries(%s %-(%s %))\n".format(target, root["dependencies"].array); } std.file.write(cmakeFile, cmake); From cbc7e8ff98f5d78eebfa9d205ef16f39f74d358c Mon Sep 17 00:00:00 2001 From: Dadoum Date: Mon, 6 Sep 2021 14:04:06 +0200 Subject: [PATCH 02/16] Use FetchContent for better integration in CMake, fix bugs --- cmake-d/UseDub/DubToCMake.d | 10 ++++------ 1 file changed, 4 insertions(+), 6 deletions(-) diff --git a/cmake-d/UseDub/DubToCMake.d b/cmake-d/UseDub/DubToCMake.d index d9734c3..1c5000b 100644 --- a/cmake-d/UseDub/DubToCMake.d +++ b/cmake-d/UseDub/DubToCMake.d @@ -34,13 +34,11 @@ find_file(APP_MAIN_FILE NAMES app.d main.d %1$s/main.d %1$s/app.d PATHS source src NO_DEFAULT_PATH) -file(GLOB_RECURSE SRC_FILES %-(%s/*.d %)) +file(GLOB_RECURSE SRC_FILES %2$-(%s %)) if(APP_MAIN_FILE) list(REMOVE_ITEM SRC_FILES ${APP_MAIN_FILE}) endif() - -include_directories(source src) ->".format(root["name"].str, root["importPaths"].array); +>".format(root["name"].str, root["importPaths"].array.map!((val) => val.str ~ "/*.d")); switch ("targetType" in root.object ? root["targetType"].str : "autodetect") { @@ -84,7 +82,7 @@ add_library(%s SHARED ${SRC_FILES}) cmake ~= q"< target_include_directories(%s PUBLIC %-(%s %)) ->".format(target, root["importPaths"].array); +>".format(target, root["importPaths"].array.map!((val) => val.str)); cmake ~= q"< install(TARGETS %s @@ -101,7 +99,7 @@ install(TARGETS %s string version_ = "~" ~ dubRoot["packages"].array.find!((obj) => obj["name"] == dependency)[0]["version"].str; cmake ~= "DubProject_Add(%s %s)\n".format(dependency, version_); } - cmake ~= "\ntarget_link_libraries(%s %-(%s %))\n".format(target, root["dependencies"].array); + cmake ~= "\ntarget_link_libraries(%s %-(%s %))\n".format(target, root["dependencies"].array.map!((val) => val.str)); } std.file.write(cmakeFile, cmake); From 57d1a2447c2e1148432aae7c78ff33a3b1f529e3 Mon Sep 17 00:00:00 2001 From: Dadoum Date: Sun, 28 Nov 2021 15:46:14 +0100 Subject: [PATCH 03/16] =?UTF-8?q?Un=20tas=20d'am=C3=A9lioration=20diverses?= =?UTF-8?q?=20!=20On=20peut=20utiliser=20vibe-d=20!=20(a=20lot=20of=20impr?= =?UTF-8?q?ovements!=20we=20can=20now=20reference=20vibe-d!)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- cmake-d/Platform/Darwin-dmd.cmake | 1 + cmake-d/Platform/Darwin-ldc2.cmake | 1 + cmake-d/Platform/Linux-dmd.cmake | 1 + cmake-d/Platform/Linux-ldc2.cmake | 1 + cmake-d/Platform/Windows-dmd.cmake | 1 + cmake-d/UseDDeps.cmake | 62 +++-------- cmake-d/UseDub.cmake | 36 +++++-- cmake-d/UseDub/DubToCMake.d | 167 ++++++++++++++++++++++------- cmake-d/UseDub/DubUrl.d | 1 + 9 files changed, 179 insertions(+), 92 deletions(-) diff --git a/cmake-d/Platform/Darwin-dmd.cmake b/cmake-d/Platform/Darwin-dmd.cmake index 6894491..3b0a8f7 100644 --- a/cmake-d/Platform/Darwin-dmd.cmake +++ b/cmake-d/Platform/Darwin-dmd.cmake @@ -65,3 +65,4 @@ set(CMAKE_D_FLAGS_RELWITHDEBINFO_INIT "-O -g -L-export_dynamic ${DDOC_FLAGS}") # set(CMAKE_D_CREATE_PREPROCESSED_SOURCE " -E > ") set(CMAKE_D_CREATE_ASSEMBLY_SOURCE " -S -of") # set(CMAKE_INCLUDE_SYSTEM_FLAG_D "-isystem ") +set(CMAKE_D_VERSION_FLAG "-version=") diff --git a/cmake-d/Platform/Darwin-ldc2.cmake b/cmake-d/Platform/Darwin-ldc2.cmake index 4d17aa9..11647f6 100644 --- a/cmake-d/Platform/Darwin-ldc2.cmake +++ b/cmake-d/Platform/Darwin-ldc2.cmake @@ -61,3 +61,4 @@ set(CMAKE_D_FLAGS_RELWITHDEBINFO_INIT "-O -g -L-export_dynamic ${DDOC_FLAGS}") # set(CMAKE_D_CREATE_PREPROCESSED_SOURCE " -E > ") set(CMAKE_D_CREATE_ASSEMBLY_SOURCE " -S -of") # set(CMAKE_INCLUDE_SYSTEM_FLAG_D "-isystem ") +set(CMAKE_D_VERSION_FLAG "--d-version=") diff --git a/cmake-d/Platform/Linux-dmd.cmake b/cmake-d/Platform/Linux-dmd.cmake index 1cf610c..ae6dc99 100644 --- a/cmake-d/Platform/Linux-dmd.cmake +++ b/cmake-d/Platform/Linux-dmd.cmake @@ -65,3 +65,4 @@ set(CMAKE_D_FLAGS_RELWITHDEBINFO_INIT "-O -g -L--export-dynamic ${DDOC_FLAGS}") # set(CMAKE_D_CREATE_PREPROCESSED_SOURCE " -E > ") set(CMAKE_D_CREATE_ASSEMBLY_SOURCE " -S -of") # set(CMAKE_INCLUDE_SYSTEM_FLAG_D "-isystem ") +set(CMAKE_D_VERSION_FLAG "-version=") diff --git a/cmake-d/Platform/Linux-ldc2.cmake b/cmake-d/Platform/Linux-ldc2.cmake index 7b06a80..c8522d2 100644 --- a/cmake-d/Platform/Linux-ldc2.cmake +++ b/cmake-d/Platform/Linux-ldc2.cmake @@ -61,3 +61,4 @@ set(CMAKE_D_FLAGS_RELWITHDEBINFO_INIT "-O -g -L--export-dynamic ${DDOC_FLAGS}") # set(CMAKE_D_CREATE_PREPROCESSED_SOURCE " -E > ") set(CMAKE_D_CREATE_ASSEMBLY_SOURCE " -S -of") # set(CMAKE_INCLUDE_SYSTEM_FLAG_D "-isystem ") +set(CMAKE_D_VERSION_FLAG "--d-version=") diff --git a/cmake-d/Platform/Windows-dmd.cmake b/cmake-d/Platform/Windows-dmd.cmake index def1fd3..ae90851 100644 --- a/cmake-d/Platform/Windows-dmd.cmake +++ b/cmake-d/Platform/Windows-dmd.cmake @@ -54,3 +54,4 @@ set(CMAKE_D_FLAGS_DEBUG_INIT "-g -debug ${DDOC_FLAGS}") set(CMAKE_D_FLAGS_RELEASE_INIT "-O -release -inline ${DDOC_FLAGS}") set(CMAKE_D_FLAGS_RELWITHDEBINFO_INIT "-O -g ${DDOC_FLAGS}") set(CMAKE_D_CREATE_ASSEMBLY_SOURCE " -S -of") +set(CMAKE_D_VERSION_FLAG "-version=") diff --git a/cmake-d/UseDDeps.cmake b/cmake-d/UseDDeps.cmake index 41284f5..fc1a60f 100644 --- a/cmake-d/UseDDeps.cmake +++ b/cmake-d/UseDDeps.cmake @@ -7,57 +7,27 @@ # See LICENSE for details. # -macro(add_executable_with_dependencies _target) - # extract D source files from arguments - foreach(file ${ARGV}) - if(${file} MATCHES "\\.d$") - list(APPEND d_source_files ${file}) - endif() - endforeach() +set(cmake_d_dir ${CMAKE_CURRENT_LIST_DIR}) +function(resolve_dependencies target) + get_target_property(d_source_files ${target} SOURCES) + + # extract D source files from arguments #message("D files in arguments: ${d_source_files}") - foreach(file IN LISTS d_source_files) + foreach(full_file IN LISTS d_source_files) + file(RELATIVE_PATH file "${CMAKE_CURRENT_SOURCE_DIR}" "${full_file}") set(source_file "${CMAKE_CURRENT_SOURCE_DIR}/${file}") - set(dependency_file "${CMAKE_CURRENT_BINARY_DIR}${CMAKE_FILES_DIRECTORY}/${file}-depend.cmake") + set(deps_dir "${CMAKE_CURRENT_BINARY_DIR}${CMAKE_FILES_DIRECTORY}/UseDDeps/") + set(dependency_file "${deps_dir}${file}.dep") + get_filename_component(deps_source_dir "${dependency_file}" DIRECTORY) + file(MAKE_DIRECTORY "${deps_source_dir}") set(dependency_files ${dependency_files} ${dependency_file}) - #message("Checking dependencies for ${source_file}") - #message("Put into ${dependency_file}") - # TODO - # better way to get the included directories - get_directory_property(include_dirs INCLUDE_DIRECTORIES) - set(INCLUDES ) - foreach(include_dir IN LISTS include_dirs) - list(APPEND INCLUDES "${CMAKE_INCLUDE_FLAG_D}${include_dir}") - endforeach() + add_custom_command(OUTPUT "${CMAKE_BINARY_DIR}/your_gen_file.txt" + COMMAND /bin/date > "${CMAKE_BINARY_DIR}/your_gen_file.txt" + COMMAND /bin/echo "RUNNING COMMAND") - execute_process( - COMMAND ${CMAKE_COMMAND} - -D "CMAKE_D_COMPILER:STRING=${CMAKE_D_COMPILER}" - -D "CMAKE_D_FLAGS:STRING=${CMAKE_D_FLAGS}" - -D "include_directories:STRING=${INCLUDES}" - -D "source_file:STRING=${source_file}" - -D "dependency_file:STRING=${dependency_file}" - -P "${CMAKE_ROOT}/Modules/dependencies.cmake" # TODO hard coded path - ) - - # load dependencies from file - include(${dependency_file}) - #message("DEPENDENCIES ${D_DMD_DEPEND}") - - add_custom_command( - OUTPUT ${dependency_file} - DEPENDS ${D_DMD_DEPEND} - COMMAND ${CMAKE_COMMAND} - -D "CMAKE_D_COMPILER:STRING=${CMAKE_D_COMPILER}" - -D "CMAKE_D_FLAGS:STRING=${CMAKE_D_FLAGS}" - -D "include_directories:STRING=${INCLUDES}" - -D "source_file:STRING=${source_file}" - -D "dependency_file:STRING=${dependency_file}" - -P "${CMAKE_ROOT}/Modules/dependencies.cmake" # TODO hard coded path - COMMENT "Scanning for dependencies") + set_source_files_properties("${full_file}" PROPERTIES COMPILE_FLAGS "-deps=${dependency_file}" OBJECT_DEPENDS "${dependency_file}") endforeach() - - add_executable(${ARGV} ${dependency_files}) -endmacro() +endfunction() diff --git a/cmake-d/UseDub.cmake b/cmake-d/UseDub.cmake index 10055e3..ac0d792 100644 --- a/cmake-d/UseDub.cmake +++ b/cmake-d/UseDub.cmake @@ -48,7 +48,18 @@ endif() include(FetchContent) -function(DubProject_Add name) +function(DubProject_Add name_full) + string(FIND "${name_full}" ":" subpackage) + + if(subpackage EQUAL -1) + set(name "${name_full}") + else() + string(REPLACE ":" ";" name_split ${name_full}) + + list(GET name_split 0 name) + list(GET name_split 1 subpackage) + endif() + if(NOT EXISTS ${DUB_DIRECTORY}/${name}.json) file(DOWNLOAD ${DUB_REGISTRY}/${name}.json ${DUB_DIRECTORY}/${name}.json STATUS status) list(GET status 0 statusCode) @@ -60,7 +71,7 @@ function(DubProject_Add name) endif() if(${ARGC} GREATER 1) - execute_process(COMMAND ${DUB_DIRECTORY}/CMakeTmp/DubUrl -p ${name}.json -r ${DUB_REGISTRY} -t ${ARGN} + execute_process(COMMAND ${DUB_DIRECTORY}/CMakeTmp/DubUrl -p ${name}.json -r ${DUB_REGISTRY} -t ${ARGV1} WORKING_DIRECTORY ${DUB_DIRECTORY}) else() execute_process(COMMAND ${DUB_DIRECTORY}/CMakeTmp/DubUrl -p ${name}.json -r ${DUB_REGISTRY} @@ -69,10 +80,19 @@ function(DubProject_Add name) include(${DUB_DIRECTORY}/${name}.cmake) - FetchContent_Declare( - ${name} - URL ${DUB_PACKAGE_URL} - PATCH_COMMAND ${DUB_DIRECTORY}/CMakeTmp/DubToCMake - ) - FetchContent_MakeAvailable(${name}) + if(${ARGC} GREATER 2) + FetchContent_Declare( + ${name}_proj + URL ${DUB_PACKAGE_URL} + PATCH_COMMAND ${DUB_DIRECTORY}/CMakeTmp/DubToCMake -c ${ARGV2} -s ${name_full} + ) + else() + FetchContent_Declare( + ${name}_proj + URL ${DUB_PACKAGE_URL} + PATCH_COMMAND ${DUB_DIRECTORY}/CMakeTmp/DubToCMake -s ${name_full} + ) + endif() + FetchContent_MakeAvailable(${name}_proj) + endfunction() diff --git a/cmake-d/UseDub/DubToCMake.d b/cmake-d/UseDub/DubToCMake.d index 1c5000b..25c70c2 100644 --- a/cmake-d/UseDub/DubToCMake.d +++ b/cmake-d/UseDub/DubToCMake.d @@ -1,4 +1,6 @@ import std.algorithm; +import std.algorithm.searching; +import std.array; import std.file; import std.getopt; import std.json; @@ -6,13 +8,21 @@ import std.stdio; import std.string; import std.process; +string cmakeFile = "CMakeLists.txt"; +string configuration = ""; +string dubFile = ""; +string subPackage = ""; + +string[] processedTargets = []; + +string[] configurationArg; + int main(string[] args) { - string cmakeFile = "CMakeLists.txt"; - string dubFile = ""; - getopt(args, "package|p", &dubFile, + "configuration|c", &configuration, + "subpackage|s", &subPackage, "output|o", &cmakeFile); if (dubFile != "") @@ -20,69 +30,117 @@ int main(string[] args) stderr.writeln("-p is deprecated and does not have any effect anymore. Please keep the default package file name."); } - string json = execute(["dub", "describe"]).output; - JSONValue dubRoot = parseJSON(json); + if (!configuration.empty) + configurationArg = ["-c", configuration]; + else + configurationArg = []; + + auto p = pipeProcess(["dub", "describe"] ~ configurationArg ~ [subPackage], Redirect.stdout); + + auto apd = appender!string(); + foreach (line; p.stdout.byLine) + { + apd ~= line.idup; + } + + string json = apd[]; + auto dubRoot = parseJSON(json); JSONValue root = dubRoot["packages"][0]; - string target = root["targetName"].str; - string cmake = q"< -cmake_minimum_required(VERSION 2.8) + auto cmake = appender!string(); -project(%1$s D) + cmake ~= format!q"< +# Header +cmake_minimum_required(VERSION 3.18) -find_file(APP_MAIN_FILE - NAMES app.d main.d %1$s/main.d %1$s/app.d - PATHS source src NO_DEFAULT_PATH) +project(%s D) -file(GLOB_RECURSE SRC_FILES %2$-(%s %)) -if(APP_MAIN_FILE) - list(REMOVE_ITEM SRC_FILES ${APP_MAIN_FILE}) -endif() ->".format(root["name"].str, root["importPaths"].array.map!((val) => val.str ~ "/*.d")); +>"(root["name"].str ~ "_proj"); + + cmake ~= includePackage(dubRoot, root); + + std.file.write(cmakeFile, cmake[]); + + return 0; +} + +string includePackage(JSONValue dubRoot, JSONValue root) { + string target = root["targetName"].str.replace(":", "::"); + string[] tmp = root["name"].str.split(":"); + string subTarget = ""; + if (tmp.length > 1) + subTarget = tmp[1]; + + if (processedTargets.canFind(target)) + return ""; + + string cmake = format!"# Section: %s\n"(target); + bool isInterface = false; + + cmake ~= format!"set(SRC_FILES %-(%s %))"( + root["files"].array.map!( + (val) { + if (val["role"].str == "source" || val["role"].str == "import_") { + string ifExists = (subTarget.empty ? "" : subTarget ~ "/") ~ val["path"].str; + return exists(ifExists) ? ifExists : ""; + } + else + return ""; + }).filter!(a => a != "").array + ); switch ("targetType" in root.object ? root["targetType"].str : "autodetect") { case "autodetect": - cmake ~= q"< + cmake ~= q"< +find_file(APP_MAIN_FILE + NAMES app.d main.d %1$s/main.d %1$s/app.d + PATHS source src NO_DEFAULT_PATH) + +set(SRC_FILES %2$-(%s %)) if(APP_MAIN_FILE) + list(REMOVE_ITEM SRC_FILES ${APP_MAIN_FILE}) add_executable(%1$s ${SRC_FILES} ${APP_MAIN_FILE}) else() add_library(%1$s ${SRC_FILES}) endif() >".format(target); - break; + break; case "none": - break; + cmake ~= q"< +add_library(%s INTERFACE ${SRC_FILES}) +>".format(target); + isInterface = true; + break; case "executable": - cmake ~= q"< + cmake ~= q"< add_executable(%s ${SRC_FILES} ${APP_MAIN_FILE}) >".format(target); - break; + break; case "library": - cmake ~= q"< + cmake ~= q"< add_library(%s ${SRC_FILES}) >".format(target); - break; + break; case "sourceLibrary": - break; case "staticLibrary": - cmake ~= q"< + cmake ~= q"< add_library(%s STATIC ${SRC_FILES}) >".format(target); - break; + break; case "dynamicLibrary": - cmake ~= q"< + cmake ~= q"< add_library(%s SHARED ${SRC_FILES}) >".format(target); - break; + break; default: - assert(false, "Unknown targetType"); - break; + assert(false, "Unknown targetType"); + break; } cmake ~= q"< -target_include_directories(%s PUBLIC %-(%s %)) ->".format(target, root["importPaths"].array.map!((val) => val.str)); +target_include_directories(%s %s %-(%s %)) +>".format(target, isInterface ? "INTERFACE" : "PUBLIC", root["importPaths"].array.map!((val) => val.str).array ~ (subTarget.empty ? [] : [subTarget])); cmake ~= q"< install(TARGETS %s @@ -96,13 +154,46 @@ install(TARGETS %s cmake ~= "\ninclude(UseDub)\n"; foreach (dependency; root["dependencies"].array) { - string version_ = "~" ~ dubRoot["packages"].array.find!((obj) => obj["name"] == dependency)[0]["version"].str; - cmake ~= "DubProject_Add(%s %s)\n".format(dependency, version_); + if (dependency.str.startsWith(dubRoot["rootPackage"].str.split(":")[0] ~ ":")) { + auto p = pipeProcess(["dub", "describe", dependency.str], Redirect.stdout); + + auto apd = appender!string(); + foreach (line; p.stdout.byLine) + { + apd ~= line.idup; + } + + auto newDubRoot = parseJSON(apd[]); + auto pkg = newDubRoot["packages"].array.find!((obj) => obj["name"] == dependency)[0]; + + cmake = includePackage(newDubRoot, pkg) ~ cmake; + } else { + try { + auto pkg = dubRoot["packages"].array.find!((obj) => obj["name"] == dependency)[0]; + string version_ = pkg["version"].str; + cmake ~= "DubProject_Add(%s %s)\n".format(dependency.str, version_); + } catch (Throwable) { + cmake ~= "DubProject_Add(%s)\n".format(dependency.str); + } + } } - cmake ~= "\ntarget_link_libraries(%s %-(%s %))\n".format(target, root["dependencies"].array.map!((val) => val.str)); + + cmake ~= ("\ntarget_link_libraries(%s " ~ (isInterface ? "INTERFACE" : "") ~ " %-(%s %))\n").format(target, root["dependencies"].array.map!((val) => val.str.replace(":", "::"))); } - std.file.write(cmakeFile, cmake); + if ("versions" in root.object && root["versions"].array.length > 0) { + cmake ~= format!q"< +target_compile_options(%s PUBLIC "%-(${CMAKE_D_VERSION_FLAG}%s %)") +>"(target, root["versions"].array.map!(a => a.str)); + } - return 0; + if (target != root["name"].str) + cmake ~= format!q"< +add_library(%s ALIAS %s) +>"(root["name"].str.replace(":", "::"), target); + + processedTargets ~= target; + cmake ~= format!"# End section %s \n"(target); + + return cmake; } diff --git a/cmake-d/UseDub/DubUrl.d b/cmake-d/UseDub/DubUrl.d index 691b861..26a2656 100644 --- a/cmake-d/UseDub/DubUrl.d +++ b/cmake-d/UseDub/DubUrl.d @@ -50,6 +50,7 @@ int main(string[] args) string registryUrl = "https://code.dlang.org/packages"; string registryFile = ""; string packageVersion = ""; + string configuration = ""; bool listVersions; string outputPath = "."; From d6ff943711498e7a6a7e15837e02a14dbec8f65d Mon Sep 17 00:00:00 2001 From: Dadoum Date: Sun, 5 Dec 2021 18:33:16 +0100 Subject: [PATCH 04/16] DUB, Ninja and GCC improvements - DUB is now working for GDC ! - GDC now supports versions. - Ninja CMake backend now supports the depfiles to rebuild files when needed. - More informations in the README. --- README.md | 13 ++++++-- cmake-d/CMakeLists.txt | 4 +-- cmake-d/Platform/Darwin-dmd.cmake | 1 + cmake-d/Platform/Darwin-ldc2.cmake | 1 + cmake-d/Platform/Linux-dmd.cmake | 1 + cmake-d/Platform/Linux-gdc.cmake | 2 ++ cmake-d/Platform/Linux-ldc2.cmake | 1 + cmake-d/Platform/Windows-dmd.cmake | 1 + cmake-d/Platform/Windows-gdc.cmake | 2 ++ cmake-d/UseDDeps.cmake | 33 -------------------- cmake-d/UseDDepsMakeWIP.cmake | 48 ++++++++++++++++++++++++++++++ cmake-d/UseDub.cmake | 4 +-- 12 files changed, 72 insertions(+), 39 deletions(-) delete mode 100644 cmake-d/UseDDeps.cmake create mode 100644 cmake-d/UseDDepsMakeWIP.cmake diff --git a/README.md b/README.md index 9acfe59..96956b8 100644 --- a/README.md +++ b/README.md @@ -3,14 +3,23 @@ cmake-d ======= -CMake for D2 +CMake for D2 *improved* Usage ----- -1. Download and extract https://github.com/dcarp/cmake-d/archive/master.zip to a local directory \ +1. Download and extract https://github.com/dcarp/cmake-d/archive/master.zip to a local directory \ (you can use a git submodule if you want) 2. Create a D CMake Project: project(project-name D) 3. Run cmake as usual specifing the cmake-d path. To cache it, don't forget to specify the *:PATH* variable type.
``` cmake -DCMAKE_MODULE_PATH:PATH=/cmake-d ``` + +*Tip: you can add before declaring the project `set(CMAKE_MODULE_PATH ${CMAKE_CURRENT_SOURCE_DIR}/cmake-d/cmake-d)` (the path to the folder with all cmake files) in order to use the normal CMake command.* + +Known issues +------------ + +This project is just a set of CMake files. It cannot do as much as a CMake binary patch. By example, regeneration of file acording a dependency file is hard coded in the Makefile backend; so when you edit a file and rebuild with this backend, it will build only the file you edited, leading to some deeper issues. + +*Workaround:* use Ninja backend. diff --git a/cmake-d/CMakeLists.txt b/cmake-d/CMakeLists.txt index e8301a1..33e8afc 100644 --- a/cmake-d/CMakeLists.txt +++ b/cmake-d/CMakeLists.txt @@ -9,7 +9,7 @@ # # See LICENSE for details. # -cmake_minimum_required(VERSION 2.8.1) +cmake_minimum_required(VERSION 3.20) project(cmake-d NONE) set(MOD_SRCS @@ -21,7 +21,7 @@ set(MOD_SRCS CMakeDetermineDCompiler.cmake FindGDCPath.cmake UseDDoc.cmake - UseDDeps.cmake + UseDDepsMakeWIP.cmake UseDub.cmake dependencies.cmake UseDUnittest.cmake diff --git a/cmake-d/Platform/Darwin-dmd.cmake b/cmake-d/Platform/Darwin-dmd.cmake index 3b0a8f7..ff092b6 100644 --- a/cmake-d/Platform/Darwin-dmd.cmake +++ b/cmake-d/Platform/Darwin-dmd.cmake @@ -66,3 +66,4 @@ set(CMAKE_D_FLAGS_RELWITHDEBINFO_INIT "-O -g -L-export_dynamic ${DDOC_FLAGS}") set(CMAKE_D_CREATE_ASSEMBLY_SOURCE " -S -of") # set(CMAKE_INCLUDE_SYSTEM_FLAG_D "-isystem ") set(CMAKE_D_VERSION_FLAG "-version=") +set(CMAKE_DEPFILE_FLAGS_D "-makedeps=") diff --git a/cmake-d/Platform/Darwin-ldc2.cmake b/cmake-d/Platform/Darwin-ldc2.cmake index 11647f6..53b0d50 100644 --- a/cmake-d/Platform/Darwin-ldc2.cmake +++ b/cmake-d/Platform/Darwin-ldc2.cmake @@ -62,3 +62,4 @@ set(CMAKE_D_FLAGS_RELWITHDEBINFO_INIT "-O -g -L-export_dynamic ${DDOC_FLAGS}") set(CMAKE_D_CREATE_ASSEMBLY_SOURCE " -S -of") # set(CMAKE_INCLUDE_SYSTEM_FLAG_D "-isystem ") set(CMAKE_D_VERSION_FLAG "--d-version=") +set(CMAKE_DEPFILE_FLAGS_D "-makedeps=") diff --git a/cmake-d/Platform/Linux-dmd.cmake b/cmake-d/Platform/Linux-dmd.cmake index ae6dc99..aeb2fa0 100644 --- a/cmake-d/Platform/Linux-dmd.cmake +++ b/cmake-d/Platform/Linux-dmd.cmake @@ -66,3 +66,4 @@ set(CMAKE_D_FLAGS_RELWITHDEBINFO_INIT "-O -g -L--export-dynamic ${DDOC_FLAGS}") set(CMAKE_D_CREATE_ASSEMBLY_SOURCE " -S -of") # set(CMAKE_INCLUDE_SYSTEM_FLAG_D "-isystem ") set(CMAKE_D_VERSION_FLAG "-version=") +set(CMAKE_DEPFILE_FLAGS_D "-makedeps=") diff --git a/cmake-d/Platform/Linux-gdc.cmake b/cmake-d/Platform/Linux-gdc.cmake index 0f31c26..2556095 100644 --- a/cmake-d/Platform/Linux-gdc.cmake +++ b/cmake-d/Platform/Linux-gdc.cmake @@ -39,3 +39,5 @@ set(CMAKE_D_CREATE_ASSEMBLY_SOURCE " -S -o -MF ") diff --git a/cmake-d/Platform/Linux-ldc2.cmake b/cmake-d/Platform/Linux-ldc2.cmake index c8522d2..23e2fb9 100644 --- a/cmake-d/Platform/Linux-ldc2.cmake +++ b/cmake-d/Platform/Linux-ldc2.cmake @@ -62,3 +62,4 @@ set(CMAKE_D_FLAGS_RELWITHDEBINFO_INIT "-O -g -L--export-dynamic ${DDOC_FLAGS}") set(CMAKE_D_CREATE_ASSEMBLY_SOURCE " -S -of") # set(CMAKE_INCLUDE_SYSTEM_FLAG_D "-isystem ") set(CMAKE_D_VERSION_FLAG "--d-version=") +set(CMAKE_DEPFILE_FLAGS_D "-makedeps=") diff --git a/cmake-d/Platform/Windows-dmd.cmake b/cmake-d/Platform/Windows-dmd.cmake index ae90851..741dc1c 100644 --- a/cmake-d/Platform/Windows-dmd.cmake +++ b/cmake-d/Platform/Windows-dmd.cmake @@ -55,3 +55,4 @@ set(CMAKE_D_FLAGS_RELEASE_INIT "-O -release -inline ${DDOC_FLAGS}") set(CMAKE_D_FLAGS_RELWITHDEBINFO_INIT "-O -g ${DDOC_FLAGS}") set(CMAKE_D_CREATE_ASSEMBLY_SOURCE " -S -of") set(CMAKE_D_VERSION_FLAG "-version=") +set(CMAKE_DEPFILE_FLAGS_D "-makedeps=") diff --git a/cmake-d/Platform/Windows-gdc.cmake b/cmake-d/Platform/Windows-gdc.cmake index a476fe3..b9c3f93 100644 --- a/cmake-d/Platform/Windows-gdc.cmake +++ b/cmake-d/Platform/Windows-gdc.cmake @@ -33,3 +33,5 @@ set(CMAKE_D_FLAGS_RELWITHDEBINFO_INIT "-O2 -g ${DDOC_FLAGS}") # set(CMAKE_D_CREATE_PREPROCESSED_SOURCE " -E > ") set(CMAKE_D_CREATE_ASSEMBLY_SOURCE " -S -o ") # set(CMAKE_INCLUDE_SYSTEM_FLAG_D "-isystem ") +set(CMAKE_D_VERSION_FLAG "-fversion=") +set(CMAKE_DEPFILE_FLAGS_D "-MD -MT -MF ") diff --git a/cmake-d/UseDDeps.cmake b/cmake-d/UseDDeps.cmake deleted file mode 100644 index fc1a60f..0000000 --- a/cmake-d/UseDDeps.cmake +++ /dev/null @@ -1,33 +0,0 @@ -# Dependency tracking for D -# -# Copyright (c) 2010 Jens Mueller -# -# All rights reserved. -# -# See LICENSE for details. -# - -set(cmake_d_dir ${CMAKE_CURRENT_LIST_DIR}) - -function(resolve_dependencies target) - get_target_property(d_source_files ${target} SOURCES) - - # extract D source files from arguments - #message("D files in arguments: ${d_source_files}") - - foreach(full_file IN LISTS d_source_files) - file(RELATIVE_PATH file "${CMAKE_CURRENT_SOURCE_DIR}" "${full_file}") - set(source_file "${CMAKE_CURRENT_SOURCE_DIR}/${file}") - set(deps_dir "${CMAKE_CURRENT_BINARY_DIR}${CMAKE_FILES_DIRECTORY}/UseDDeps/") - set(dependency_file "${deps_dir}${file}.dep") - get_filename_component(deps_source_dir "${dependency_file}" DIRECTORY) - file(MAKE_DIRECTORY "${deps_source_dir}") - set(dependency_files ${dependency_files} ${dependency_file}) - - add_custom_command(OUTPUT "${CMAKE_BINARY_DIR}/your_gen_file.txt" - COMMAND /bin/date > "${CMAKE_BINARY_DIR}/your_gen_file.txt" - COMMAND /bin/echo "RUNNING COMMAND") - - set_source_files_properties("${full_file}" PROPERTIES COMPILE_FLAGS "-deps=${dependency_file}" OBJECT_DEPENDS "${dependency_file}") - endforeach() -endfunction() diff --git a/cmake-d/UseDDepsMakeWIP.cmake b/cmake-d/UseDDepsMakeWIP.cmake new file mode 100644 index 0000000..9146ad3 --- /dev/null +++ b/cmake-d/UseDDepsMakeWIP.cmake @@ -0,0 +1,48 @@ +set(cmake_d_dir ${CMAKE_CURRENT_LIST_DIR}) + +function(depfile_from_file depfile file) + file(RELATIVE_PATH file "${CMAKE_CURRENT_SOURCE_DIR}" "${full_file}") + set(source_file "${CMAKE_CURRENT_SOURCE_DIR}/${file}") + set(deps_dir "${CMAKE_CURRENT_BINARY_DIR}${CMAKE_FILES_DIRECTORY}/UseDDeps/") + set(${depfile} "${deps_dir}${file}.dep" PARENT_SCOPE) +endfunction() + +function(resolve_dependencies target) + get_target_property(d_source_files ${target} SOURCES) + + # extract D source files from arguments + #message("D files in arguments: ${d_source_files}") + + foreach(full_file IN LISTS d_source_files) + set(CMAKE_DEPENDS_USE_COMPILER true) + depfile_from_file(dependency_file ${full_file}) + message("${dependency_file}") + + string(REPLACE "" "${dependency_file}" depflag "${CMAKE_DEPFILE_FLAGS_D}") +# add_custom_command(DEPFILE "${dependency_file}" OUTPUT "${dependency_file}" DEPENDS "") +# set_source_files_properties("${full_file}" PROPERTIES OBJECT_DEPENDS "${dependency_file}") + endforeach() +endfunction() + + +macro(add_executable_with_dependencies _target) + # extract D source files from arguments + foreach(file ${ARGV}) + if(${file} MATCHES "\\.d$") + list(APPEND d_source_files ${file}) + endif() + endforeach() + + #message("D files in arguments: ${d_source_files}") + + foreach(file IN LISTS d_source_files) + file(RELATIVE_PATH file "${CMAKE_CURRENT_SOURCE_DIR}" "${full_file}") + set(source_file "${CMAKE_CURRENT_SOURCE_DIR}/${file}") + set(deps_dir "${CMAKE_CURRENT_BINARY_DIR}${CMAKE_FILES_DIRECTORY}/UseDDeps/") + set(dependency_file "${deps_dir}${file}.dep") + get_filename_component(deps_source_dir "${dependency_file}" DIRECTORY) + set("${CMAKE_D_COMPILER} -o- -M") + endforeach() + + add_executable(${ARGV} ${dependency_files}) +endmacro() diff --git a/cmake-d/UseDub.cmake b/cmake-d/UseDub.cmake index ac0d792..0592e5e 100644 --- a/cmake-d/UseDub.cmake +++ b/cmake-d/UseDub.cmake @@ -34,14 +34,14 @@ if(NOT EXISTS ${DUB_DIRECTORY}/CMakeTmp/DubUrl) PATH_SUFFIXES "UseDub") get_filename_component(SEMVER_PATH ${SEMVER_SRC} PATH) execute_process(COMMAND ${CMAKE_D_COMPILER} -I${SEMVER_PATH} ${DUB_GET_PACKAGE_URL_D_SRC} ${SEMVER_SRC} - WORKING_DIRECTORY ${DUB_DIRECTORY}/CMakeTmp) + ${CMAKE_D_DASH_O}DubUrl WORKING_DIRECTORY ${DUB_DIRECTORY}/CMakeTmp) unset(DUB_GET_PACKAGE_URL_D_SRC CACHE) endif() if(NOT EXISTS ${DUB_DIRECTORY}/CMakeTmp/DubToCMake) find_file(DUB_PACKAGE_TO_CMAKE_D_SRC "DubToCMake.d" PATHS ${CMAKE_ROOT}/Modules ${CMAKE_MODULE_PATH} NO_DEFAULT_PATH PATH_SUFFIXES "UseDub") - execute_process(COMMAND ${CMAKE_D_COMPILER} ${DUB_PACKAGE_TO_CMAKE_D_SRC} + execute_process(COMMAND ${CMAKE_D_COMPILER} ${DUB_PACKAGE_TO_CMAKE_D_SRC} ${CMAKE_D_DASH_O}DubToCMake WORKING_DIRECTORY ${DUB_DIRECTORY}/CMakeTmp) unset(DUB_PACKAGE_TO_CMAKE_D_SRC CACHE) endif() From 76f998db624a94792de2c7466f423b622d48223b Mon Sep 17 00:00:00 2001 From: Dadoum Date: Sun, 5 Dec 2021 19:17:14 +0100 Subject: [PATCH 05/16] Add "add_compile_versions" --- cmake-d/CMakeDInformation.cmake | 11 +++++++++++ 1 file changed, 11 insertions(+) diff --git a/cmake-d/CMakeDInformation.cmake b/cmake-d/CMakeDInformation.cmake index 8e5fa3a..4dfebcc 100644 --- a/cmake-d/CMakeDInformation.cmake +++ b/cmake-d/CMakeDInformation.cmake @@ -260,6 +260,7 @@ set(CMAKE_D_ARCHIVE_CREATE " cr ") set(CMAKE_D_ARCHIVE_APPEND " r ") set(CMAKE_D_ARCHIVE_FINISH " ") + # compile a D file into an object file if(NOT CMAKE_D_COMPILE_OBJECT) if(CMAKE_VERSION VERSION_LESS 3.4.0) @@ -284,3 +285,13 @@ mark_as_advanced( CMAKE_D_FLAGS_RELWITHDEBINFO) set(CMAKE_D_INFORMATION_LOADED 1) + +function(target_compile_versions target) + cmake_parse_arguments(CMAKE_D_COMPILE_VERSIONS "" "" "PUBLIC;PRIVATE;INTERFACE" ${ARGN}) + list(TRANSFORM CMAKE_D_COMPILE_VERSIONS_PUBLIC PREPEND "${CMAKE_D_VERSION_FLAG}") + list(TRANSFORM CMAKE_D_COMPILE_VERSIONS_PRIVATE PREPEND "${CMAKE_D_VERSION_FLAG}") + list(TRANSFORM CMAKE_D_COMPILE_VERSIONS_INTERFACE PREPEND "${CMAKE_D_VERSION_FLAG}") + target_compile_options(${target} PUBLIC ${CMAKE_D_COMPILE_VERSIONS_PUBLIC}) + target_compile_options(${target} PRIVATE ${CMAKE_D_COMPILE_VERSIONS_PRIVATE}) + target_compile_options(${target} INTERFACE ${CMAKE_D_COMPILE_VERSIONS_INTERFACE}) +endfunction() From e125cf1d04aa913e8d2aa3e841179aa30a02ad24 Mon Sep 17 00:00:00 2001 From: Dadoum Date: Sun, 5 Dec 2021 21:38:34 +0100 Subject: [PATCH 06/16] Add lflags support --- cmake-d/UseDub/DubToCMake.d | 8 +++++++- 1 file changed, 7 insertions(+), 1 deletion(-) diff --git a/cmake-d/UseDub/DubToCMake.d b/cmake-d/UseDub/DubToCMake.d index 25c70c2..8785822 100644 --- a/cmake-d/UseDub/DubToCMake.d +++ b/cmake-d/UseDub/DubToCMake.d @@ -183,10 +183,16 @@ install(TARGETS %s if ("versions" in root.object && root["versions"].array.length > 0) { cmake ~= format!q"< -target_compile_options(%s PUBLIC "%-(${CMAKE_D_VERSION_FLAG}%s %)") +target_compile_versions(%s PUBLIC "%-(%s %)") >"(target, root["versions"].array.map!(a => a.str)); } + if ("lflags" in root.object && root["lflags"].array.length > 0) { + cmake ~= format!q"< +target_link_options(%s PUBLIC "%-(${CMAKE_LINKER_FLAG_PREFIX}%s %)") +>"(target, root["lflags"].array.map!(a => a.str)); + } + if (target != root["name"].str) cmake ~= format!q"< add_library(%s ALIAS %s) From 96f79fec563b2f4f7ccda439e68ef592c0b2a2a2 Mon Sep 17 00:00:00 2001 From: Dadoum Date: Thu, 23 Dec 2021 00:04:32 +0100 Subject: [PATCH 07/16] Fix GDC linker flag --- cmake-d/Platform/Linux-gdc.cmake | 1 + cmake-d/Platform/Windows-gdc.cmake | 1 + 2 files changed, 2 insertions(+) diff --git a/cmake-d/Platform/Linux-gdc.cmake b/cmake-d/Platform/Linux-gdc.cmake index 2556095..bcbdb2d 100644 --- a/cmake-d/Platform/Linux-gdc.cmake +++ b/cmake-d/Platform/Linux-gdc.cmake @@ -37,6 +37,7 @@ set(CMAKE_D_FLAGS_RELWITHDEBINFO_INIT "-O2 -g ${DDOC_FLAGS}") # set(CMAKE_D_CREATE_PREPROCESSED_SOURCE " -E > ") set(CMAKE_D_CREATE_ASSEMBLY_SOURCE " -S -o ") # set(CMAKE_INCLUDE_SYSTEM_FLAG_D "-isystem ") +set(CMAKE_LINKER_FLAG_PREFIX "-Wl,") set(CMAKE_INCLUDE_FLAG_D "-I") # -I set(CMAKE_D_VERSION_FLAG "-fversion=") diff --git a/cmake-d/Platform/Windows-gdc.cmake b/cmake-d/Platform/Windows-gdc.cmake index b9c3f93..02b4a5f 100644 --- a/cmake-d/Platform/Windows-gdc.cmake +++ b/cmake-d/Platform/Windows-gdc.cmake @@ -35,3 +35,4 @@ set(CMAKE_D_CREATE_ASSEMBLY_SOURCE " -S -o -MF ") +set(CMAKE_LINKER_FLAG_PREFIX "-Wl,") From ed812291ad026f4312d7ae18a04d52b041f8089e Mon Sep 17 00:00:00 2001 From: Dadoum Date: Mon, 20 Jun 2022 12:48:32 +0200 Subject: [PATCH 08/16] Dub improvements --- cmake-d/CMakeDInformation.cmake | 6 +-- cmake-d/Platform/Darwin-dmd.cmake | 1 + cmake-d/Platform/Darwin-ldc2.cmake | 3 +- cmake-d/Platform/Linux-dmd.cmake | 1 + cmake-d/Platform/Linux-gdc.cmake | 1 + cmake-d/Platform/Linux-ldc2.cmake | 3 +- cmake-d/Platform/Windows-dmd.cmake | 1 + cmake-d/Platform/Windows-gdc.cmake | 2 +- cmake-d/UseDub.cmake | 4 +- cmake-d/UseDub/DubToCMake.d | 71 ++++++++++++++++++++---------- 10 files changed, 61 insertions(+), 32 deletions(-) diff --git a/cmake-d/CMakeDInformation.cmake b/cmake-d/CMakeDInformation.cmake index 4dfebcc..71c5624 100644 --- a/cmake-d/CMakeDInformation.cmake +++ b/cmake-d/CMakeDInformation.cmake @@ -291,7 +291,7 @@ function(target_compile_versions target) list(TRANSFORM CMAKE_D_COMPILE_VERSIONS_PUBLIC PREPEND "${CMAKE_D_VERSION_FLAG}") list(TRANSFORM CMAKE_D_COMPILE_VERSIONS_PRIVATE PREPEND "${CMAKE_D_VERSION_FLAG}") list(TRANSFORM CMAKE_D_COMPILE_VERSIONS_INTERFACE PREPEND "${CMAKE_D_VERSION_FLAG}") - target_compile_options(${target} PUBLIC ${CMAKE_D_COMPILE_VERSIONS_PUBLIC}) - target_compile_options(${target} PRIVATE ${CMAKE_D_COMPILE_VERSIONS_PRIVATE}) - target_compile_options(${target} INTERFACE ${CMAKE_D_COMPILE_VERSIONS_INTERFACE}) + target_compile_options(${target} PUBLIC "$<$:${CMAKE_D_COMPILE_VERSIONS_PUBLIC}>") + target_compile_options(${target} PRIVATE "$<$:${CMAKE_D_COMPILE_VERSIONS_PRIVATE}>") + target_compile_options(${target} INTERFACE "$<$:${CMAKE_D_COMPILE_VERSIONS_INTERFACE}>") endfunction() diff --git a/cmake-d/Platform/Darwin-dmd.cmake b/cmake-d/Platform/Darwin-dmd.cmake index ff092b6..f2c5266 100644 --- a/cmake-d/Platform/Darwin-dmd.cmake +++ b/cmake-d/Platform/Darwin-dmd.cmake @@ -67,3 +67,4 @@ set(CMAKE_D_CREATE_ASSEMBLY_SOURCE " -S -of") +set(CMAKE_LINKER_FLAG_PREFIX "-L=") diff --git a/cmake-d/Platform/Darwin-ldc2.cmake b/cmake-d/Platform/Darwin-ldc2.cmake index 53b0d50..0ce37a0 100644 --- a/cmake-d/Platform/Darwin-ldc2.cmake +++ b/cmake-d/Platform/Darwin-ldc2.cmake @@ -54,7 +54,7 @@ set(CMAKE_FIND_LIBRARY_SUFFIXES ".so" ".a") set(CMAKE_D_FLAGS_INIT "") # DMD can only produce 32-bit binaries for now set(CMAKE_D_LINK_FLAGS "") -set(CMAKE_D_FLAGS_DEBUG_INIT "-g -d-debug -L-export_dynamic ${DDOC_FLAGS}") +set(CMAKE_D_FLAGS_DEBUG_INIT "-g --d-debug -L-export_dynamic ${DDOC_FLAGS}") set(CMAKE_D_FLAGS_MINSIZEREL_INIT "-Os ${DDOC_FLAGS}") set(CMAKE_D_FLAGS_RELEASE_INIT "-O -release ${DDOC_FLAGS}") set(CMAKE_D_FLAGS_RELWITHDEBINFO_INIT "-O -g -L-export_dynamic ${DDOC_FLAGS}") @@ -63,3 +63,4 @@ set(CMAKE_D_CREATE_ASSEMBLY_SOURCE " -S -of") +set(CMAKE_LINKER_FLAG_PREFIX "-L=") diff --git a/cmake-d/Platform/Linux-dmd.cmake b/cmake-d/Platform/Linux-dmd.cmake index aeb2fa0..eb56511 100644 --- a/cmake-d/Platform/Linux-dmd.cmake +++ b/cmake-d/Platform/Linux-dmd.cmake @@ -67,3 +67,4 @@ set(CMAKE_D_CREATE_ASSEMBLY_SOURCE " -S -of") +set(CMAKE_LINKER_FLAG_PREFIX "-L=") diff --git a/cmake-d/Platform/Linux-gdc.cmake b/cmake-d/Platform/Linux-gdc.cmake index bcbdb2d..e6f00a4 100644 --- a/cmake-d/Platform/Linux-gdc.cmake +++ b/cmake-d/Platform/Linux-gdc.cmake @@ -12,6 +12,7 @@ # See http://www.cmake.org/HTML/Copyright.html for details # +set(CMAKE_D_OUTPUT_EXTENSION .o) set(CMAKE_D_DASH_O "-o") set(CMAKE_BASE_NAME gdc) diff --git a/cmake-d/Platform/Linux-ldc2.cmake b/cmake-d/Platform/Linux-ldc2.cmake index 23e2fb9..8ba2884 100644 --- a/cmake-d/Platform/Linux-ldc2.cmake +++ b/cmake-d/Platform/Linux-ldc2.cmake @@ -54,7 +54,7 @@ set(CMAKE_FIND_LIBRARY_SUFFIXES ".so" ".a") set(CMAKE_D_FLAGS_INIT "") # DMD can only produce 32-bit binaries for now set(CMAKE_D_LINK_FLAGS "") -set(CMAKE_D_FLAGS_DEBUG_INIT "-g -d-debug -L--export-dynamic ${DDOC_FLAGS}") +set(CMAKE_D_FLAGS_DEBUG_INIT "-g --d-debug -L--export-dynamic ${DDOC_FLAGS}") set(CMAKE_D_FLAGS_MINSIZEREL_INIT "-Os ${DDOC_FLAGS}") set(CMAKE_D_FLAGS_RELEASE_INIT "-O -release ${DDOC_FLAGS}") set(CMAKE_D_FLAGS_RELWITHDEBINFO_INIT "-O -g -L--export-dynamic ${DDOC_FLAGS}") @@ -63,3 +63,4 @@ set(CMAKE_D_CREATE_ASSEMBLY_SOURCE " -S -of") +set(CMAKE_LINKER_FLAG_PREFIX "-L=") diff --git a/cmake-d/Platform/Windows-dmd.cmake b/cmake-d/Platform/Windows-dmd.cmake index 741dc1c..5943a90 100644 --- a/cmake-d/Platform/Windows-dmd.cmake +++ b/cmake-d/Platform/Windows-dmd.cmake @@ -56,3 +56,4 @@ set(CMAKE_D_FLAGS_RELWITHDEBINFO_INIT "-O -g ${DDOC_FLAGS}") set(CMAKE_D_CREATE_ASSEMBLY_SOURCE " -S -of") set(CMAKE_D_VERSION_FLAG "-version=") set(CMAKE_DEPFILE_FLAGS_D "-makedeps=") +set(CMAKE_LINKER_FLAG_PREFIX "-L=") diff --git a/cmake-d/Platform/Windows-gdc.cmake b/cmake-d/Platform/Windows-gdc.cmake index 02b4a5f..ecfa438 100644 --- a/cmake-d/Platform/Windows-gdc.cmake +++ b/cmake-d/Platform/Windows-gdc.cmake @@ -34,5 +34,5 @@ set(CMAKE_D_FLAGS_RELWITHDEBINFO_INIT "-O2 -g ${DDOC_FLAGS}") set(CMAKE_D_CREATE_ASSEMBLY_SOURCE " -S -o ") # set(CMAKE_INCLUDE_SYSTEM_FLAG_D "-isystem ") set(CMAKE_D_VERSION_FLAG "-fversion=") -set(CMAKE_DEPFILE_FLAGS_D "-MD -MT -MF ") +set(CMAKE_DEPFILE_FLAGS_D "-MD -MT -MF ") set(CMAKE_LINKER_FLAG_PREFIX "-Wl,") diff --git a/cmake-d/UseDub.cmake b/cmake-d/UseDub.cmake index 0592e5e..49e6471 100644 --- a/cmake-d/UseDub.cmake +++ b/cmake-d/UseDub.cmake @@ -84,13 +84,13 @@ function(DubProject_Add name_full) FetchContent_Declare( ${name}_proj URL ${DUB_PACKAGE_URL} - PATCH_COMMAND ${DUB_DIRECTORY}/CMakeTmp/DubToCMake -c ${ARGV2} -s ${name_full} + PATCH_COMMAND ${DUB_DIRECTORY}/CMakeTmp/DubToCMake -c ${ARGV2} -s ${name_full} -p ${name} ) else() FetchContent_Declare( ${name}_proj URL ${DUB_PACKAGE_URL} - PATCH_COMMAND ${DUB_DIRECTORY}/CMakeTmp/DubToCMake -s ${name_full} + PATCH_COMMAND ${DUB_DIRECTORY}/CMakeTmp/DubToCMake -s ${name_full} -p ${name} ) endif() FetchContent_MakeAvailable(${name}_proj) diff --git a/cmake-d/UseDub/DubToCMake.d b/cmake-d/UseDub/DubToCMake.d index 8785822..63ff192 100644 --- a/cmake-d/UseDub/DubToCMake.d +++ b/cmake-d/UseDub/DubToCMake.d @@ -4,13 +4,14 @@ import std.array; import std.file; import std.getopt; import std.json; +import std.path; +import std.process; import std.stdio; import std.string; -import std.process; string cmakeFile = "CMakeLists.txt"; string configuration = ""; -string dubFile = ""; +string packageName = ""; string subPackage = ""; string[] processedTargets = []; @@ -20,32 +21,27 @@ string[] configurationArg; int main(string[] args) { getopt(args, - "package|p", &dubFile, + "package|p", &packageName, "configuration|c", &configuration, "subpackage|s", &subPackage, "output|o", &cmakeFile); - if (dubFile != "") - { - stderr.writeln("-p is deprecated and does not have any effect anymore. Please keep the default package file name."); - } - if (!configuration.empty) configurationArg = ["-c", configuration]; else configurationArg = []; - auto p = pipeProcess(["dub", "describe"] ~ configurationArg ~ [subPackage], Redirect.stdout); - - auto apd = appender!string(); - foreach (line; p.stdout.byLine) - { - apd ~= line.idup; + if (subPackage.canFind(':')) { + subPackage = ":" ~ subPackage.split(':')[1]; + } else { + subPackage = ""; } - string json = apd[]; - auto dubRoot = parseJSON(json); - JSONValue root = dubRoot["packages"][0]; + auto packageArgs = [subPackage]; + + if (subPackage.canFind(",")) { + packageArgs = subPackage[1..$].split(',').map!((s) => ":" ~ s).array; + } auto cmake = appender!string(); @@ -55,9 +51,26 @@ cmake_minimum_required(VERSION 3.18) project(%s D) ->"(root["name"].str ~ "_proj"); +>"(packageName ~ "_proj"); + + foreach (pkg; packageArgs) { + auto packageArg = pkg; + + auto p = pipeProcess(["dub", "describe"] ~ configurationArg ~ packageArg, Redirect.stdout); + + auto apd = appender!string(); + foreach (line; p.stdout.byLine) + { + apd ~= line.idup; + } + + string json = apd[]; + auto dubRoot = parseJSON(json); + JSONValue root = dubRoot["packages"][0]; + + cmake ~= includePackage(dubRoot, root); + } - cmake ~= includePackage(dubRoot, root); std.file.write(cmakeFile, cmake[]); @@ -77,12 +90,16 @@ string includePackage(JSONValue dubRoot, JSONValue root) { string cmake = format!"# Section: %s\n"(target); bool isInterface = false; + string normalizedPath(string path) { + return asNormalizedPath(root["path"].str.asRelativePath(getcwd).array ~ "/" ~ path).array; + } + cmake ~= format!"set(SRC_FILES %-(%s %))"( root["files"].array.map!( (val) { if (val["role"].str == "source" || val["role"].str == "import_") { - string ifExists = (subTarget.empty ? "" : subTarget ~ "/") ~ val["path"].str; - return exists(ifExists) ? ifExists : ""; + string path = normalizedPath(val["path"].str); + return exists(path) ? path : ""; } else return ""; @@ -140,7 +157,7 @@ add_library(%s SHARED ${SRC_FILES}) cmake ~= q"< target_include_directories(%s %s %-(%s %)) ->".format(target, isInterface ? "INTERFACE" : "PUBLIC", root["importPaths"].array.map!((val) => val.str).array ~ (subTarget.empty ? [] : [subTarget])); +>".format(target, isInterface ? "INTERFACE" : "PUBLIC", root["importPaths"].array.map!((val) => normalizedPath(val.str)).array ~ (subTarget.empty ? [] : [subTarget])); cmake ~= q"< install(TARGETS %s @@ -154,7 +171,7 @@ install(TARGETS %s cmake ~= "\ninclude(UseDub)\n"; foreach (dependency; root["dependencies"].array) { - if (dependency.str.startsWith(dubRoot["rootPackage"].str.split(":")[0] ~ ":")) { + if (dependency.str.startsWith(dubRoot["rootPackage"].str.split(":")[0])) { auto p = pipeProcess(["dub", "describe", dependency.str], Redirect.stdout); auto apd = appender!string(); @@ -178,7 +195,7 @@ install(TARGETS %s } } - cmake ~= ("\ntarget_link_libraries(%s " ~ (isInterface ? "INTERFACE" : "") ~ " %-(%s %))\n").format(target, root["dependencies"].array.map!((val) => val.str.replace(":", "::"))); + cmake ~= ("\ntarget_link_libraries(%s " ~ (isInterface ? "INTERFACE" : "PUBLIC") ~ " %-(%s %))\n").format(target, root["dependencies"].array.map!((val) => val.str.replace(":", "::"))); } if ("versions" in root.object && root["versions"].array.length > 0) { @@ -187,6 +204,12 @@ target_compile_versions(%s PUBLIC "%-(%s %)") >"(target, root["versions"].array.map!(a => a.str)); } + if ("libs" in root.object && root["libs"].array.length > 0) { + cmake ~= format!q"< +target_link_libraries(%s PUBLIC "%-(%s %)") +>"(target, root["libs"].array.map!(a => a.str)); + } + if ("lflags" in root.object && root["lflags"].array.length > 0) { cmake ~= format!q"< target_link_options(%s PUBLIC "%-(${CMAKE_LINKER_FLAG_PREFIX}%s %)") From cb56e365192b4babf3748ad450a401d7e33c1d9f Mon Sep 17 00:00:00 2001 From: Dadoum Date: Mon, 20 Jun 2022 20:21:00 +0200 Subject: [PATCH 09/16] DUB again --- cmake-d/UseDub/DubToCMake.d | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/cmake-d/UseDub/DubToCMake.d b/cmake-d/UseDub/DubToCMake.d index 63ff192..393bbc9 100644 --- a/cmake-d/UseDub/DubToCMake.d +++ b/cmake-d/UseDub/DubToCMake.d @@ -206,8 +206,8 @@ target_compile_versions(%s PUBLIC "%-(%s %)") if ("libs" in root.object && root["libs"].array.length > 0) { cmake ~= format!q"< -target_link_libraries(%s PUBLIC "%-(%s %)") ->"(target, root["libs"].array.map!(a => a.str)); +target_link_libraries(%s PUBLIC %-(%s %)) +>"(target, root["libs"].array.map!(a => `"` ~ a.str ~ `"`)); } if ("lflags" in root.object && root["lflags"].array.length > 0) { From 762a5ad11c2e9f4367768388340b9cb5daa7acc9 Mon Sep 17 00:00:00 2001 From: Dadoum Date: Fri, 8 Jul 2022 15:41:15 +0200 Subject: [PATCH 10/16] Fix multiple version flags --- cmake-d/UseDub/DubToCMake.d | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/cmake-d/UseDub/DubToCMake.d b/cmake-d/UseDub/DubToCMake.d index 393bbc9..f452858 100644 --- a/cmake-d/UseDub/DubToCMake.d +++ b/cmake-d/UseDub/DubToCMake.d @@ -200,7 +200,7 @@ install(TARGETS %s if ("versions" in root.object && root["versions"].array.length > 0) { cmake ~= format!q"< -target_compile_versions(%s PUBLIC "%-(%s %)") +target_compile_versions(%s PUBLIC %-(%s %)) >"(target, root["versions"].array.map!(a => a.str)); } From 4350a66a7c11822995d47a64dd62bf46cbd50d65 Mon Sep 17 00:00:00 2001 From: Dadoum Date: Wed, 20 Jul 2022 15:08:51 +0200 Subject: [PATCH 11/16] Fix shared libraries --- cmake-d/Platform/Darwin-dmd.cmake | 2 +- cmake-d/Platform/Linux-dmd.cmake | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/cmake-d/Platform/Darwin-dmd.cmake b/cmake-d/Platform/Darwin-dmd.cmake index f2c5266..628238f 100644 --- a/cmake-d/Platform/Darwin-dmd.cmake +++ b/cmake-d/Platform/Darwin-dmd.cmake @@ -27,7 +27,7 @@ set(CMAKE_BASE_NAME dmd) set(CMAKE_STATIC_LIBRARY_CREATE_D_FLAGS "-lib") set(CMAKE_SHARED_LIBRARY_D_FLAGS "") # -pic -set(CMAKE_SHARED_LIBRARY_CREATE_D_FLAGS "-shared -defaultlib=libphobos2.so") # -shared +set(CMAKE_SHARED_LIBRARY_CREATE_D_FLAGS "-shared") # -shared set(CMAKE_SHARED_LIBRARY_LINK_D_FLAGS "") # +s, flag for exe link to use shared lib set(CMAKE_SHARED_LIBRARY_RUNTIME_D_FLAG "") # -rpath set(CMAKE_SHARED_LIBRARY_RUNTIME_D_FLAG_SEP "") # : or empty diff --git a/cmake-d/Platform/Linux-dmd.cmake b/cmake-d/Platform/Linux-dmd.cmake index eb56511..4421ee1 100644 --- a/cmake-d/Platform/Linux-dmd.cmake +++ b/cmake-d/Platform/Linux-dmd.cmake @@ -27,7 +27,7 @@ set(CMAKE_BASE_NAME dmd) set(CMAKE_STATIC_LIBRARY_CREATE_D_FLAGS "-lib") set(CMAKE_SHARED_LIBRARY_D_FLAGS "") # -pic -set(CMAKE_SHARED_LIBRARY_CREATE_D_FLAGS "-shared -defaultlib=libphobos2.so") # -shared +set(CMAKE_SHARED_LIBRARY_CREATE_D_FLAGS "-shared") # -shared set(CMAKE_SHARED_LIBRARY_LINK_D_FLAGS "") # +s, flag for exe link to use shared lib set(CMAKE_SHARED_LIBRARY_RUNTIME_D_FLAG "") # -rpath set(CMAKE_SHARED_LIBRARY_RUNTIME_D_FLAG_SEP "") # : or empty From f805a36a3d24ff7a595d6d648032d898d94cd169 Mon Sep 17 00:00:00 2001 From: Dadoum Date: Fri, 22 Jul 2022 00:32:40 +0200 Subject: [PATCH 12/16] Shared library fix (no shared phobos by default) --- cmake-d/Platform/Linux-gdc.cmake | 19 +++++++++++++++++++ cmake-d/Platform/Linux-ldc2.cmake | 2 +- 2 files changed, 20 insertions(+), 1 deletion(-) diff --git a/cmake-d/Platform/Linux-gdc.cmake b/cmake-d/Platform/Linux-gdc.cmake index e6f00a4..727b8bb 100644 --- a/cmake-d/Platform/Linux-gdc.cmake +++ b/cmake-d/Platform/Linux-gdc.cmake @@ -29,6 +29,25 @@ if(CMAKE_D_BUILD_DOCS) endforeach() endif() +set(CMAKE_SHARED_LIBRARY_D_FLAGS "-fPIC") # -pic +set(CMAKE_SHARED_LIBRARY_CREATE_D_FLAGS "-shared") # -shared +set(CMAKE_SHARED_LIBRARY_LINK_D_FLAGS "") # +s, flag for exe link to use shared lib +set(CMAKE_SHARED_LIBRARY_RUNTIME_D_FLAG "") # -rpath +set(CMAKE_SHARED_LIBRARY_RUNTIME_D_FLAG_SEP "") # : or empty +set(CMAKE_INCLUDE_FLAG_D "-I") # -I +set(CMAKE_INCLUDE_FLAG_D_SEP "") # , or empty +set(CMAKE_LIBRARY_PATH_FLAG "-L-L") +set(CMAKE_LIBRARY_PATH_TERMINATOR "") # for the Digital Mars D compiler the link paths have to be terminated with a "/" +set(CMAKE_LINK_LIBRARY_FLAG "-L-l") + +set(CMAKE_LINK_LIBRARY_SUFFIX "") +set(CMAKE_STATIC_LIBRARY_PREFIX "lib") +set(CMAKE_STATIC_LIBRARY_SUFFIX ".a") +set(CMAKE_SHARED_LIBRARY_PREFIX "lib") # lib +set(CMAKE_SHARED_LIBRARY_SUFFIX ".so") # .so +set(CMAKE_EXECUTABLE_SUFFIX "") # .exe +set(CMAKE_DL_LIBS "dl") + # SET(CMAKE_D_FLAGS_INIT "-fversion=Posix -fversion=${CMAKE_BUILD_TYPE}Build ${DSTDLIB_FLAGS}") set(CMAKE_D_FLAGS_INIT "") set(CMAKE_D_FLAGS_DEBUG_INIT "-g ${DDOC_FLAGS}") diff --git a/cmake-d/Platform/Linux-ldc2.cmake b/cmake-d/Platform/Linux-ldc2.cmake index 8ba2884..20437ba 100644 --- a/cmake-d/Platform/Linux-ldc2.cmake +++ b/cmake-d/Platform/Linux-ldc2.cmake @@ -27,7 +27,7 @@ set(CMAKE_BASE_NAME ldc2) set(CMAKE_STATIC_LIBRARY_CREATE_D_FLAGS "-lib") set(CMAKE_SHARED_LIBRARY_D_FLAGS "") # -pic -set(CMAKE_SHARED_LIBRARY_CREATE_D_FLAGS "-shared") # -shared +set(CMAKE_SHARED_LIBRARY_CREATE_D_FLAGS "-shared -link-defaultlib-shared=false") # -shared set(CMAKE_SHARED_LIBRARY_LINK_D_FLAGS "") # +s, flag for exe link to use shared lib set(CMAKE_SHARED_LIBRARY_RUNTIME_D_FLAG "") # -rpath set(CMAKE_SHARED_LIBRARY_RUNTIME_D_FLAG_SEP "") # : or empty From 5f910c981f8c8761f191653681916489b4b3593b Mon Sep 17 00:00:00 2001 From: Dadoum Date: Sun, 31 Jul 2022 14:43:05 +0200 Subject: [PATCH 13/16] Add basic cross-compilation support (gdc only) --- cmake-d/CMakeDInformation.cmake | 2 +- .../{Darwin-dmd.cmake => Darwin-DigitalMars.cmake} | 0 .../{Darwin-ldc2.cmake => Darwin-LDC.cmake} | 0 .../{Linux-dmd.cmake => Linux-DigitalMars.cmake} | 0 .../Platform/{Linux-gdc.cmake => Linux-GNU.cmake} | 6 +++--- .../Platform/{Linux-ldc2.cmake => Linux-LDC.cmake} | 0 ...{Windows-dmd.cmake => Windows-DigitalMars.cmake} | 0 .../{Windows-gdc.cmake => Windows-GNU.cmake} | 0 cmake-d/UseDub.cmake | 13 ++++++++++--- 9 files changed, 14 insertions(+), 7 deletions(-) rename cmake-d/Platform/{Darwin-dmd.cmake => Darwin-DigitalMars.cmake} (100%) rename cmake-d/Platform/{Darwin-ldc2.cmake => Darwin-LDC.cmake} (100%) rename cmake-d/Platform/{Linux-dmd.cmake => Linux-DigitalMars.cmake} (100%) rename cmake-d/Platform/{Linux-gdc.cmake => Linux-GNU.cmake} (95%) rename cmake-d/Platform/{Linux-ldc2.cmake => Linux-LDC.cmake} (100%) rename cmake-d/Platform/{Windows-dmd.cmake => Windows-DigitalMars.cmake} (100%) rename cmake-d/Platform/{Windows-gdc.cmake => Windows-GNU.cmake} (100%) diff --git a/cmake-d/CMakeDInformation.cmake b/cmake-d/CMakeDInformation.cmake index 71c5624..867bf97 100644 --- a/cmake-d/CMakeDInformation.cmake +++ b/cmake-d/CMakeDInformation.cmake @@ -58,7 +58,7 @@ endif() # if no high specificity file was included, then try a more general one if(NOT _INCLUDED_FILE) - include(Platform/${CMAKE_SYSTEM_NAME}-${CMAKE_BASE_NAME} + include(Platform/${CMAKE_SYSTEM_NAME}-${CMAKE_D_COMPILER_ID} OPTIONAL RESULT_VARIABLE _INCLUDED_FILE) endif() diff --git a/cmake-d/Platform/Darwin-dmd.cmake b/cmake-d/Platform/Darwin-DigitalMars.cmake similarity index 100% rename from cmake-d/Platform/Darwin-dmd.cmake rename to cmake-d/Platform/Darwin-DigitalMars.cmake diff --git a/cmake-d/Platform/Darwin-ldc2.cmake b/cmake-d/Platform/Darwin-LDC.cmake similarity index 100% rename from cmake-d/Platform/Darwin-ldc2.cmake rename to cmake-d/Platform/Darwin-LDC.cmake diff --git a/cmake-d/Platform/Linux-dmd.cmake b/cmake-d/Platform/Linux-DigitalMars.cmake similarity index 100% rename from cmake-d/Platform/Linux-dmd.cmake rename to cmake-d/Platform/Linux-DigitalMars.cmake diff --git a/cmake-d/Platform/Linux-gdc.cmake b/cmake-d/Platform/Linux-GNU.cmake similarity index 95% rename from cmake-d/Platform/Linux-gdc.cmake rename to cmake-d/Platform/Linux-GNU.cmake index 727b8bb..8cd48bf 100644 --- a/cmake-d/Platform/Linux-gdc.cmake +++ b/cmake-d/Platform/Linux-GNU.cmake @@ -36,9 +36,9 @@ set(CMAKE_SHARED_LIBRARY_RUNTIME_D_FLAG "") # -rpath set(CMAKE_SHARED_LIBRARY_RUNTIME_D_FLAG_SEP "") # : or empty set(CMAKE_INCLUDE_FLAG_D "-I") # -I set(CMAKE_INCLUDE_FLAG_D_SEP "") # , or empty -set(CMAKE_LIBRARY_PATH_FLAG "-L-L") +set(CMAKE_LIBRARY_PATH_FLAG "-L") set(CMAKE_LIBRARY_PATH_TERMINATOR "") # for the Digital Mars D compiler the link paths have to be terminated with a "/" -set(CMAKE_LINK_LIBRARY_FLAG "-L-l") +set(CMAKE_LINK_LIBRARY_FLAG "-l") set(CMAKE_LINK_LIBRARY_SUFFIX "") set(CMAKE_STATIC_LIBRARY_PREFIX "lib") @@ -49,7 +49,7 @@ set(CMAKE_EXECUTABLE_SUFFIX "") # .exe set(CMAKE_DL_LIBS "dl") # SET(CMAKE_D_FLAGS_INIT "-fversion=Posix -fversion=${CMAKE_BUILD_TYPE}Build ${DSTDLIB_FLAGS}") -set(CMAKE_D_FLAGS_INIT "") +set(CMAKE_D_FLAGS_INIT "-fall-instantiations ") set(CMAKE_D_FLAGS_DEBUG_INIT "-g ${DDOC_FLAGS}") set(CMAKE_D_FLAGS_MINSIZEREL_INIT "-Os ${DDOC_FLAGS}") set(CMAKE_D_FLAGS_RELEASE_INIT "-O3 -fomit-frame-pointer -fweb -frelease -finline-functions ${DDOC_FLAGS}") diff --git a/cmake-d/Platform/Linux-ldc2.cmake b/cmake-d/Platform/Linux-LDC.cmake similarity index 100% rename from cmake-d/Platform/Linux-ldc2.cmake rename to cmake-d/Platform/Linux-LDC.cmake diff --git a/cmake-d/Platform/Windows-dmd.cmake b/cmake-d/Platform/Windows-DigitalMars.cmake similarity index 100% rename from cmake-d/Platform/Windows-dmd.cmake rename to cmake-d/Platform/Windows-DigitalMars.cmake diff --git a/cmake-d/Platform/Windows-gdc.cmake b/cmake-d/Platform/Windows-GNU.cmake similarity index 100% rename from cmake-d/Platform/Windows-gdc.cmake rename to cmake-d/Platform/Windows-GNU.cmake diff --git a/cmake-d/UseDub.cmake b/cmake-d/UseDub.cmake index 49e6471..1c70aa5 100644 --- a/cmake-d/UseDub.cmake +++ b/cmake-d/UseDub.cmake @@ -20,7 +20,14 @@ endif() set(DUB_REGISTRY "https://code.dlang.org/packages") file(MAKE_DIRECTORY ${DUB_DIRECTORY}/CMakeTmp) -if(NOT CMAKE_D_COMPILER) +if (CMAKE_CROSSCOMPILING) + # todo: change this + set(CMAKE_D_COMPILER_NATIVE gdc) +else() + set(CMAKE_D_COMPILER_NATIVE ${CMAKE_D_COMPILER}) +endif() + +if(NOT CMAKE_D_COMPILER_NATIVE) message(FATAL_ERROR "UseDub needs a D compiler or use it in a D project.") endif() @@ -33,7 +40,7 @@ if(NOT EXISTS ${DUB_DIRECTORY}/CMakeTmp/DubUrl) PATHS ${CMAKE_ROOT}/Modules ${CMAKE_MODULE_PATH} NO_DEFAULT_PATH PATH_SUFFIXES "UseDub") get_filename_component(SEMVER_PATH ${SEMVER_SRC} PATH) - execute_process(COMMAND ${CMAKE_D_COMPILER} -I${SEMVER_PATH} ${DUB_GET_PACKAGE_URL_D_SRC} ${SEMVER_SRC} + execute_process(COMMAND ${CMAKE_D_COMPILER_NATIVE} -I${SEMVER_PATH} ${DUB_GET_PACKAGE_URL_D_SRC} ${SEMVER_SRC} ${CMAKE_D_DASH_O}DubUrl WORKING_DIRECTORY ${DUB_DIRECTORY}/CMakeTmp) unset(DUB_GET_PACKAGE_URL_D_SRC CACHE) endif() @@ -41,7 +48,7 @@ if(NOT EXISTS ${DUB_DIRECTORY}/CMakeTmp/DubToCMake) find_file(DUB_PACKAGE_TO_CMAKE_D_SRC "DubToCMake.d" PATHS ${CMAKE_ROOT}/Modules ${CMAKE_MODULE_PATH} NO_DEFAULT_PATH PATH_SUFFIXES "UseDub") - execute_process(COMMAND ${CMAKE_D_COMPILER} ${DUB_PACKAGE_TO_CMAKE_D_SRC} ${CMAKE_D_DASH_O}DubToCMake + execute_process(COMMAND ${CMAKE_D_COMPILER_NATIVE} ${DUB_PACKAGE_TO_CMAKE_D_SRC} ${CMAKE_D_DASH_O}DubToCMake WORKING_DIRECTORY ${DUB_DIRECTORY}/CMakeTmp) unset(DUB_PACKAGE_TO_CMAKE_D_SRC CACHE) endif() From aac0bac6bf64a48661c778ab9d8f98a9fab8a333 Mon Sep 17 00:00:00 2001 From: Dadoum Date: Sun, 31 Jul 2022 15:01:25 +0200 Subject: [PATCH 14/16] Fix compilation in old D versions --- cmake-d/UseDub/DubToCMake.d | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/cmake-d/UseDub/DubToCMake.d b/cmake-d/UseDub/DubToCMake.d index f452858..fc23040 100644 --- a/cmake-d/UseDub/DubToCMake.d +++ b/cmake-d/UseDub/DubToCMake.d @@ -91,7 +91,7 @@ string includePackage(JSONValue dubRoot, JSONValue root) { bool isInterface = false; string normalizedPath(string path) { - return asNormalizedPath(root["path"].str.asRelativePath(getcwd).array ~ "/" ~ path).array; + return cast(string) asNormalizedPath(root["path"].str.asRelativePath(getcwd).array ~ "/" ~ path).array; } cmake ~= format!"set(SRC_FILES %-(%s %))"( From cb455cf3d818d6e6c41c3614d29cdd9a0793c711 Mon Sep 17 00:00:00 2001 From: Dadoum Date: Thu, 29 Sep 2022 21:03:39 +0200 Subject: [PATCH 15/16] Interface version fix --- cmake-d/CMakeDInformation.cmake | 12 +++++++++--- 1 file changed, 9 insertions(+), 3 deletions(-) diff --git a/cmake-d/CMakeDInformation.cmake b/cmake-d/CMakeDInformation.cmake index 867bf97..d1aef18 100644 --- a/cmake-d/CMakeDInformation.cmake +++ b/cmake-d/CMakeDInformation.cmake @@ -291,7 +291,13 @@ function(target_compile_versions target) list(TRANSFORM CMAKE_D_COMPILE_VERSIONS_PUBLIC PREPEND "${CMAKE_D_VERSION_FLAG}") list(TRANSFORM CMAKE_D_COMPILE_VERSIONS_PRIVATE PREPEND "${CMAKE_D_VERSION_FLAG}") list(TRANSFORM CMAKE_D_COMPILE_VERSIONS_INTERFACE PREPEND "${CMAKE_D_VERSION_FLAG}") - target_compile_options(${target} PUBLIC "$<$:${CMAKE_D_COMPILE_VERSIONS_PUBLIC}>") - target_compile_options(${target} PRIVATE "$<$:${CMAKE_D_COMPILE_VERSIONS_PRIVATE}>") - target_compile_options(${target} INTERFACE "$<$:${CMAKE_D_COMPILE_VERSIONS_INTERFACE}>") + if (CMAKE_D_COMPILE_VERSIONS_PUBLIC) + target_compile_options(${target} PUBLIC "$<$:${CMAKE_D_COMPILE_VERSIONS_PUBLIC}>") + endif() + if (CMAKE_D_COMPILE_VERSIONS_PRIVATE) + target_compile_options(${target} PRIVATE "$<$:${CMAKE_D_COMPILE_VERSIONS_PRIVATE}>") + endif() + if (CMAKE_D_COMPILE_VERSIONS_INTERFACE) + target_compile_options(${target} INTERFACE "$<$:${CMAKE_D_COMPILE_VERSIONS_INTERFACE}>") + endif() endfunction() From d786867f671057d2185a9a6b139018a7db8aa1e3 Mon Sep 17 00:00:00 2001 From: Dadoum Date: Fri, 9 Jun 2023 11:56:39 +0200 Subject: [PATCH 16/16] Support subconfigurations --- cmake-d/UseDub/DubToCMake.d | 14 ++++++-------- 1 file changed, 6 insertions(+), 8 deletions(-) diff --git a/cmake-d/UseDub/DubToCMake.d b/cmake-d/UseDub/DubToCMake.d index fc23040..fbea2e3 100644 --- a/cmake-d/UseDub/DubToCMake.d +++ b/cmake-d/UseDub/DubToCMake.d @@ -28,8 +28,9 @@ int main(string[] args) if (!configuration.empty) configurationArg = ["-c", configuration]; - else + else { configurationArg = []; + } if (subPackage.canFind(':')) { subPackage = ":" ~ subPackage.split(':')[1]; @@ -185,13 +186,10 @@ install(TARGETS %s cmake = includePackage(newDubRoot, pkg) ~ cmake; } else { - try { - auto pkg = dubRoot["packages"].array.find!((obj) => obj["name"] == dependency)[0]; - string version_ = pkg["version"].str; - cmake ~= "DubProject_Add(%s %s)\n".format(dependency.str, version_); - } catch (Throwable) { - cmake ~= "DubProject_Add(%s)\n".format(dependency.str); - } + auto pkg = dubRoot["packages"].array.find!((obj) => obj["name"] == dependency)[0]; + string version_ = pkg["version"].str; + string configuration = pkg["configuration"].str; + cmake ~= "DubProject_Add(%s %s %s)\n".format(dependency.str, version_, configuration); } }