Browse Source

CMake: Allow custom header names for BinaryData targets

This change helps to avoid ambiguity in includes when building projects
which contain more than one "BinaryData.h".
tags/2021-05-28
reuk 5 years ago
parent
commit
0a2e4191b3
3 changed files with 39 additions and 27 deletions
  1. +13
    -5
      examples/CMake/readme.md
  2. +16
    -6
      extras/Build/CMake/JUCEUtils.cmake
  3. +10
    -16
      extras/Build/juceaide/Main.cpp

+ 13
- 5
examples/CMake/readme.md View File

@@ -418,17 +418,25 @@ attributes directly to these creation functions, rather than adding them later.

```
juce_add_binary_data(<name>
[HEADER_NAME ...]
[NAMESPACE ...]
SOURCES ...)
```

Create a static library that embeds the contents of the files passed as arguments to this function.
Adds a library target called `<name>` which can be linked into other targets using
`target_link_libraries`. The `NAMESPACE` argument is optional. If not provided, the generated files
will use the default namespace `BinaryData`. Each of the files located at the paths following
`SOURCES` will be encoded and embedded in the resulting static library. This library can be linked
as normal using `target_link_libraries(<otherTarget> PRIVATE <name>)`, and the header can be
included using `#include <BinaryData.h>`.
`target_link_libraries`.

The `HEADER_NAME` argument is optional. If provided, the generated header will be given the
requested name, otherwise the generated header will be named "BinaryData.h". In completely new
projects, you should provide a unique name here, so that projects containing more than one binary
data target are able to include the binary data headers without ambiguity.

The `NAMESPACE` argument is also optional. If not provided, the generated files will use the default
namespace `BinaryData`. Each of the files located at the paths following `SOURCES` will be encoded
and embedded in the resulting static library. This library can be linked as normal using
`target_link_libraries(<otherTarget> PRIVATE <name>)`, and the header can be included using
`#include <BinaryData.h>`.

### `juce_add_bundle_resources_directory`



+ 16
- 6
extras/Build/CMake/JUCEUtils.cmake View File

@@ -694,7 +694,7 @@ endfunction()
# ==================================================================================================

function(juce_add_binary_data target)
set(one_value_args NAMESPACE)
set(one_value_args NAMESPACE HEADER_NAME)
set(multi_value_args SOURCES)
cmake_parse_arguments(JUCE_ARG "" "${one_value_args}" "${multi_value_args}" ${ARGN})

@@ -716,19 +716,27 @@ function(juce_add_binary_data target)

file(MAKE_DIRECTORY ${juce_binary_data_folder})

if(JUCE_ARG_NAMESPACE)
set(namespace_opt --namespace=${JUCE_ARG_NAMESPACE})
if(NOT JUCE_ARG_NAMESPACE)
set(JUCE_ARG_NAMESPACE BinaryData)
endif()

if(NOT JUCE_ARG_HEADER_NAME)
set(JUCE_ARG_HEADER_NAME BinaryData.h)
endif()

add_custom_command(OUTPUT ${binary_file_names}
COMMAND juce::juceaide binarydata ${namespace_opt} ${juce_binary_data_folder} ${JUCE_ARG_SOURCES}
COMMAND juce::juceaide binarydata "${JUCE_ARG_NAMESPACE}" "${JUCE_ARG_HEADER_NAME}"
${juce_binary_data_folder} ${JUCE_ARG_SOURCES}
WORKING_DIRECTORY ${CMAKE_CURRENT_LIST_DIR}
VERBATIM)

target_sources(${target} PRIVATE "${binary_file_names}")
target_compile_definitions(${target} INTERFACE JUCE_TARGET_HAS_BINARY_DATA=1)
target_include_directories(${target} INTERFACE ${juce_binary_data_folder})
target_compile_features(${target} PRIVATE cxx_std_11)

if(JUCE_ARG_HEADER_NAME STREQUAL "BinaryData.h")
target_compile_definitions(${target} INTERFACE JUCE_TARGET_HAS_BINARY_DATA=1)
endif()
endfunction()

# ==================================================================================================
@@ -805,8 +813,10 @@ function(juce_generate_juce_header target)

set(defs_file $<GENEX_EVAL:$<TARGET_PROPERTY:${target},JUCE_DEFS_FILE>>)

set(extra_args)

add_custom_command(OUTPUT "${juce_header}"
COMMAND juce::juceaide header "${defs_file}" "${juce_header}"
COMMAND juce::juceaide header "${defs_file}" "${juce_header}" ${extra_args}
DEPENDS "${defs_file}"
VERBATIM)
endfunction()


+ 10
- 16
extras/Build/juceaide/Main.cpp View File

@@ -40,7 +40,7 @@ constexpr auto headerTemplate = R"(/*
${JUCE_INCLUDES}
#if JUCE_TARGET_HAS_BINARY_DATA
#include "BinaryData.h"
#include "BinaryData.h"
#endif
#if ! DONT_SET_USING_JUCE_NAMESPACE
@@ -60,30 +60,24 @@ namespace ProjectInfo
#endif
)";
juce::String getValueOr (juce::ArgumentList& args, juce::String option, juce::String fallback)
int writeBinaryData (juce::ArgumentList&& args)
{
const auto opt = args.removeValueForOption (option);
return opt.isNotEmpty() ? opt : fallback;
}
args.checkMinNumArguments (3);
const auto namespaceName = args.arguments.removeAndReturn (0);
const auto headerName = args.arguments.removeAndReturn (0);
const auto outFolder = args.arguments.removeAndReturn (0).resolveAsExistingFolder();
int writeBinaryData (juce::ArgumentList&& argumentList)
{
juce::build_tools::ResourceFile resourceFile;
resourceFile.setClassName (getValueOr (argumentList, "--namespace", "BinaryData"));
const auto lineEndings = argumentList.removeOptionIfFound ("--windows") ? "\r\n" : "\n";
if (argumentList.arguments.isEmpty())
juce::ConsoleApplication::fail ("No destination folder specified for binary data files", 1);
const auto outFolder = argumentList.arguments.removeAndReturn (0).resolveAsExistingFolder();
resourceFile.setClassName (namespaceName.text);
const auto lineEndings = args.removeOptionIfFound ("--windows") ? "\r\n" : "\n";
for (const auto& arg : argumentList.arguments)
for (const auto& arg : args.arguments)
resourceFile.addFile (arg.resolveAsExistingFile());
const auto result = resourceFile.write (0,
lineEndings,
outFolder.getChildFile ("./BinaryData.h"),
outFolder.getChildFile (headerName.text),
[&outFolder] (int index)
{
return outFolder.getChildFile ("./BinaryData" + juce::String { index + 1 } + ".cpp");


Loading…
Cancel
Save